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

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

Deno v2に向けた変更

DENO_FUTUREによるDeno.*配下の非推奨APIの削除

DENO_FUTURE=1を指定すると、Deno.*配下の非推奨APIが削除されるようになりました。

deno install--globalオプションが追加

deno installコマンドはインターネット上などで公開されたスクリプトをインストールするためのコマンドです。(デフォルトのインストール先は$HOME/.deno)

Deno v2ではこのdeno installコマンドはデフォルトでdeno addコマンドのエイリアスとして機能するように変更される予定のようです。

deno install changes for Deno 2 (#23062)

この変更に向けてdeno installコマンドに--global/-gオプションが追加されました。Deno v2のリリース以降、Deno v1におけるdeno installと同じ振る舞いをさせるためには、この--globalオプションを指定する必要があります。

$ deno install --global --allow-read=. --allow-write=. --allow-net https://deno.land/x/udd/main.ts

deno lint

Quickfixのサポート

deno lintdeno lspでQuickfixがサポートされました。deno lintでは--fixオプションによりQuickfixを実行できます。

$ deno lint --fix main.js

今のところ以下のルールでQuickfixがサポートされています。

  • no-window
  • no-window-prefix
  • verbatim-module-syntax

jsr関連のルールの自動適用

deno.jsonname/version/exportsが定義されていたら、jsr関連のlintルールが自動で有効化されるように挙動が変更されています。

適用されるルールについては以下で確認できます。

$ deno lint --rules-tags=jsr --rules

deno task

タスクのコメント

deno taskコマンドがタスクに記述されたコメントを認識してくれます。

// deno.jsonc
{
  "tasks": {
    // Run tests
    "test": "deno test --allow-read=. --trace-leaks"
  }
}
$ deno task
Available tasks:
- test
    // Run tests
    deno test --allow-read=. --trace-leaks

shebangのサポート

以下のようにスクリプトを実行するタスクを定義します。

{
  "tasks": {
    "script": "./my_script.js"
  }
}

するとこのスクリプトに記述されたshebangをdeno taskが認識してくれるようになりました。

#!/usr/bin/env -S deno run
console.info("foo");

リダイレクトサポートの改善

入力リダイレクトがサポートされています。

{
  "tasks": {
    "script": "jq .tasks < deno.jsonc"
  }
}

また指定したファイルディスクリプタへのリダイレクトもサポートされています。

{
  "tasks": {
    "script": "deno run some_script.js 2>&1"
  }
}

$?のサポート

スクリプトで$?を参照できます。

{
  "tasks": {
    "script": "deno run some_script.js || echo $?"
  }
}

deno publish

  • deno publish --dry-runでコミットされていないファイルが検出されたらエラーが起きるように改善されています。
  • deno publishの実行時に、パッケージに含まれるべきモジュールがexcludeなどで除外されていた場合、エラーが発生するように挙動が変更されています。

deno test

JUnitレポーターにおけるサブステップの取り扱いが改善

JUnitレポーター(--reporter=junit)でサブステップ(t.step)の取り扱いが改善されています。

今までt.stepで定義されたテストケースは<property>によって表現されていたものの、gotestsumvitestなどと同様に<testcase>が使用されるように変更されています。

これによりt.stepが失敗した際により詳細なエラーメッセージなどを含めることができるように改善されているようです。

deno lsp

vscode_denoDeno: Reload Import Registries Cacheコマンドを実行してもjsrパッケージが再読み込みされない問題が修正されています。

deno check

deno checkコマンドでは--unstableの指定を提案しないように変更されています。

これは/// <reference no-default-lib="true"/>が使われており、かつdeno.unstableが読み込まれていない場合を想定した変更のようです。この場合、deno check--unstableの指定を提案するものの、実際に--unstableを指定しても効果がないため、混乱を招いてしまうというのがこの変更の理由のようです。

CLI

vendorディレクトリの取り扱いの変更

今まで、Denoの各コマンドはvendorと名のついたディレクトリをデフォルトで除外していました。

Deno v1.42でこの挙動が変更され、deno.json"vendor": trueが指定されていない場合は、vendor/ディレクトリがデフォルトで無視されなくなりました。

Deno v1.41までの挙動に戻したい場合は、deno.jsonexcludeなどで明示的に除外する必要があります。


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

--watch-excludeオプションが追加

このオプションで指定されたファイルが変更された際は、--watchによる再起動が行われなくなります。

$ deno run --watch-exclude=data.json --watch main.js

TypeScript

TypeScript v5.4へのアップデート

Deno本体に搭載されたTypeScriptがv5.4へアップデートされています。

新しいSetメソッドの型定義

proposal-set-methodsで提案されているSetの新しいメソッドに関する型定義が追加されました。

Web API

EventSourceの改善

EventSourceで発生するリソースリークなどの問題が修正されています。

また、EventSourceで受け取ったメッセージのフィールドに:を含む値が設定されていた場合に、意図せずして値が部分的に切り取られてしまう問題も修正されています。

structuredCloneの型定義が修正

structuredCloneの型定義がTypeScript公式と同様の定義に合わせられました。

Node.js互換性の改善

node:fs

FSWatcher#unrefが実装されました。

node:events

EventEmitterAsyncResourceが実装されました。

node:crypto

  • ECDHgetPublicKey/generateKeysメソッドでformat引数がサポート
  • getRandomValuesが追加
  • subtleが追加
  • createPublicKeyでEC鍵がサポート

node:string_decoder

内部実装が再実装され、Node.jsとの互換性が改善されています。

node:child_process

spawnSyncなどのstdioオプションに[null, null, null]を指定した際に["pipe", "pipe", "pipe"]と同様に取り扱われるように改善されました。

node:v8

serialize/deserializeが実装されました。

node:worker_threads

  • WorkerworkerDataオプションにMessagePortを渡せるように改善されました。
  • ESMモジュールがCJSモジュールとして実行されてしまうことがある問題が修正されました。
  • parentPortmessageリスナーが登録されている際は、プロセスの終了がブロックされるように挙動が変更されました。

参考