直近のDenoの変更について

直近でDenoのmainブランチにいくつかの機能がマージされているため紹介します。

⚠️ これらの機能はまだ正式にはリリースされていないため、今後、使用方法などが変更される可能性があります

deno compile - フレームワークの検出機能

deno compileコマンドにフレームワークの検出機能が追加されています:

deno compileの引数としてディレクトリが指定された場合、指定されたディレクトリ内に存在する設定ファイル (例: next.config.js)などに基づいてDenoが自動的にプロジェクトで使用されているフレームワークを検出し、必要に応じて該当フレームワーク向けのビルドコマンドを実行した上で、最終的に実行可能ファイルを作成してくれます。

現状、以下のフレームワークがサポートされているようです:

  1. Next.js
  2. Fresh
  3. Astro
  4. Nuxt
  5. SvelteKit
  6. Remix
  7. SolidStart
  8. TanStack Start
  9. Vite (SSR)

先週に紹介したdeno desktopコマンドにおいてフレームワークの検出機能の導入が検討されており、その一環の対応であると思われます。

catalog:プロトコル

カタログ機能を実装するPRがマージされています:

ワークスペースのルートにおけるdeno.jsonまたはpackage.jsonにおいてcatalogもしくはcatalogsプロパティーを定義しておくことで、pnpmなどと同様にワークスペースメンバーの各package.jsonにおいてカタログで定義されたパッケージのバージョンをcatalog:形式で参照することができます。

deno transpile

昨年に提案されていたdeno transpileコマンドが実装されています:

TypeScriptファイルをJavaScriptファイルにトランスパイルするためのコマンドで、--declarationオプションを指定することで.d.tsファイルの生成も行えるようです。

現在はクローズされていますが、以前にDenoからnpmパッケージの公開を行えるようにするためのdeno publish –npmの実装が進められており、deno transpileコマンドの追加はその一環である可能性もありそうです。

OffscreenCanvas

OffscreenCanvasが実装されています:

この対応に合わせてDeno.UnsafeWindowSurfacegetContext()メソッドにおける"bitmaprenderer"のサポートやheight/widthプロパティーの追加なども行われています。

Deno v2.7.14

Deno v2.7.14がリリースされています。

deno upgrade

bsdiffを活用したアップデートの効率化が行われています (#33274)

今回のリリースからGitHub Release*.bsdiffファイルがアップロードされており、これをダウンロードすることで差分アップデートが実現されるようです。

本挙動は--no-deltaオプションにより無効化できるようです。

deno x

deno xコマンドでjsrパッケージやhttps:形式のモジュールを実行した際に、引数の--unstable-*オプションが無視されてしまう問題が修正されています (#33450)

deno deploy

ワークスペースのルートでdeno deployを実行すると、各メンバーがデプロイ対象から除外されてしまう問題が修正されています (#33562)

Permissions

Deno v2.7.10におけるWindows向けの修正に続いて、macOSにおいても--allow-readなどのファイルシステム関連のパーミッションオプションが大文字や小文字の違いなどを考慮せずに権限チェックを行うように挙動が変更されています (#33451)

macOSのAPFSの挙動に合わせた変更のようです。

Web API

structuredClone()

シリアライズに対応していないオブジェクトをstructuredClone()に渡した際にDataCloneErrorthrowされるように挙動が修正されています (#33465, #33491)

Cache API

CacheStoragekeys()及びmatch()メソッドが実装されています (#33275)

MessageEvent

MessageEventの生成時にsourceオプションを指定した際に、生成されたMessageEventsourceプロパティーが設定されない問題が修正されています (#33500)

ReadableStreamBYOBRequest

ReadableStreamBYOBRequestviewプロパティーの型がArrayBufferViewからUint8Array<ArrayBuffer>に変更されています (#33477)

直近のSpec変更 (whatwg/streams#1367) に合わせた対応のようです。

Node.js互換性の改善

node:fs

下記APIが実装されています:

  • Utf8Stream (#33485)
  • mkdtempDisposableSync()/mkdtempDisposable() (#33533)
  • watch()ignoreオプション (#33610)
  • StatWatcherref()/unref()メソッド (#33408)
  • stat()及びlstat()throwIfNoEntryオプション (#33436)

node:net

下記APIが実装されています:

  • Server#listen()reusePortオプション (#33416)
  • createServer()及びcreateConnection()blockListオプション (#33417, #33414)
  • createConnection()signalオプション (#33414)
  • Server#[Symbol.asyncDispose]() (#33417)
  • BlockListtoJSON()/fromJSON()メソッド, rulesプロパティー, 及びBlockList.isBlockList() (#33445)
  • Socket#resetAndDestroy() (#33415)

node:http2

様々なバグ修正に加え、下記新規APIが実装されています:

  • ServerHttp2Stream#pushStream() (#33516)
  • createSecureServer()ALPNCallbackオプション (#33521)
  • createServer()strictFieldWhitespaceValidation, maxSessionInvalidFrames及びsettings.maxHeaderListSizeオプション (#33506, #33515, #33494)

node:dns

下記APIが実装されています:

  • reverse() (#33579)
  • Resolvertimeoutオプション及びcancel()メソッド (#33580)

node:cluster

下記APIの実装が行われています (#33493):

  • Worker
  • fork()
  • setupPrimary()
  • disconnect()
  • isMaster
  • isPrimary
  • workers
  • schedulingPolicy
  • settings
  • worker
  • isWorker

node:child_process

spawn()stdioオプションにおけるStreamオブジェクトの指定がサポートされています (#33525)

node:perf_hooks

eventLoopUtilization()が追加されています (#33581)

node:process

process.debugPortが実装されています (#33403)

node:timers

Timeout及びImmediate[Symbol.dispose]()メソッドが実装されています(#33528)

Node-API

napi_async_init()及びnapi_async_destroy()が実装されています (#33282)

dax v0.46.0

dax v0.46.0がリリースされています。

破壊的変更

Deno.*からnode:*への移行

daxの内部実装におけるファイルシステム関連の操作などにおいてDeno.* APIではなくnode:fsnode:processなどを使用するように変更されています (#364)。これにより各プラットフォーム間におけるdaxの互換性の改善が期待されるようです。

ユーザーへの影響として、エラー発生時にDeno.errors.*ではなくNode.js互換のエラーが発生するように挙動が変わります。

set -e

dax内部のシェルの実装が@david/shellパッケージとして独立されたようです。これに伴い、シェルにおいてset -eがデフォルトで有効化されているようです。以前までの振る舞いに戻したい場合は明示的にset +eを実行する必要があります。

$.select()

$.select()の戻り値がPromise<number>からPromise<SelectionItem>に変更されています。SelectionItemindexプロパティーとvalueプロパティーを提供します (#374)

新規API

新規APIとしてコマンドの出力内容をAsyncIterableIterator<string>として取り扱うためのlinesIter()メソッド (dsherret/shell#3) やユーザーに対して警告を表示するための$.alert() (#368)、beforeRequest()beforeCommand()などのライフサイクルフック (#373) などが追加されています。