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に以下のプロパティが追加されました。
isBlockDevice
isCharDevice
isFifo
isSocket
Windowsではこれらのプロパティは常にnull
が設定されます。
setTimeout
に関する修正
setTimeout
で0
を指定した際に、該当イベントループの終了時にコールバックが実行されるように修正されました。
Denoが使用しているtokioのタイマーの解像度は最小で1msのため、0
を指定してもイベントループの終了時にコールバックが実行されない問題があったようです。