はじめに
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 addとdeno 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.jsonでcompilerOptionsが定義されている際はこの検出機能は無効化されます。
compilerOptions.erasableSyntaxOnlyのサポート
後述するTypeScript v5.8へのアップデートに合わせて、compilerOptions.erasableSyntaxOnlyがサポートされています (#29097)
deno compile
FFIとNode.jsネイティブアドオン (.node)のサポート
deno compileでFFIやNode.jsネイティブアドオンを利用したコードに対する実行可能ファイルの作成がサポートされました (#28934)
現状では、v2.1でdeno 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/)
quotePropsuseBracesbracePositionsingleBodyPositionnextControlFlowPositiontrailingCommasoperatorPositionjsx.bracketPositionjsx.forceNewLinesSurroundingContentjsx.multiLineParenstypeLiteral.separatorKindspaceAroundspaceSurroundingProperties
これらのオプションはdeno.jsonのfmt配下で設定可能です (#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.createHttpClientでlocalAddressオプションがサポート
このオプションを設定することで、fetch()の利用時に使用されるローカルIPアドレスを選択できます (#28781)
Deno.webgpu
Deno.webgpuが追加されています (#28192)
今のところdeviceStartCaptureとdeviceStopCaptureの2つのAPIが提供されています (利用には--unstable-webgpuの指定が必要です)
CLI
--allow-envの挙動の改善
セキュリティ改善
--deny-envが指定された際はDeno.env.toObject()の実行が拒否されるよう挙動が改善されています (#29079)
また、アクセスが許可されていない環境変数をprocess.envから読んだ際に、undefinedを返すのではなくDeno.errors.NotCapableをthrowするよう挙動が変更されています (#28280)
NO_COLOR/FORCE_COLORに関する挙動の変更
NO_COLORとFORCE_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)