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

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

deno.json(c)の拡張

トップレベルのexcludeフィールドがサポート

deno fmtdeno lintなどの各コマンドで共通の除外対象ファイルを定義できます。

また、トップレベルのexcludeに加えてfmt.excludelint.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/excludetasksなどで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 lspdeno vendorなどでもnpmパッケージのサポートが拡充されています。

deno lsp

deno lspnode_modulesディレクトリとlockfileがサポートされました。

node_modulesサポートについては、deno.json(c)nodeModulesDir: trueが設定されている場合のみ有効化されます。

deno vendor

deno vendorコマンドでnpm:node:がサポートされました。

package.jsonpre/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-dirdeno.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/http2http1のみにtrueを設定するとHTTP/1のみが使用されます http2のみにtrueを設定するとHTTP/2のみが使用されます

Deno.FileInfoの拡張

Deno.statなどで返却されるDeno.FileInfoに以下のプロパティが追加されました。

  • isBlockDevice
  • isCharDevice
  • isFifo
  • isSocket

Windowsではこれらのプロパティは常にnullが設定されます。

setTimeoutに関する修正

setTimeout0を指定した際に、該当イベントループの終了時にコールバックが実行されるように修正されました。

Denoが使用しているtokioのタイマーの解像度は最小で1msのため、0を指定してもイベントループの終了時にコールバックが実行されない問題があったようです。

参考