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
importsでnpm:URLのマッピングを定義する際の挙動の改善 (Import map expansion)
npmパッケージが提供するサブパスの読み込みに関する挙動が改善されています。
例えば、deno.jsonでImport Mapsを定義しておき、npm:なしでmswとmsw/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.jsonのunstableオプションによる管理への移行が推奨されます。
⚠️ 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が存在することにより、意図せずしてブラウザであると判定されてしまうことを避けたいことなどが背景のようです。
deno lintを使うとwindowを使用している箇所が警告されるため、活用すると便利そうです。
Deno API
ridやDeno.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.run | Deno.Command |
Deno.serveHttp | Deno.serve |
Deno.metrics | --strace-ops |
Deno.iter/Deno.iterSync | |
Deno.copy | std/io/copy.ts |
Deno.readAll/Deno.readAllSync | std/io/read_all.ts |
Deno.writeAll/Deno.writeAllSync | std/io/write_all.ts |
Deno.Buffer | std/io/buffer.ts |
Deno.FsWatcher.return | Deno.FsWatcher.close |
Deno.customInspect | Symbol.for("Deno.customInspect") |
Deno.isatty | Deno.{stdin,stdout,stderr}.isTerminal() |
Deno.close | Deno.FsFile.close/Deno.Conn.closeなど |
Deno.resources | なし (deno testはデフォルトでリソースリークのチェックを行ってくれるため、必要性が低いと判断されたようです。) |
Deno.ftruncate/Deno.ftruncateSync | Deno.FsFile.truncate/Deno.FsFile.truncateSync |
Deno.{Conn,FsWatcher,FsFile,Listener,stdin,stdout,stderr}.rid | 各種オブジェクトが提供するメソッドへの移行が推奨されています。 |
Deno.fstat/Deno.fstatSync | Deno.FsFile.stat/Deno.FsFile.statSync |
Deno.shutdown | Deno.Conn.closeWrite |
Deno.fsync/Deno.fsyncSync | Deno.FsFile.sync/Deno.FsFile.syncSync |
Deno.fdatasync/Deno.fdatasyncSync | Deno.FsFile.dataSync/Deno.FsFile.dataSyncSync |
Deno.futime/Deno.futimeSync | Deno.FsFile.utime/Deno.FsFile.utimeSync |
Deno.read/Deno.readSync | 各種オブジェクトが提供するread/readSyncメソッド |
Deno.write/Deno.writeSync | 各種オブジェクトが提供するwrite/writeSyncメソッド |
Deno.seek/Deno.seekSync | Deno.FsFileのseek/seekSyncメソッド |
Deno.ListenTlsOptions.certFile/Deno.ListenTlsOptions.keyFile | cert/keyオプション |
Deno.ConnectTlsOptions.certFile | caCertsオプション |
安定化
deno jupyter
利用にあたって--unstableオプションの指定が不要になりました。(機能自体はまだunstableという扱いのため、使用方法などに変更が入る可能性はあります。)
Deno API
以下のAPIが安定化されています。--unstableなしで利用することができます。
Deno.connect/Deno.listenのtransport: "unix"オプション(Unixドメインソケット)Deno.Connのref/unrefメソッドDeno.ConnectTlsOptionsのcertChain/privateKeyオプションDeno.TlsConn.handshakeメソッド
非推奨化された削除/APIの削除
以下の機能/APIが削除されました。
--promptオプション (v1.19でパーミッションプロンプトの表示がデフォルト化されたため)Deno.upgradeHttp(今後はDeno.serveとDeno.upgradeWebSocketの使用が推奨されます)Deno.cron- 最後の引数としてoptionsを受け取る形式が削除されています。
Web API
rejectionhandledのサポート
このイベントはunhandledrejectionでpreventDefaultを呼んだときのみ発火されるようになります。
Window: rejectionhandled event - Web APIs | MDN
createImageBitmap
createImageBitmapが実装されています。
External WebGPU surfaces / BYOW (Bring your own Window)
Deno.UnsafeWindowSurfaceが追加されました。
deno_sdl2@0.8.0やdwm@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);
}
- https://github.com/denoland/deno_lint/releases/tag/0.53.0
- https://github.com/denoland/deno_lint/releases/tag/0.54.0
- https://github.com/denoland/deno_lint/releases/tag/0.55.0
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.lockにworkspaceセクションが追加
deno.lockのworkspaceへプロジェクトが依存しているnpm/jsrパッケージの一覧を書き込む機能が追加されています。
{
"workspace": {
"dependencies": [
"npm:msw@2.0.8"
],
"packageJson": {
"dependencies": [
"npm:chalk@5.3.0"
]
}
}
}
deno.jsonのimportsから依存されているnpm/jsrパッケージはworkspace.dependencies、
package.jsonで定義されている依存パッケージはworkspace.packageJsonに書き込まれるようです。
また、deno.json/package.jsonから特定のnpm/jsrパッケージの依存を削除すると、deno.lockのworkspaceセクションからも自動で削除されるようです。
もしワークスペース機能を活用している場合は、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.socketのremoteAddressとremotePortが設定されない問題が修正されました。