はじめに
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という名前のシンボリックリンクを作成してくれます。dxはdeno xへのエイリアスとして機能してくれます。
$ dx --ignore-env -R cowsay@1.6.0 hi
deno approve-scripts
deno approve-scriptsコマンドが追加されています (#31472, #31493)
これはpnpmにおけるpnpm approve-buildsコマンドに相当する機能で、deno.jsonのallowScriptsフィールドを更新することで、ライフサイクルスクリプトの実行を許可する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.jsonとmain.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)
参考
この記事は以下のページを参考に記述されています。