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
が設定されない問題が修正されました。