Deno v1.34がリリースされました。
この記事では主な変更点などについて解説します。
deno.json(c)の拡張
トップレベルのexcludeフィールドがサポート
deno fmtやdeno lintなどの各コマンドで共通の除外対象ファイルを定義できます。
また、トップレベルのexcludeに加えてfmt.excludeやlint.excludeなども一緒に定義されている場合は、それらへマージされます。
例えば、以下のような設定があったとします。
{
"fmt": {
"exclude": [
"fresh.gen.ts",
"README.md"
]
},
"lint": {
"exclude": [
"fresh.gen.ts"
]
}
}
Deno v1.34以降であれば、以下のように設定をまとめることができます。
{
"exclude": [
"fresh.gen.ts"
],
"fmt": {
"exclude": [
"README.md"
]
}
}
globのサポート
include/excludeやtasksなどでglob形式で対象を定義することができます。
{
"lint": {
"exclude": ["generated/**/*.ts"]
},
"tasks": {
"my_task": "cat vendor/**/*.ts"
}
}
またコマンドライン引数でglob式を指定することもできます。
$ deno lint --ignore='vendor/**/*.ts'
nodeModulesDirの追加
{
"nodeModulesDir": true
}
このフィールドにtrueを設定しておくと、依存しているnpmパッケージがnode_modulesディレクトリにも保存されるようになります。(--node-modules-dirが指定された際と同様の振る舞いをします)
Deno.serve()への変更
Deno.serveの戻り値がPromise<void>から新しく導入されたDeno.Serverに変更されました。
このオブジェクトはfinishedフィールドを持っており、これによってサーバが完了するタイミングを判断できます。(v1.33までのDeno.serveの戻り値と同じタイミングでresolveされます)
const ac = new AbortController();
const server = Deno.serve(
{ signal: ac.signal },
(req) => new Response(req.body),
);
await server.finished;
また、Deno.Serverではunref/refメソッドも提供されています。
これらのメソッドによって、HTTPサーバがイベントループの完了をブロックするかどうかを制御できます。(Deno.unrefTimerと同様のイメージです)
その他には、レスポンスの自動的な圧縮もサポートされています。(v1.34.0でBrotli, v1.33.3でgzipがサポートされています)
Node.js互換性に関する改善
v1.33.3でのdeno compileコマンドでのnpmパッケージサポートに続き、deno lspやdeno vendorなどでもnpmパッケージのサポートが拡充されています。
deno lsp
deno lspでnode_modulesディレクトリとlockfileがサポートされました。
node_modulesサポートについては、deno.json(c)でnodeModulesDir: trueが設定されている場合のみ有効化されます。
deno vendor
deno vendorコマンドでnpm:やnode:がサポートされました。
package.jsonのpre/postスクリプトのサポート
package.jsonで定義されたスクリプトをdeno taskで実行する際に、pre/postスクリプトが実行されるようになりました。
{
"scripts": {
"prebuild": "echo '1'",
"postbuild": "echo '3'",
"build": "echo '2'"
}
}
$ deno task build
...
Task prebuild echo '1'
1
Task build echo '2'
2
Task postbuild echo '3'
3
注意点として、deno.json(c)で定義されたタスクについては、pre/postスクリプトは実行されません。
依存パッケージのダウンロード
--node-modules-dirやdeno.jsonの"nodeModulesDir": trueが指定された際は、Denoの起動時にpackage.jsonで指定された依存関係があらかじめインストールされるように挙動が変更されました。(今までは、package.jsonで指定された依存関係のうち、実際に利用されているパッケージのみがインストールされていました。)
もしこの挙動を避けたい場合はDENO_NO_PACKAGE_JSON=1で回避できます。
node:worker_threadsの再実装
node:worker_threadsが改めてDeno本体に実装されました。
node:worker_threadsは、元々、deno_std/nodeで実装されていたものの、deno_std v0.176.0以降から一時的に利用できなくなっていました。(参考)
その他の改善
node:http:Server#unrefが実装されました。(先述のDeno.Server#unrefが使用されています)node:readline:question()でReferenceError: process is not definedエラーが発生する問題が修正されました。node:timers:setImmediateに渡したコールバックが呼ばれるまで最低4msの遅延が発生する問題が修正されました。node:やnpm:を使っていると、globalThis.addEventListener("unhandledrejection")で登録されたリスナが呼ばれなくなる問題が修正されました。- npmパッケージに含まれる実行ファイルを
deno runなどで実行した際に、その実行ファイルに関する情報がlockfileに書かれない問題が修正されました。
Deno.createHttpClientの改善
Deno.createHttpClientに以下のオプションが追加されました。
| オプション | 説明 |
|---|---|
| poolMaxIdlePerHost | コネクションプールにおける待機コネクション数の最大値 |
| poolIdleTimeout | プール内で待機状態のソケットが維持される秒数。falseを指定するとプーリングが無効化されます。 |
http1/http2 | http1のみにtrueを設定するとHTTP/1のみが使用されます http2のみにtrueを設定するとHTTP/2のみが使用されます |
Deno.FileInfoの拡張
Deno.statなどで返却されるDeno.FileInfoに以下のプロパティが追加されました。
isBlockDeviceisCharDeviceisFifoisSocket
Windowsではこれらのプロパティは常にnullが設定されます。
setTimeoutに関する修正
setTimeoutで0を指定した際に、該当イベントループの終了時にコールバックが実行されるように修正されました。
Denoが使用しているtokioのタイマーの解像度は最小で1msのため、0を指定してもイベントループの終了時にコールバックが実行されない問題があったようです。