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

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

Temporalサポート

DenoでTemporal がサポートされました。利用するには--unstable-temporalの指定が必要です。

Temporal.Now.instant();

今のところTemporalのサポートはv2での安定化が検討されているようです。

Decorators proposal (stage 3)のサポート

⚠️ V8でまだサポートされていない関係で.jsファイルではまだ動作しないようなためご注意 (.tsなどのトランスパイルされるファイルでのみ動作します)

TypeScript v5で導入されたDecorators (stage 3)がDenoでもサポートされました。

これに伴い、今までデフォルトで有効化されていたTypeScriptのexperimentalDecoratorsは無効化されたため、もし利用したい場合はdeno.jsonで明示的に有効化する必要があります。

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}

TypeScript5で導入されたStage 3のDecoratorを眺めてみる | 豆蔵デベロッパーサイト

deno.json

importsnpm:URLのマッピングを定義する際の挙動の改善 (Import map expansion)

npmパッケージが提供するサブパスの読み込みに関する挙動が改善されています。

例えば、deno.jsonでImport Mapsを定義しておき、npm:なしでmswmsw/nodeを読み込みたい場面があったとします。

import { http, HttpResponse } from "msw";
import { setupServer } from "msw/node";

const server = setupServer(
  http.get(`${location.origin}/api/user`, () =>
    HttpResponse.json({
      id: 1,
      name: "foo",
    })),
);

この場合、v1.39までは以下のように記述する必要がありました。

{
  "imports": {
    "msw": "npm:msw@2.0.8",
    "msw/": "npm:/msw@2.0.8/"
  }
}

このリリースでは、以下のように記述しておくだけで、自動で対象パッケージのサブパスへの読み込みが行えるよう挙動が改善されました。

{
  "imports": {
    "msw": "npm:msw@2.0.8"
  }
}

deno check

unstable APIに関する取り扱いの変更

deno checkなどにより型チェックを行う場合、もし対象のコードがunstable APIを利用しており、対象のAPIが--unstableオプションなどにより有効化されていないと型エラーが発生していました。

この挙動が変更され、型チェックを行う際は常にunstable APIが有効化されるようになりました。

この挙動は型チェック時のみに適用され、deno runなどでスクリプトを実行する場合は、今まで通り明示的にunstable APIの使用を許可する必要があります。

非推奨化

--unstableオプション

v1.38--unstable-kvなどのオプションが導入され、有効化したいunstable APIをより細かく制御できるようになりました。

これに伴い--unstableオプションが非推奨化されました。使用した際は以下のような警告が表示されるため、各種--unstable-*オプションやdeno.jsonunstableオプションによる管理への移行が推奨されます。

⚠️  The `--unstable` flag is deprecated and will be removed in Deno 2.0. Use granular `--unstable-*` flags instead.

window

windowが非推奨化されました。今後はglobalThisまたはselfへの置き換えが推奨されます。

以下のissueで解説されていますが、DenoでSSRなどを行いたい際に、windowが存在することにより、意図せずしてブラウザであると判定されてしまうことを避けたいことなどが背景のようです。

remove window variable (#13367)

deno lintを使うとwindowを使用している箇所が警告されるため、活用すると便利そうです。

Deno API

ridDeno.Reader/Deno.Writerに関連したAPIなどが非推奨化されています。非推奨化されたAPIを使おうとすると、deno lintまたはそのAPIの使用時に警告が表示されます。

warning: Use of deprecated "Deno.metrics()" API. This API will be removed in Deno 2.
対象API移行先
Deno.runDeno.Command
Deno.serveHttpDeno.serve
Deno.metrics--strace-ops
Deno.iter/Deno.iterSync
Deno.copystd/io/copy.ts
Deno.readAll/Deno.readAllSyncstd/io/read_all.ts
Deno.writeAll/Deno.writeAllSyncstd/io/write_all.ts
Deno.Bufferstd/io/buffer.ts
Deno.FsWatcher.returnDeno.FsWatcher.close
Deno.customInspectSymbol.for("Deno.customInspect")
Deno.isattyDeno.{stdin,stdout,stderr}.isTerminal()
Deno.closeDeno.FsFile.close/Deno.Conn.closeなど
Deno.resourcesなし (deno testはデフォルトでリソースリークのチェックを行ってくれるため、必要性が低いと判断されたようです。)
Deno.ftruncate/Deno.ftruncateSyncDeno.FsFile.truncate/Deno.FsFile.truncateSync
Deno.{Conn,FsWatcher,FsFile,Listener,stdin,stdout,stderr}.rid各種オブジェクトが提供するメソッドへの移行が推奨されています。
Deno.fstat/Deno.fstatSyncDeno.FsFile.stat/Deno.FsFile.statSync
Deno.shutdownDeno.Conn.closeWrite
Deno.fsync/Deno.fsyncSyncDeno.FsFile.sync/Deno.FsFile.syncSync
Deno.fdatasync/Deno.fdatasyncSyncDeno.FsFile.dataSync/Deno.FsFile.dataSyncSync
Deno.futime/Deno.futimeSyncDeno.FsFile.utime/Deno.FsFile.utimeSync
Deno.read/Deno.readSync各種オブジェクトが提供するread/readSyncメソッド
Deno.write/Deno.writeSync各種オブジェクトが提供するwrite/writeSyncメソッド
Deno.seek/Deno.seekSyncDeno.FsFileseek/seekSyncメソッド
Deno.ListenTlsOptions.certFile/Deno.ListenTlsOptions.keyFilecert/keyオプション
Deno.ConnectTlsOptions.certFilecaCertsオプション

安定化

deno jupyter

利用にあたって--unstableオプションの指定が不要になりました。(機能自体はまだunstableという扱いのため、使用方法などに変更が入る可能性はあります。)

Deno API

以下のAPIが安定化されています。--unstableなしで利用することができます。

  • Deno.connect/Deno.listentransport: "unix"オプション(Unixドメインソケット)
  • Deno.Connref/unrefメソッド
  • Deno.ConnectTlsOptionscertChain/privateKeyオプション
  • Deno.TlsConn.handshakeメソッド

非推奨化された削除/APIの削除

以下の機能/APIが削除されました。

Web API

rejectionhandledのサポート

このイベントはunhandledrejectionpreventDefaultを呼んだときのみ発火されるようになります。


Window: rejectionhandled event - Web APIs | MDN

createImageBitmap

createImageBitmapが実装されています。

External WebGPU surfaces / BYOW (Bring your own Window)

Deno.UnsafeWindowSurfaceが追加されました。

deno_sdl2@0.8.0dwm@0.3.4ではこの機能のサポートが追加されていて、これによりWebGPUを活用して高速にレンダリングが行えるようです。


deno lint

no-consoleルールが実装

consoleを使用している箇所に対して警告をしてくれます。デフォルトでは無効化されているため、必要な際はdeno.jsonなどで明示的に有効化する必要があります。

{
  "lint": {
    "rules": { "include": ["no-console"]}
  }
}

ディレクティブへの補足説明の記述がサポート

deno lintのディレクティブに説明文が書けるように改善されています。--に続けて、対象のルールを無効化する背景や意図などを書くことができます。

// some_script.ts
try {
  await doTask();
} catch (error) {
  // deno-lint-ignore no-console -- This is intended.
  console.error(error);
  Deno.exit(1);
}

deno lint/deno docの出力フォーマットの改善

deno lintなどのコマンドの出力フォーマットが改善されています。今後、deno checkにも同様の変更が入る予定とのことです。

v1.40:

error[no-array-constructor]: Array Constructor is not allowed
 --> /home/uki00a/ghq/github.com/uki00a/deno-samples/main.js:1:1
  | 
1 | new Array(123, 4, 5, 6);
  | ^^^^^^^^^^^^^^^^^^^^^^^
  = hint: Use array literal notation (e.g. []) or single argument specifying array size only (e.g. new Array(5)

  docs: https://lint.deno.land/#no-array-constructor


Found 1 problem
Checked 1 file

v1.39:

(no-array-constructor) Array Constructor is not allowed
new Array(123, 4, 5, 6);
^^^^^^^^^^^^^^^^^^^^^^^
    at /home/uki00a/ghq/github.com/uki00a/deno-samples/main.js:1:1

    hint: Use array literal notation (e.g. []) or single argument specifying array size only (e.g. new Array(5)
    help: for further information visit https://lint.deno.land/#no-array-constructor

Found 1 problem
Checked 1 file

import.meta.filename/import.meta.dirname

console.info(import.meta.filename); // 現在のモジュールのファイル名
console.info(import.meta.dirname); // 現在のモジュールのファイルを含むディレクトリ名

リモートモジュール内で参照された場合、これらにはundefinedが設定されます。

deno.lockworkspaceセクションが追加

deno.lockworkspaceへプロジェクトが依存しているnpm/jsrパッケージの一覧を書き込む機能が追加されています。

{
  "workspace": {
    "dependencies": [
      "npm:msw@2.0.8"
    ],
    "packageJson": {
      "dependencies": [
        "npm:chalk@5.3.0"
      ]
    }
  }
}

deno.jsonimportsから依存されているnpm/jsrパッケージはworkspace.dependencies

package.jsonで定義されている依存パッケージはworkspace.packageJsonに書き込まれるようです。

また、deno.json/package.jsonから特定のnpm/jsrパッケージの依存を削除すると、deno.lockworkspaceセクションからも自動で削除されるようです。

もしワークスペース機能を活用している場合は、workspace.members配下で同様にして各ワークスペースごとのnpm/jsrパッケージについて追跡されるようです。


https://github.com/denoland/deno_lockfile/pull/13

Node.js互換性の改善

  • node:process: rejectionhandledのサポートに合わせてrejectionHandledがサポートされています。
  • node:fs: promises.readFileを引数なしで呼ぶときちんとエラーが発生するように改善されました。
  • node:fs/promises: constantsが公開されました。
  • node:http: IncomingMessage.socketremoteAddressremotePortが設定されない問題が修正されました。

参考