🚴

Deno v2.0 が発表されたので入門してみる

2024/10/10に公開

はじめに

先日 Deno v.2.0 がリリースされました。それに伴い Zenn や X などで Deno に関する様々な記事や発信が投稿され、現在非常にホットです。それらを見て、私もこれを機に Deno を触ってみようと思い立ちこの記事を書いています。まずは入門編ということで、インストールやプロジェクトのセットアップ、Deno CLI の使い方などを見ていこうと思います。

以下のドキュメントに沿って進めていきます。

https://docs.deno.com

インストール

  • Mac
curl -fsSL https://deno.land/install.sh | sh
# or
brew install deno
  • Windows
irm https://deno.land/install.ps1 | iex
# or
scoop install deno
# or
choco install deno
# or
winget install DenoLand.Deno
  • Linux
curl -fsSL https://deno.land/install.sh | sh
# or
nix-shell -p deno

Mac, Windos, Linux の全ての環境でcargoを使ってインストールを行うこともできます。

cargo install deno --locked

すでに Deno をインストールしている方はdeno upgradeコマンドを実行することで最新のバージョンを使用できるようになります。(2024.10.10時点の実行結果👇)

% deno upgrade
Current Deno version: v2.0.0
Looking up stable version

Local deno version 2.0.0 is the most recent release

プロジェクトのセットアップ

以下のコマンドで簡単に Deno プロジェクトのセットアップを行うことができます。

deno init my_project

実行の結果、以下の構造を持つプロジェクトが作成されます。

my_project
├── deno.json
├── main_test.ts
└── main.ts

早速、コードを実行してみましょう。コードの実行はdeno main.tsもしくはdeno run main.tsで行えます。Deno は TypeScript がネイティブサポートされているので、.ts ファイルをそのまま実行できます。便利ですね。

cd my_project
deno main.ts
# Add 2 + 3 = 5

Deno で最初のプログラムを実行させることができました。

さらに、プロジェクトにはテストコードが書かれたファイルも含まれているので、テストも行ってみましょう。テストはdeno testコマンドで実行できます。

deno test
running 1 test from ./main_test.ts     
addTest ... ok (1ms)

ok | 1 passed | 0 failed (3ms)

これでプロジェクトのセットアップと簡単な動作の確認ができました。

Deno CLI

Deno の CLI は、スクリプトの実行、依存関係の管理、さらにはコードを実行ファイルにコンパイルするなど様々な機能を実現するコマンドやオプションを提供しています。利用可能な全てのコマンドやオプションは deno helpdeno -h (--help)コマンドで確認できます。

コマンドライン引数の受け渡し

プログラム起動時に、ファイル名の後にコマンドライン引数を渡します。

$ deno main.ts arg1 arg2 arg3

これを受け取って出力するプログラムは以下のようになります。コマンドライン引数は文字列の配列として扱われます。

console.log(Deno.args) // ["arg1", "arg2", "arg3"]

引数とフラグの順番に注意する

ファイル名の後に書かれたものは全てコマンドライン引数として見なされるため順番には注意が必要です。コマンドのオプションとしてフラグを渡したつもりが、コマンドライン引数として実行されていたということにならないようにしましょう。

# ⭕️ --allow-net オプションがついた状態で net_client.ts が実行される
$ deno run --allow-net net_client.ts
# ❌ --allow-net が Deno.args に渡される
$ deno run net_client.ts --allow-net

よく使われる flag たち

Watch mode:--watch

deno run --watch main.tsのようにすることで、ソースファイルに変更が検出されるたびに、アプリケーションの自動再読み込みを可能にできます。手動でアプリケーションを再起動することなく、変更の効果をすぐに確認できるため、開発中は特に便利です。

deno run, deno test, deno compile, deno fmtコマンドに対して有効です。ただし、それぞれのコマンドによって監視対象となるファイルに違いがあります。

  • deno run, deno test, deno compile:エントリーポイントとなるファイルと、そのファイルが静的にインポートする全てのローカルファイルが対象
  • deno fmt:コマンドライン引数として渡された全てのローカルファイルおよびディレクトリ。もし引数としてファイル・ディレクトリの指定がなければワーキングディレクトリが対象
deno run --watch main.ts
deno test --watch
deno fmt --watch

個人的には、deno fmt --watchがとても便利だと感じました。使い方としては、一つのターミナルでdeno fmt --watchを走らせておいて、別のターミナルでdeno run --watch main.tsなどの別のコマンドを実行させておくという感じになるかと思います。これにより、一定間隔(デフォルトではおそらく 1000ms ぐらい)でフォーマットが効いた状態にコードを保ちながらコーディングができるようになります。

特定のファイルを監視対象から除外したい場合は、--watch-excludeで指定ができます。

deno run --watch --watch-exclude=file1.ts,file2.ts main.ts

ワイルドカードを用いて指定する場合は、パスをダブルクオーテーションもしくはシングルクオーテーションで囲む必要があります。

deno run --watch --watch-exclude='*.js' main.ts

Hot Module Replacement mode:--watch-hmr

deno runコマンドに対して--watch-hmrフラグを付与することで HMR 機能を ON にすることができます。HMR モードで起動された場合、ファイルの変更が検出されるとプログラムを再起動するのではなく、モジュールを置き換える形で更新が行われます。ここが--watchとの違いになります。置き換えによる更新が失敗した場合はプログラムが再起動されます。

型チェック:check

プログラムを実行することなく型チェックを行えます。

deno check main.ts

または、型チェックを行った後にプログラムを実行することもできます。

deno run --check main.ts

型エラーに関してはエディター上でも確認することはできますが、コードが大規模になると全てを目視でチェックするのは大変なのでこの機能も便利そうですね。

おわりに

ここまで読んでいただきありがとうございます。
個人的には、今回扱った部分だけでも「こんな便利な機能がデフォルトで付いているんだ!」という驚きがいくつかありました。Deno はもともと node との互換性という点では他のランタイムよりも優れているとされていますが、v2.0 でさらにアップデートも入り、今がまさに広く使われ始めるタイミングなのかなと思っています。

今後はさらに Deno の深い部分もキャッチアップしつつ、学びの記録として記事にもしていこうと思っていますので興味があれば読んでいただけると嬉しいです。

Discussion