はじめに

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

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

deno x

deno xコマンドが追加されています (#31138)

このコマンドを使うことで、npxのように指定したパッケージをインストールし、実行することができます。

$ deno x cowsay@1.6.0 hi
 ____
< hi >
 ----
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

インストールされたパッケージは$DENO_DIR/deno_x_cacheに保存されます。$DENO_DIR/deno_x_cache/<package-dir>/deno.lockを作成することで、パッケージの依存関係を固定してくれます。

また、パーミッションフラグの指定も可能です (デフォルトでは --allow-all が指定されます)

$ deno x --ignore-env --allow-read cowsay@1.6.0 hi

ネイティブバイナリーを実行する場合は--allow-runが要求されます。

$ deno x --deny-run esbuild --version
error: Requires run access to "/path/to/.deno/esbuild@0.27.1/node_modules/esbuild/bin/esbuild", run again with the --allow-run flag

デフォルトではnpmパッケージが実行されますが、jsr:を指定することでjsrパッケージの実行も可能です。

$ deno x --allow-read=deno.json jsr:@uki00a/deno-json-lint@0.3.0

引数なしで deno x を実行すると、プロジェクト内で認識されているコマンドの一覧を表示できます。

$ deno x
Available (local) commands:
  esbuild


# コマンドが見つからない場合
$ deno x
No local commands found

deno x --install-aliasを実行すると、dxという名前のシンボリックリンクを作成してくれます。dxdeno xへのエイリアスとして機能してくれます。

$ dx --ignore-env -R cowsay@1.6.0 hi

deno approve-scripts

deno approve-scriptsコマンドが追加されています (#31472, #31493)

これはpnpmにおけるpnpm approve-buildsコマンドに相当する機能で、deno.jsonallowScriptsフィールドを更新することで、ライフサイクルスクリプトの実行を許可するnpmパッケージを指定することができる機能です。

# (1) ライフサイクルスクリプトを持つパッケージをインストールします
$ deno install npm:better-sqlite3@12.2.0
Add npm:better-sqlite3@12.2.0
╭ Warning
│  Ignored build scripts for packages:
│  npm:better-sqlite3@12.2.0
│  Run "deno approve-scripts" to run build scripts.
╰─

# (2) 対話的に特定パッケージに対するライフサイクルスクリプトの実行を許可できます
$ deno approve-scripts
? Select which packages to approve lifecycle scripts for
(<space> to select, ↑/↓/j/k to navigate, a to select all, i to invert selection, enter to accept, <Ctrl-c> to cancel)
❯ ○ npm:better-sqlite3@12.2.0

# (3) `deno.json`の`allowScripts`が更新されます
$ cat deno.json | jq .allowScripts
[
  "npm:better-sqlite3@12.2.0"
]

deno audit - socket.devとの統合

Deno v2.5.5で実装されたdeno auditコマンドで--socketオプションがサポートされています (#31106)

このオプションを指定するとsocket.devとの統合が有効化されます。具体的にはdeno auditでデフォルトで利用されるFull Audit エンドポイント (/-/npm/v1/security/audits) ではなく、@socketsecurity/bun-security-scannerでも使用されているfirewall-api.socket.devエンドポイントを使用してパッケージの検査が行われます。

また、SOCKET_API_KEY環境変数を指定した場合、それで設定されたAPIキーを使用してhttps://api.socket.dev/v0/purlエンドポイントによる検査が行われます (#31370)

Permissions - --ignore-read/--ignore-envオプションの追加

--ignore-readオプション (#31363) と--ignore-envオプション (#31187) が実装されています。

これらのオプションはそれぞれ指定されたファイルまたは環境変数を存在しないものとして扱いたい場合に利用できます。

--ignore-readオプションで無視されたファイルを読もうとすると、Deno.errors.NotFoundが発生します。

$ cat main.js
console.info(await Deno.readTextFile("./README.md"));

$ file README.md
README.md: ASCII text

$ deno run --ignore-read=README.md main.js
error: Uncaught (in promise) NotFound: No such file or directory (os error 2)
console.info(await Deno.readTextFile("./README.md"));
  ...

--ignore-envによって指定された環境変数については常に未定義として扱われます。

# `main.js`
$ cat main.js
console.info("HOME", Deno.env.get("HOME"));
console.info("FOO", Deno.env.get("FOO"));

# (1) `HOME`環境変数のみを無視する
$ FOO=1 deno run --allow-env --ignore-env=HOME main.js
HOME undefined
FOO 1

# (2) すべての環境変数を無視
$ FOO=1 deno run --ignore-env main.js 
HOME undefined
FOO undefined

これらのオプションについてはdeno.jsonのパーミッションセットの定義においてもサポートされています。

{
  "permissions": {
    "default": {
      "env": { "ignore": true }
    }
  }
}

deno publish - "publish": falseがサポート

deno.json"publish": falseの設定がサポートされています (#30852)

この設定を行っておくと、該当のパッケージがdeno publishによってjsrに公開されなくなります。ワークスペースを採用したプロジェクトにおいて、公開したくないパッケージに対してこの設定を行うことが想定されています。

deno init

deno init --empty

deno initコマンドに--emptyオプションが追加されています (#31516)

このオプションを指定するとdeno.jsonmain.tsのみを生成してくれます。

$ deno init --empty

$ ls
deno.json  main.ts

deno init --npm --yes

deno init --npm--yesオプションが追加されています (#31499)

このオプションを指定すると確認プロンプト (⚠️ Do you fully trust <package name> package? Deno will invoke code from it with all permissions. Do you want to continue? [y/n]) がスキップされます。

deno install

deno install -gにおける破壊的変更

deno install -gでインストールするスクリプトに対して引数を指定したい場合、--の指定が必須化されています (#31292)

$ deno install -g jsr:@std/http/file-server -- --allow-read --allow-net

この変更により、複数のスクリプトをまとめてインストールできるよう改善されています。

$ deno install -g jsr:@std/http/file-server jsr:@uki00a/deno-json-lint 

--lockfile-only

--lockfile-onlyオプションが追加されています (#31376)

このオプションが指定されると、npmパッケージのインストールはせずにdeno.lockの更新のみが行われます ("nodeModulesDir": "auto"が設定されていたとしてもnode_modulesが更新されません)

$ deno install --lockfile-only npm:esbuild

deno lint - プラグインでファイルと環境変数の読み込みがサポート

プラグインで環境変数やファイルの読み込みがサポートされています (#31327)

特にオプションを指定せずとも、あらかじめ--allow-env及び--allow-readが指定されている場合と同様に動作します。

deno bundle

Androidにおける利用 (#31521) 及び Worker内でのDeno.bundle()の利用 (#31316) がサポートされています。

また、bun: specifierが検出された際に常にexternalモジュールとして扱われるように挙動が修正されています (#31411)

deno lsp におけるバグ修正

source.organizeImports

source.organizeImportsコードアクションにおいてワークスペース内のパッケージに対するspecifierが書き換えられてしまう問題が修正されています (#31230)

また、vscode_denoにおいて Organize imports アクションが重複して表示される問題が修正されています (#31530)

textDocument/definition

Denoのグローバルキャッシュを利用している場合、npmパッケージ内において定義先へのジャンプ (textDocument/definition) が動作しなかった問題が修正されています (#31377)

deno test - JUnitレポーターのバグ修正

JUnitレポーター (--reporter junit) においてANSIエスケープコードが取り除かれるよう修正されています (#30854)

deno check - typescript-go連携におけるバグ修正

typescript-goを使用して型チェックを実行 (--unstable-tsgo) する際に、.cssなどの非.js/.tsファイルへのimportでエラーが発生しないよう改善されています (#31478)

Source Phase Imports

Source Phase Importsが実装されています (#31486)

この機能を使うことで、例えば、以下のように.wasmモジュールをWebAssembly.Moduleとして読み込むことができます。

import source mathModule from "https://raw.githubusercontent.com/denoland/deno/refs/tags/v2.6.0/tests/testdata/wasm/math.wasm";

console.assert(mathModule instanceof WebAssembly.Module);

const instance = await WebAssembly.instantiate(mathModule);
console.assert(instance.exports.add(1, 2) === 3);

Web API

BroadcastChannelが安定化

BroadcastChannelが安定化されました。今後は--unstable-broadcast-channelの指定なしで利用できます (#30770)

Streamの移譲がサポート

ReadableStream/WritableStream/TransformStream移譲がサポートされています (#31126)

using f = await Deno.open("README.md");
const clone = structuredClone({
  content: f.readable,
}, { transfer: [f.readable] });
for await (const chunk of clone.content) {
  // ...
}

Float16Array

Float16Arrayがサポートされています (#31410)

また、ImageDataに対するFloat16Arrayのサポートも実施されています (#31394)

その他の改善

Workerを作成し、その内部でfetch()を呼んでいるケースにおいて Too many open files エラーが起きてしまうことのある問題への修正が実施されています (#31375)

console.dir()console.group()によるインデントがサポートされています (#31412)

また、NodeListOf型に[Symbol.iterator]()メソッドの型定義が追加されています(#31384)

Node.js互換性の改善

Deno本体に@types/nodeがバンドル

Deno本体に@types/nodeがバンドルされました (#31502)

今までは必要に応じて@types/nodeがダウンロードされていましたが、今後はデフォルトでDeno本体に内蔵された@types/nodeの定義が使用されます。

--require

--requireオプションが実装されています (#31201)

Node.jsにおける同名オプションと同様に、エントリーポイントを実行する前に指定されたCommonJSモジュールを事前に読み込むことができます。

# `main.js`の実行前に`setup.cjs`が実行されます
$ deno run --require=setup.cjs main.js

Subpath importsで#/から始まるマッピングがサポート

Subpath imports#/から始まるマッピングがサポートされています (#31520)

Node.jsの最近の変更に追従しているようです (nodejs/node#60864)

Windows向けのshimの生成が改善

Windowsにおいてnode_modules/.binにnpmと同様の形式 (cmd-shim) でshimを生成するよう改善されています (#31494)

node:sqlite

下記APIが追加されています。

  • DatabaseSync#aggregate() (#31461)
  • DatabaseSync#function() (#31386)
  • DatabaseSync#[Symbol.dispose]() (#31311)
  • StatementSync#setAllowUnknownNamedParameters() (#31202)

また、StatementSync#iterate()のバグが修正されています (#31361)。このメソッドを呼ぶ際に意図せず最後のクエリの実行結果が再利用されてしまっていたようです (#30144)。

node:fs/promises

以下の改善が実施されています。

  • FileHandle#appendFile()が実装 (#31301)
  • statfs()が公開 (#31528)
  • FileHandle#readFile() - signalオプションがサポート (#31462)
  • FileHandle#close() - リソースをgracefulに解放するよう改善されています (#31164)

node:child_process

Advanced serialization (serialization: 'advanced') がサポートされています (#31380)

node:dns

lookupService()が実装されています (#31310)

node:timers

Node.jsとの互換性を改善するためにsetImmediate()が再実装されています (#30328)

また、Timeout#refresh()でメモリリークが発生しないようにする改善が実施されています (#31436)

node:crypto

Cipherivにおいて自動的なパディング (Cipheriv#setAutoPadding()) が適切に動作するよう改善されています (#31389)

node:buffer

Buffer.compare()及びBuffer#compare()の内部処理がRustで再実装され、パフォーマンスが改善されています (#31425)

その他

ソースマップサポートの改善

Denoが//# sourceMappingURL=...コメントを検出した際に、指定されたソースマップの内容を適用した上でスタックトレースを表示してくれるよう改善されています (#31268)

また、process.sourceMapsEnabledが定義されるように改善されています (#31358)

参考

この記事は以下のページを参考に記述されています。