はじめに

Deno v2.3がリリースされました。

この記事では主な変更点などについて解説します。

v2.3のRCバージョンでの変更内容に関しては以下を参照いただければと思います:

また、Deno v2.3に関する公式ブログではすでに実装されていたnpmパッケージへのパッチ機能vsockのサポートなどについても正式にアナウンスされています。

deno.lock v5

deno.lockのv5 ("version": "5")がデフォルトで有効化されました。

今後、deno.lockが新しく作成される際はv5がデフォルトで有効化されます。

deno add

--npm--jsrオプションがサポート

deno adddeno installコマンドで--npm--jsrオプションがサポートされています (#28666)

複数のJSRまたはnpmパッケージをまとめて追加する際の記述を若干簡略化できます:

# `jsr:@std/uuid`と`jsr:@std/ulid`を追加
$ deno add --jsr @std/uuid @std/ulid

# `npm:koa`を追加
$ deno add --npm koa

# `--jsr`オプションを指定した状態でnpmパッケージをインストールする場合、`npm:`を明示する必要があります
$ deno add --jsr @std/uuid @std/ulid npm:koa

deno check

引数なしでのdeno checkがサポート

deno checkを引数なしで実行した際に、deno check .と同等の振る舞いをするよう改善されています (#28655)

tsconfig.jsonの自動検出

deno.jsonもしくはpackage.jsonがある際は、tsconfig.jsonが自動で検出されるよう改善されています (#29092)

deno.jsoncompilerOptionsが定義されている際はこの検出機能は無効化されます。

compilerOptions.erasableSyntaxOnlyのサポート

後述するTypeScript v5.8へのアップデートに合わせて、compilerOptions.erasableSyntaxOnlyがサポートされています (#29097)

deno compile

FFIとNode.jsネイティブアドオン (.node)のサポート

deno compileでFFIやNode.jsネイティブアドオンを利用したコードに対する実行可能ファイルの作成がサポートされました (#28934)

現状では、v2.1deno compileに追加されたV8コードキャッシュへのサポートと同様に、/tmpディレクトリに共有ライブラリやNode.jsアドオンを書き込むことで実現されているようです。そのため、一部シナリオにおいてはうまく動作しないことも考えられるようです。この点に関しては、今後、改善が検討されているようです (#28918)

--excludeがサポート

deno compileコマンドに--excludeオプションが追加されています (#28805)

--includeオプションとの併用が想定されており、実行可能ファイルに埋め込むディレクトリから特定のファイルを除外したい場合に使用します:

# `./data/test.txt`と`./data/dummy.txt`の埋め込みを無効化します
$ deno compile --include ./data --exclude ./data/test.txt --exclude ./data/dummy.txt main.js

Explicit Resource Managementのサポート

deno compileによって生成された実行可能ファイルでExplicit Resource Managementが動作するよう改善されています (#29084)

deno fmt

Tagged template内のHTML/CSS/SQLのフォーマットがサポート

deno fmtコマンドがtagged template内のHTMLやCSS, SQLなどをフォーマットしてくれるよう改善されています (#29014)

SQLのフォーマットについてはまだ実験的サポートの段階であるため、使用する場合は場合は--unstable-sqlの指定が必要です。

例えば、以下のようなコードがあったとします:

sql`
SELECT
    *
FROM
   users;
`;

deno fmt --unstable-sqlを実行すると、以下のようにフォーマットされます:

sql`
  SELECT
    *
  FROM
    users;
`;

dprint-plugin-typescriptのオプションの追加

dprint-plugin-typescriptで提供される以下のオプションがサポートされました (https://dprint.dev/plugins/typescript/config/)

  • quoteProps
  • useBraces
  • bracePosition
  • singleBodyPosition
  • nextControlFlowPosition
  • trailingCommas
  • operatorPosition
  • jsx.bracketPosition
  • jsx.forceNewLinesSurroundingContent
  • jsx.multiLineParens
  • typeLiteral.separatorKind
  • spaceAround
  • spaceSurroundingProperties

これらのオプションはdeno.jsonfmt配下で設定可能です (#28946)

--permit-no-filesのサポート

deno fmt--permit-no-filesオプションがサポートされています。

このオプションを指定すると、フォーマット対象のファイルが一つも見つからない場合でもエラーが発生しなくなります。

deno lint

--permit-no-filesのサポート

deno lintでも--permit-no-filesオプションがサポートされています。挙動はdeno fmtの同名オプションと同様です。

deno coverage

deno test --coverageの挙動が変更

deno test --coverageコマンドがカバレッジレポートの生成も行うよう挙動が変更されています (今までは、別途、deno coverageコマンドの実行が必要でした)

以前のバージョンまでの挙動に戻すには--coverage-raw-data-onlyの指定が必要です。

DENO_COVERAGE_DIR

DENO_COVERAGE_DIR環境変数が追加されています (#28291)

この環境変数を設定しておくと、deno testコマンドが指定したディレクトリへカバレッジを保存します (deno test --coverageと同様の挙動をします)

// deno-coverage-ignoreコメント

カバレッジの収集を制御するための特殊コメントがサポートされています (#26590)

コメント説明
// deno-coverage-ignore次の行が集計対象から除外されます
// deno-coverage-ignore-start// deno-coverage-ignore-stopそれぞれのコメントで囲まれた範囲が集計対象から除外されます
// deno-coverage-ignore-file宣言されたファイルは集計対象から除外されます

deno lsp

deno jupyter使用時の振る舞いの改善

各セル間で変数や型定義、依存モジュールの宣言などが共有されるよう挙動が改善されています (#28769)

Import Mapsでマッピングされたモジュールに対するAuto importの挙動が変更

Import Mapsでマッピングされたモジュールに対してAuto importを適用する際に、相対パス形式でimportが挿入されるよう挙動が変更されています (#29098)

バグ修正

Deno 2.2.7から発生していた型チェックに関する問題や意図せぬ箇所に対して診断が報告される問題などが修正されています (#29061, #29019)

deno serve

DENO_SERVE_ADDRESS

DENO_SERVE_ADDRESS環境変数がサポートされています。

deno serveコマンドがデフォルトで利用するアドレスを設定できます:

# `127.0.0.1:3000`でHTTPサーバーを起動します
$ DENO_SERVE_ADDRESS=tcp:127.0.0.1:3000 deno serve main.js

unix:から始まるアドレスを指定することでUNIXドメインソケットを、vsock:から始まるアドレスを指定することでvsockを使用することも可能です。

--openオプションのサポート

deno serveコマンドに--openオプションが追加されています (#25340)

このオプションを指定すると、Denoが自動でブラウザーを開いてくれます

deno clean

--exceptがサポート

deno cleanコマンドで--exceptオプションがサポートされています (#28424)

このオプションが指定された場合、グローバルキャッシュ (DENO_DIR) を削除する際に、指定したエントリーポイントの実行において必要とされるファイルのみは削除せずに保持してくれます:

# `npm:koa`の実行に必要なファイルは維持する
$ deno clean --except npm:koa

# `jsr:@std/uuid`の実行に必要なファイルは維持する
$ deno clean --except jsr:@std/uuid

また、--dry-runオプションも追加されており、deno cleanによって削除される予定のファイルを確認することができます:

$ deno clean --dry-run --except jsr:@std/uuid

deno info

Denoのバージョンが追加

deno infoコマンドの出力にDenoのバージョン (denoVersion) が含まれるよう改善されました:

$ deno info --json | jq .denoVersion
"2.3.1"

Deno API

Deno.connect()AbortSignalがサポート

signalオプションにAbortSignalを指定することで、コネクション接続時のタイムアウトの制御などができます (#27113)

Deno.build.standalone

Deno.build.standaloneが追加されています (#28750)

deno compileによって生成された実行可能ファイルである場合のみtrueが設定されます。

Deno.createHttpClientlocalAddressオプションがサポート

このオプションを設定することで、fetch()の利用時に使用されるローカルIPアドレスを選択できます (#28781)

Deno.webgpu

Deno.webgpuが追加されています (#28192)

今のところdeviceStartCapturedeviceStopCaptureの2つのAPIが提供されています (利用には--unstable-webgpuの指定が必要です)

CLI

--allow-envの挙動の改善

セキュリティ改善

--deny-envが指定された際はDeno.env.toObject()の実行が拒否されるよう挙動が改善されています (#29079)

また、アクセスが許可されていない環境変数をprocess.envから読んだ際に、undefinedを返すのではなくDeno.errors.NotCapablethrowするよう挙動が変更されています (#28280)

NO_COLOR/FORCE_COLORに関する挙動の変更

NO_COLORFORCE_COLOR環境変数を--allow-envなしで読み込めるよう挙動が修正されています (#29090, #28280)

DENO_CACHE_DB_MODE/DENO_KV_DB_MODE環境変数がサポート

Web Cache APIとDeno KVにおいてSQLiteに関する挙動を制御するためのDENO_CACHE_DB_MODE/DENO_KV_DB_MODE環境変数が追加されています (#29026)

これらの環境変数にはdiskまたはmemoryのいずれかを指定可能です (デフォルトはdisk)

memoryを指定した場合、インメモリデーターベース (:memory:)の使用が強制されます。テストコードなどにおいて役立ちそうです。

DENO_EMIT_CACHE_MODE環境変数

DENO_EMIT_CACHE_MODE環境変数が追加されています (#29025)

サポートされている値はnormal (デフォルト)もしくはdisableのいずれかで、disableを指定することで、トランスパイルされたコードのファイルシステムへのキャッシュを無効化できます。

--v8-flags=--single-threaded

--v8-flags=--single-threadedがサポートされています (#29066)

これを指定すると、V8が単一のスレッドのみを使用してタスクを処理するよう挙動が変更されます。単純なスクリプトにおいての使用が想定されているようです。

Windows向けの実行可能ファイルへのコード署名

Windows向けのDenoの実行可能ファイルにコード署名が適用されています (#28963)

Denoの公式ブログによると、この変更によってWindows DefenderからDenoの実行可能ファイルが信頼されるよう改善されるとのことです。

Node.js互換性の改善

node:sqlite

DatabaseSync#loadExtensionが実装されています (#29050)

このAPIを利用するには--allow-ffiの指定が必要です。

node:http

HTTPサーバーのパフォーマンス改善が実施されています。

ServerResponse#endの不要な呼び出しの削減 (#29069)やAbortSignalの取り扱いの改善 (#29071)が実施されています。

node:assert

assert.deepStrictEqual(0, -0)が等価と判定されてしまう問題が修正されています (#29060)

node:fs

readFile()においてsignalオプションがサポートされています (#29028)

node:dns

ttlオプションのサポートが追加されています (#27676)

TypeScript v5.8

Denoに搭載されたTypeScriptがv5.8.3へアップデートされています (#29041)

また、このアップデートに合わせて、前述したcompilerOptions.erasableSyntaxOnlyのサポートも導入されています。

OpenTelemetry

Span Links/Span EventsでAttributesがサポート

Span Links/Span Eventsに設定されたAttributesのバックエンドへの送信がサポートされています (#28584)

参考