はじめに

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 checkdeno.jsonまたはpackage.jsonと同一ディレクトリにあるtsconfig.jsonを検出してくれるよう改善されています (#29843, #29925)

tsconfig.jsonにおいては、compilerOptionsに加えて、以下のフィールドがサポートされます:

  • references
  • extends
  • files
  • include
  • exclude

--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 rundeno serveにおいて、エントリーポイントに対する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.ServeDefaultExportonListenコールバックがサポート

Deno.ServeDefaultExportonListenプロパティーが追加されています (#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.jsonbinエントリーの解決が試みられるよう改善されています (#29884)

具体的には、deno install -g npm:@google/gemini-cliを実行すると、geminiが利用できるように改善されています。

Deno API

Deno.Command

Deno.Commanddetachedオプションがサポートされています (#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)

この環境変数が設定されると、以下のフラグがまとめて有効化されます:

Buffer/global/setImmediate/clearImmediateがデフォルトでグローバル化

Node.jsに関する以下のAPIがすべてのコードにおいてデフォルトでグローバル化されました (#29416, #29877)

  • global
  • Buffer
  • setImmediate
  • clearImmediate

今までこれらのAPIはnpmパッケージ中のコードにおいてのみグローバル化されていましたが、npmパッケージとユーザーコードの実行環境における差異の軽減のため、ユーザーコードにおいてもこれらのAPIがグローバル化されました。

この変更に伴って、--unstable-node-globalsが非推奨化されています (#29887)

node:fs

glob()globSync()が実装されています  (#28972)

macOS向けにlchmod()lchmodSync()が実装されています (#29833)

また、lchown()及びlutimes()node:fs/promisesからも読み込めるよう改善されています (#29870)

参考