Deno v1.39がリリースされました。

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

WebGPU APIの再導入

Deno v1.32で削除されたWebGPU APIが再導入されました。

利用するにはdeno.jsonunstable: ["webgpu"]を指定するか--unstable-webgpuオプションの指定が必要です。

{
  "unstable": ["webgpu"]
}

以下のリポジトリではWebGPU APIに関する使用例が公開されています。

また、この追加に合わせて、deno_stdにもWebGPU API向けのユーティリティが追加されています。(std/webgpu)

deno coverage

サマリー/HTMLレポーターの追加

deno coverageコマンドにサマリーレポーターとHTMLレポーターが追加されました。

サマリーレポーターは新しくdeno coverageコマンドのデフォルトで使用されるレポーターとして設定されていて、以下のような形式でレポートが出力されます。

$ deno coverage ./coverage
-----------------------------------------------------------
File                                  | Branch % | Line % |
-----------------------------------------------------------
 demo/components/Button.tsx           |    100.0 |    0.0 |
 demo/fresh.gen.ts                    |    100.0 |  100.0 |
   ... 省略 ...
 internal/test_utils/mod.ts           |    100.0 |  100.0 |
 server.ts                            |     83.3 |   90.3 |
-----------------------------------------------------------
 All files                            |     82.2 |   72.3 |

もしDeno v1.38以前の形式でレポートを出力したい場合は、--detailedオプションを指定する必要があります。

$ deno coverage --detailed ./coverage

もう一つのHTMLレポーターはカバレッジレポートをHTML形式で出力してくれます。deno test --coverageが生成したディレクトリ内にhtml/index.htmlを生成してくれるため、ブラウザなどで閲覧することができます。

$ deno coverage --html ./coverage
HTML coverage report has been generated at file:///path/to/project/coverage/html/index.html

$ xdg-open coverage/html/index.html

deno test: --coverageオプションにデフォルト値が設定

今まではdeno test --coverageでカバレッジ情報を出力する際はディレクトリを明示する必要がありました。

# ./covディレクトリにカバレッジ情報を出力します。
$ deno test --coverage=cov/ -A ./server.test.ts

Deno v1.39では--coverageオプションへのディレクトリの指定を省略できるようになりました。

ディレクトリを省略した場合は、デフォルトで./coverage/にカバレッジ情報が出力されます。

Deno Cron

オブジェクト形式でのスケジュールの設定がサポート

Deno.cronでオブジェクトによるスケジュールの指定がサポートされました。(Deno.CronSchedule)

例えば、3分ごとに特定の処理を実行したい場合、今までは以下のように記述する必要がありました。

Deno.cron("sample", "*/3 * * * *", () => doSomething());

上記と同様に設定したい場合、以下のような記述ができます。

Deno.cron(
  "sample",
  { minute: { every: 3 } },
  () => doSomething(),
);

Deno KV

enqueue()メソッドでbackoffScheduleオプションがサポート

リトライポリシーのカスタマイズに利用できます。

const db = await Deno.openKv(":memory:");
// ...
await db.enqueue("message", {
  // 最大で3回リトライを行うように指定しています。
  // ここではリトライ間隔を100ms -> 200ms -> 400msと指定しています。
  backoffSchedule: [100, 200, 400],
});

backoffScheduleオプションには最大で5つまで要素を指定することができます。(最大リトライ回数は5回)

また、各要素に指定できる値の最大値は3600000です。(1回のリトライあたりの最大待機時間は最大で1時間)


https://github.com/denoland/deno/pull/21474

commitVersionstampメソッドの追加

Deno.KvcommitVersionstampメソッドが実装されています。

このメソッドが返す値をキーの最後の要素として指定することができて、その場合、その位置には自動でバージョンスタンプが設定されます。

const db = await Deno.openKv(":memory:");

const result = await db.set(["entries", db.commitVersionstamp()], "foobar");
assert(result.ok);
const found = await db.get(["entries", result.versionstamp]);
assert(found.value === "foobar");

Deno.serve

Deno.HttpServer#shutdownの安定化

HTTPサーバーをgracefulに停止するためのAPIであるDeno.HttpServer#shutdownが安定化されました。

今後は--unstableの指定なしで利用できます。

Unixドメインソケットサポートの安定化

Deno v1.37.2で実装されたDeno.serve()のUnixドメインソケットサポートが安定化されています。

※APIについては安定化されたものの、v1.39.0においてはまだ--unstableの指定が必要なようで、おそらく次のv1.39.1で正式に--unstableの指定が不要になりそうです。

fix(net): remove unstable check for unix socket listen #21592


追記) Deno v1.39.1で安定化されました。

Deno.HttpClient

usingのサポート

Deno.HttpClientusingに対応しました。

// スコープから抜ける際に自動で`Deno.HttpClient#close()`を呼んでくれます。
using client = Deno.createHttpClient({ allowHost: true });
const res = await fetch("http://localhost:3000/", {
  client,
  headers: { host: "example.com" },
});

deno compile

BYONMがサポート

Deno v1.38で実装されたBYONMがdeno compileコマンドでもサポートされました。これにより、Node.jsで実装されたCLIプログラムからスタンドアロンの実行可能ファイルを生成できる余地が生まれそうです。

$ npm i chalk@5.3.0

$ cat index.js
import chalk from 'chalk';

console.info(chalk.bold(chalk.green('foobar')));


$ deno compile --unstable-byonm --output=sample index.js
Compile file:///path/to/project/index.js to sample

$ ./sample 
foobar

dynamic importの挙動の改善

deno compileで以下のように動的にimport()の引数を作成しているケースがサポートされました。

await import(`./subdir/${target}`);

また、上記の場合、./subdir配下やその子孫のディレクトリからもモジュールを探して、それらも最終的なバイナリに含めることで、より安定して動作できるよう改善が図られているようです。

Web API

ReadableStreamBYOBReader#readminオプションが実装

ReadableStreamBYOBReader#readminオプションがサポートされています。

このオプションを指定すると、minで指定された要素数が読み込まれるまでresolveされないように制御できるようです。


Add ReadableStreamBYOBReader.prototype.read(view, { min }) (whatwg/streams#1145)

URLPatternのパフォーマンス改善

URLPatternについて、主にフレームワークなどのrouterとして使用されるケースを想定したパフォーマンス改善が実施されています。

perf(ext/url): improve URLPattern perf #21488

おそらくこの修正に合わせて、fresh v1.6.1でもRegExpからURLPatternを使用してマッチングをするように修正されているようです。

ImageDataが実装

ImageDataがサポートされています。

sloppy importsのサポート (--unstable-sloppy-imports)

--unstable-sloppy-importsオプションが追加されました。

このオプションまたはdeno.jsonunstable: ["sloppy-imports"]を指定すると、以下のようなimportが有効化されます。

// (1) 拡張子なしでのimport
import { add } from './add';

// (2) ディレクトリを指定したimport
import { foo } from './subdir';

// (3) `.ts`モジュールを`.js`拡張子でimport
import { sleep } from './subdir/sleep.js';

この機能はNode.jsで書かれたプログラムをDenoで動かしやすくするために導入された機能のようで、Denoの一般的な使用においては指定することは推奨されないようです。実際に使用すると、以下のような警告が表示されます。

Warning Sloppy imports are not recommended and have a negative impact on performance.

これに合わせて、deno lspでもsloppy-imports向けのQuickfixがサポートされています。

Object.prototype.__proto__の有効化 (--unstable-unsafe-proto)

--unstable-unsafe-protoオプションが実装されました。

セキュリティのためDenoはデフォルトでObject.prototype.__proto__を削除します。deno.jsonunstable: ["unsafe-proto"]を設定するか、または--unstable-unsafe-protoオプションを指定することで、この挙動を無効化できます。

一部のnpmパッケージを動かすためにObject.prototype.__proto__が欲しい場面での使用が想定されています。

deno lsp

デバッグ向けのログ出力がサポート

ワークスペースで"deno.logFile": trueを指定しておくと、.deno_lsp/log_{timestamp}.txtにログを出力してくれます。

// .vscode/settings.json
{
  // ...
  "deno.logFile": true
}

"deno.internalDebug": trueと併用することで、より多くの情報が閲覧できるようです。

deno fmt

.ipynbがサポート

Deno v1.37でのdeno jupyterの実装に合わせて、deno fmtでも.ipynbファイルをフォーマットできるようになりました。

TypeScript v5.3

Denoの内部に搭載されているTypeScriptがv5.3へアップデートされました。

Deno v1.40での計画について

Deno v1.39の時点ではexperimentalDecoratorsがデフォルトで有効化されています。

v1.39の公式ブログによると、Deno v1.40でこのデフォルトの挙動を変更し、TC39 decoratorsの方をデフォルトで有効化することが検討されているようです。

そのため、もしexperimentalDecoratorsを使っている場合は、今のうちにdeno.json"compilerOptions.experimentalDecorators": trueを設定しておき、明示的に有効化しておくと安全なようです。

Node.js互換性の改善

今回のリリースでも様々な改善が実施されています。

deno tasknode_modules/.binの探索がサポート

package.jsonscriptsで定義されたスクリプトをdeno taskで実行する際に、node_modules/.binに配置された実行可能ファイルを探索してくれるように改善されました。

組み込みモジュールの改善

  • node:child_process: fork()が実装されています。
  • node:util: parseArgs()が実装されています。
  • node:vm: runInNewContext()が実装されています。(optionsはまだサポートされていないようです)
    • Webpack(+Next.js)の動作に向けた対応のようです (#21527)
  • node:os: freemem()の互換性の向上
  • node:crypto: sign()でPEM形式の秘密鍵がサポート
  • node:process: process.exitCodeの設定値がDenoによって認識されるように改善されています。

その他

  • Deno.ChildProcessの型定義でAsyncDisposableではなくDisposableが実装されていた問題が修正されています。
  • --allow-net=localhost:80のようにホスト名と80番ポートを許可すると、対象ホストの全ポートへのアクセスが許可されてしまう問題が修正されています。
  • Deno.permissions.revokenetパーミッションを拒否しようとすると、プロセスがパニックする問題が修正されています。

参考