Deno v1.39がリリースされました。
この記事では主な変更点などについて解説します。
WebGPU APIの再導入
Deno v1.32で削除されたWebGPU APIが再導入されました。
利用するにはdeno.json
でunstable: ["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.Kv
にcommitVersionstampメソッドが実装されています。
このメソッドが返す値をキーの最後の要素として指定することができて、その場合、その位置には自動でバージョンスタンプが設定されます。
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.HttpClientがusing
に対応しました。
// スコープから抜ける際に自動で`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#read
でmin
オプションが実装
ReadableStreamBYOBReader#readでmin
オプションがサポートされています。
このオプションを指定すると、min
で指定された要素数が読み込まれるまでresolveされないように制御できるようです。
Add ReadableStreamBYOBReader.prototype.read(view, { min }) (whatwg/streams#1145)
URLPatternのパフォーマンス改善
URLPatternについて、主にフレームワークなどのrouterとして使用されるケースを想定したパフォーマンス改善が実施されています。
おそらくこの修正に合わせて、fresh v1.6.1でもRegExp
からURLPattern
を使用してマッチングをするように修正されているようです。
ImageData
が実装
ImageData
がサポートされています。
sloppy importsのサポート (--unstable-sloppy-imports
)
--unstable-sloppy-imports
オプションが追加されました。
このオプションまたはdeno.json
でunstable: ["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.json
でunstable: ["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 task
でnode_modules/.bin
の探索がサポート
package.json
のscripts
で定義されたスクリプトをdeno task
で実行する際に、node_modules/.bin
に配置された実行可能ファイルを探索してくれるように改善されました。
組み込みモジュールの改善
node:child_process
:fork()
が実装されています。node:util
:parseArgs()
が実装されています。node:vm
:runInNewContext()
が実装されています。(options
はまだサポートされていないようです)- Webpack(+Next.js)の動作に向けた対応のようです (#21527)
node:os
:freemem()
の互換性の向上- LinuxではDeno.SystemMemoryInfo.available、それ以外の環境ではDeno.SystemMemoryInfo.freeと同じ値が返されるように挙動が変更されているようです。
node:crypto
:sign()
でPEM形式の秘密鍵がサポートnode:process
:process.exitCode
の設定値がDenoによって認識されるように改善されています。
その他
Deno.ChildProcess
の型定義でAsyncDisposable
ではなくDisposable
が実装されていた問題が修正されています。--allow-net=localhost:80
のようにホスト名と80番ポートを許可すると、対象ホストの全ポートへのアクセスが許可されてしまう問題が修正されています。Deno.permissions.revoke
でnet
パーミッションを拒否しようとすると、プロセスがパニックする問題が修正されています。