はじめに
Deno v2.4がリリースされました。
この記事では主な変更点などについて解説します。
OpenTelemetryサポートが安定化
DenoのOpenTelemetryサポートが安定化されました (#29822)
これによって--unstable-otelの指定が不要化され、OTEL_DENOのみの指定によってOpenTelemetryサポートを有効化できます。
--unstable-raw-importsが追加 (ファイルのテキスト/バイト形式での読み込みがサポート)
--unstable-raw-importsオプションがサポートされています (#29855, #29924)
このオプションを指定すると、Import Attributes (
type: "bytes"またはtype: "text")によって文字列もしくはバイト (Uint8Array) 形式でファイルを読み込むことができます:
import data from "./data.txt" with { type: "text" };
console.info(data); // => "foo"
この機能はDENO_UNSTABLE_RAW_IMPORTS環境変数によって有効化することも可能です。
また、deno publishコマンドではまだこの機能はサポートされていないようです (#29954)
deno bundleについて
Deno v2.3.6で、esbuildをベースにdeno bundleコマンドが再導入されています。
このリリースでは、このdeno bundleコマンドでも--unstable-raw-importsオプションのサポートが追加されています (#29908)
また、このdeno bundleコマンドに関する公式ドキュメントも追加されています (denoland/docs#1866)
Deno v2.4に関する公式ブログによると、今後、このdeno bundleの機能をAPI経由で利用できるようにすることが検討されているようです。
deno updateコマンドが追加
deno updateコマンドが追加されています (#29187)
このコマンドによって依存関係の更新を行うことができます (実質的にdeno outdated --updateのエイリアスとして機能します)
$ deno update --latest @ts-morph/ts-morph
deno deployコマンドについて
小さな変更ですが、Deno v2.3.6で追加されたdeno deployコマンドについて、デフォルトでヘルプが含まれるよう修正されています (#29863)
$ deno help | grep deploy
deploy Manage and publish applications with Deno Deploy
deno check
tsconfig.jsonの検出がサポート
deno checkがdeno.jsonまたはpackage.jsonと同一ディレクトリにあるtsconfig.jsonを検出してくれるよう改善されています (#29843, #29925)
tsconfig.jsonにおいては、compilerOptionsに加えて、以下のフィールドがサポートされます:
referencesextendsfilesincludeexclude
--preload/--importオプションの追加
--preload (--import) オプションが追加されています (#29626)
このオプションはNode.jsの--importと同様に、エントリーポイントを実行する前にこのオプションで指定したモジュールが読み込まれます:
$ deno run --preload=jsr:@std/dotenv@0.225.5/load --allow-env=DATABASE_URL --allow-read=.env main.js
Permissions
Deno.execPath()が--allow-readを要求しないよう挙動を変更
Deno.execPath()を利用する際に--allow-readの指定が不要化されました (#29620)
Deno.execPath()が--allow-read=denoの要求を促すことによって、ユーザーが--allow-readを指定してしまいがちで、却ってセキュリティリスクを増してしまうとの判断からこの変更が実施されたようです。
--allow-net
--unstable-subdomain-wildcardsが安定化
Deno v2.3.4で実装された--unstable-subdomain-wildcardsが安定化されました (#29902)
今後は--unstable-subdomain-wildcardsを指定せずに--allow-netでのサブドメインに対するワイルドカード指定が利用できます。
CIDR表記による指定がサポート
--allow-net及び--deny-netでCIDR表記による指定がサポートされています (#29704)
$ deno run --allow-net=127.0.0.0/24 main.js
--deny-importがサポート
--deny-importオプションがサポートされています (#29702)
--allow-importによって許可されるデフォルトのホストを無効化したい場合などに利用できます:
$ deno run --deny-import=raw.githubusercontent.com main.js
Deno.permissions.query()でname: "import"がサポート
Deno.permissions.query()で--allow-importに対応したname: "import"オプションがサポートされています (#29610)
const status = await Deno.permissions.query({
name: "import",
host: "cdn.jsdelivr.net",
});
deno fmt
.svg/.xml/.mustache形式のサポート
deno fmtでSVGやXML, Mustache形式のファイルのフォーマットをサポートしています (#29851)
Mustache形式のフォーマットを行いたい場合は、--unstable-componentオプションによって明示的に有効化する必要があります。
UTF-8 BOMが取り除かれるよう挙動が変更
deno fmtがファイルのUTF-8 BOMを取り除くよう挙動が変更されています (#29796)
deno run
Import mapsによるエントリーポイントの解決
deno runにおいて、エントリーポイントに対するImport mapsによる解決がサポートされています (#29928)
以下のようにdeno runの引数としてdeno.jsonで定義されたImport mapsのエントリーを指定することができます:
$ deno add npm:cowsay@1.6.0
$ cat deno.json | jq .imports.cowsay
"npm:cowsay@1.6.0"
$ deno run -ER cowsay hi
____
< hi >
----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
エントリーポイントが.から始まらない場合や絶対パス形式でない場合はこの振る舞いが適用されるため、もしDeno v2.4へのアップデート以降、deno runが意図せぬ振る舞いをする場合は、引数に./を付与すると回避できます。
deno serve
Deno.ServeDefaultExportでonListenコールバックがサポート
Deno.ServeDefaultExportにonListenプロパティーが追加されています (#29449)
挙動としてはDeno.serve()のonListenオプションと同様に、サーバーが待ち受けを開始したタイミングでコールバックが実行されます。
DENO_AUTO_SERVE環境変数がサポート
DENO_AUTO_SERVE環境変数が追加されています (#29852)
この環境変数が指定された場合、deno runの引数で指定されたエントリーポイントがDeno.ServeDefaultExportを満たす場合、deno serveと同様の振る舞いをします。
deno coverage
deno runで--coverageがサポート
deno runでのカバレッジの収集がサポートされています (#29329)
deno runに--coverageを指定するか、DENO_COVERAGE_DIR環境変数を指定することで有効化されます。
DenoでMochaなどを実行したい場合に便利ではないかと思いました。
テーブルがMarkdown形式で表示されるよう改善
deno coverageが出力するテーブルがMarkdown形式で表示されるよう改善されています (#29533)
deno bench
テーブルがMarkdown形式で表示されるよう改善
deno benchにおいてもdeno coverageと同様に、テーブルがMarkdown形式で表示されるよう改善されています (#29532)
deno install
deno install -gによるnpmパッケージのインストールが改善
deno install -gによるnpmパッケージのインストール時に、package.jsonのbinエントリーの解決が試みられるよう改善されています (#29884)
具体的には、deno install -g npm:@google/gemini-cliを実行すると、geminiが利用できるように改善されています。
Deno API
Deno.Command
Deno.Commandでdetachedオプションがサポートされています (#29933)
挙動はchild_process.spawn() (node:child_process)における同名オプションと同様です。
Deno.addSignalListener()
WindowsにおいてSIGHUPがサポートされています (#27880)
Node.js互換性の改善
--unstable-sloppy-importsの安定化
--unstable-sloppy-importsが安定化されています (#29780)
今後は--sloppy-importsとして利用できます。
--unstable-node-conditionsが安定化
--unstable-node-conditionsが安定化されました (#29848, #29885, #29628)
今後は--conditionsとして利用可能です。また、DENO_CONDITIONS環境変数による指定もサポートされています。
DENO_COMPAT環境変数
DENO_COMPAT環境変数が追加されています (#29889)
この環境変数が設定されると、以下のフラグがまとめて有効化されます:
--unstable-bare-node-builtins--unstable-detect-cjs--sloppy-imports
Buffer/global/setImmediate/clearImmediateがデフォルトでグローバル化
Node.jsに関する以下のAPIがすべてのコードにおいてデフォルトでグローバル化されました (#29416, #29877)
globalBuffersetImmediateclearImmediate
今までこれらのAPIはnpmパッケージ中のコードにおいてのみグローバル化されていましたが、npmパッケージとユーザーコードの実行環境における差異の軽減のため、ユーザーコードにおいてもこれらのAPIがグローバル化されました。
この変更に伴って、--unstable-node-globalsが非推奨化されています (#29887)
node:fs
glob()とglobSync()が実装されています (#28972)
macOS向けにlchmod()とlchmodSync()が実装されています (#29833)
また、lchown()及びlutimes()がnode:fs/promisesからも読み込めるよう改善されています (#29870)