- 山本竜玄
- 約 3,700 文字
- 1,500 View
本記事はVue.js連載5本目の記事です。
はじめに
HealthCare Innovation Group(HIG)所属の山本です。
Vue.jsは素晴らしいフロントエンドのフレームワークとして、世界中で広く使用されています。公式ドキュメントでも非常に整っておりインストール手順やチュートリアルについて記載されていますが、Node.jsを利用することが前提となっているものが多いです。
実際に私が関わったVue.jsを使用したプロジェクトでも、Node.jsおよびnpmを使用しており、かなり一般的な選択肢ではないかと感じています。
そんな中、Node.jsに替わるJavaScriptランタイムとして新たに注目を集めているのがDenoです。2024年にはDeno v2がリリースされ、フォーマットやテストなどなどのDenoの機能の改善以外にも、Node.jsおよびnpmとの下位互換性を取り入れたことがとても大きな変更としてあります。
この記事では、Deno v2とVue.jsを組み合わせた公式チュートリアルの実施を通して、2024年冬時点での現状や特徴について解説していきます。
Denoについて
JavaScript実行環境のNode.jsの開発者であるRyan Dahlが2018年に発表した、JavaScript/TypeScript実行環境がDenoです。
Node.jsの設計上の問題点を解決するために0から作り直されたことが特徴です。
実際に、JSConf 2018にて「Node.jsに関する10の反省点」としてRyan Dahl自身が登壇し、以下のようなことを述べています。
https://www.youtube.com/watch?v=M3BM9TB-8yA
- Promiseを使い続けなかったため、Nodeの非同期APIに課題があること
- セキュリティ設計について。例えばlinterのnetworkフルアクセスなど
- ビルドシステム(GYP)を継続使用したこと
- package.jsonの存在、肥大化について
- node_modulesの存在、モジュール解決アルゴリズムの複雑化について
- require(“module”)で.jsの拡張子なしで読み込み可能としたこと
- index.jsの存在、モジュール読み込みが複雑化したこと
これらの設計に関する課題について述べたあと、Ryan Dahlはまだまだプロダクトレベルであることを前置きしたうえで、新しく開発したDenoを紹介しています。
そこからときが経ち2024年、Deno v2のリリースが発表されました。
Denoの設計思想に基づき、ネイティブのTypeScriptのサポート、Promiseなどのサポート、組み込みのフォーマッタや型チェック、セキュリティの考慮などが特徴である他、v2からはNode.jsおよびnpmの下位互換性が追加されています。
Deno × Vue.jsについて
ここからは、実際にDeno × Vue.jsでアプリ構築を実際に試していきます。
記事執筆時点では、公式ドキュメントのチュートリアルとして以下があるので、その手順に従っていきます。
https://docs.deno.com/runtime/tutorials/how_to_with_npm/vue/
1. インストール
Deno自体のインストールについては、下記のドキュメントに従います。
https://docs.deno.com/runtime/getting_started/installation/
curl -fsSL https://deno.land/install.sh | sh |
シェルスクリプトの一発でインストールできてお手軽ですね。記事執筆時点では、v2.1.2がインストールされました。
Denoのインストール後、以下のコマンドでプロジェクトのセットアップを進めます。
deno run -A npm:create-vite |
フレームワークの選択が求められるので、Vueを選択します。
❯ deno run -A npm:create-vite |
こちらも選択が求められますが、せっかくなので、DenoのネイティブのTypeScriptのサポートを確認するために、TypeScriptを選択します。
TypeScriptがネイティブでサポートされているため、トランスパイル設定などの手間が不要なのが嬉しいポイントです。
❯ deno run -A npm:create-vite |
次に、プロジェクトフォルダに移動して依存関係のインストールを行います。
deno install |
これでインストールは完了です。deno installの実行時点で、node_modulesフォルダが作成されます。
フォルダの内容としては以下のようになっています。
node_modules/ |
npm installなどのコマンドを実行することなく、npmレジストリよりパッケージをインストールできていますね。
ここまででテンプレートは作成できており、以下のコマンドでアプリ起動ができます。
deno task dev |
2. バックエンドの追加
ここからもチュートリアあるに従っていきます。以下コマンドで、バックエンドに必要なものを追加していきます。
deno add jsr:@oak/oak jsr:@tajpouria/cors |
構成としては、プロジェクト配下にapiフォルダを作成して、以下2つのファイルを作成します。
- main.ts
- data.json
import { Application, Router } from "@oak/oak"; |
サンプルの量が多かったので一部抜粋しますが、以下のようなjsonファイルを作成します。
[ |
これで恐竜のデータを取得するバックエンドapiの構築は完了です。以下のコマンドでサーバーを起動できます。
deno run --allow-env --allow-net api/main.ts |
起動できると、例えばlocalhost:8000/dinosaurs/Aardonyxへのアクセスで以下のようなレスポンスが帰ってくることが確認できます。
{name: "Aardonyx", description: "An early stage in the evolution of sauropods."} |
ここまでで無事にバックエンドサーバーの構築・起動までチュートリアルで確認できました。
先程実行した、起動コマンドについてですが起動時に与えている引数がDenoの大きな特徴の1つです。
デフォルトではホストマシンまたはネットワークへのアクセス権限は最小限にする思想ですね。
これらの明示的に与えられるPermissionについては以下のようなものがあります。
- –allow-read : ファイルの読み取りアクセス
- –allow-write : ファイルシステムの書き込みアクセス
- –allow-net : ネットワークアクセス
- –allow-env : 環境変数へのアクセス
- –allow-run : サブプロセスの実行
deno run --allow-env --allow-net api/main.ts |
例えば上記のコマンドでは、--allow-envでは環境変数へのアクセス権、--allow-netではネットワークアクセスの許可をapi/main.tsに与えるように指定しています。
試しにネットワークアクセスを許可しないまま起動しようとすると、以下のようにエラーが発生します。
❯ deno run api/main.ts |
別の例としては、先程の実装ではimportでdata.jsonを読み込んでいたため、--allow-readの権限許可は必要としていませんでした。
以下のように読み込み部分を変更してみましょう。
- import data from "./data.json" with { type: "json" }; |
再度同様にサーバー起動をしてみようとしましたが、以下のエラーにより弾かれてしまいました。
❯ deno run --allow-env --allow-net api/main.ts |
このように、デフォルトで安全性が確保されているのは嬉しいポイントですね。
3. フロントエンドの構築
Vue Routerモジュールを以下のように追加します。
deno add npm:vue-router |
チュートリアルでは、このあといくつかのファイルを実装することになります。対象としては、以下の7ファイルです。
├── src |
実際の内容の紹介です。 main.tsとindex.tsでは以下のようにルーターを実装しています。
import { createApp } from "vue"; |
import { createRouter, createWebHistory } from "vue-router"; |
App.vueの内容について、以下のようにします。
<template> |
あとはコンポーネントたちを以下のように実装します。
<script setup lang="ts"> |
<script lang="ts"> |
<script lang="ts"> |
ここまででフロントエンド側の実装も完了です。以下のコマンドにて、フロントエンド側のサーバーが起動できます。
deno run -A npm:vite |
これでチュートリアルは完了です!
今回のチュートリアルでは、Vueの構築についてはNode.jsおよびnpmの下位互換性を活用する形で行われていました。
npmを用いない形で利用できる候補として、以下のリポジトリでは「vno」としてライブラリ開発がされていましたが、3年前ほどでコミットが途絶えているようです。。
https://github.com/open-source-labs/vno
まとめ
この記事では、Deno v2の簡単な紹介と、Vue.jsアプリの構築のチュートリアルを触ってみました。
TypeScriptのネイティブサポートや、セキュリティの概念など優れた特徴があり、Node.jsおよびnpmとの下位互換性についてもサポートされるものが増えてきています。
そのため、TypeScriptを使用したアプリケーション開発には優れた体験ができそうだと感じました。また、フロントエンドについても本体機能・ライブラリの様々な開発が進んでいるようです!
チュートリアル以上のアプリ構築についても、試してみたいと感じた2024年の冬でした。