Deno v1.45がリリースされました。
この記事では主な変更点などについて解説します。
ワークスペース
先週紹介したワークスペースに関する改善が正式にリリースされました。
deno.json
でワークスペースを定義するためのworkspaces
キーがworkspace
にリネームされています。
また、オブジェクト形式でワークスペースに関する設定が定義できるようになりました (cli/schemas/config-file.v1.json#L607-L629)
{
"workspace": {
"members": ["./member1", "./member2"]
}
}
現時点では設定項目としてworkspace.members
のみが存在しますが、今後、追加される可能性もありそうです。
このworkspace.members
にはdeno.json
を含むディレクトリだけでなく、package.json
を含むディレクトリをワークスペースのメンバーとして指定することもできるようです。
deno_std
でもすでに新しいフォーマットへ移行されているようです。
Node.js互換性の改善
npm workspacesのサポート
先週紹介したnpm workspacesに関するサポートが正式にDenoに導入されました。Denoがpackage.json
のworkspaces
キーを認識してくれます。
以下のようなワイルドカード形式でのワークスペースメンバーの指定もサポートが導入されています。
{
"workspaces": ["packages/*"]
}
また、deno publish
コマンドでもnpm workspacesに関するサポートが導入されているようです。#24507によると、以下のような構成のプロジェクトにおいてdeno publish
を実行すると、packages/member-1
とpackages/member-2
がJSRに公開されるようです。
- project/
package.json
("workspaces": ["packages/*"]
が設定)- packages/
- member-1/
pakcage.json
jsr.json
- member-2/
package.json
jsr.json
- member-1/
ライフサイクルスクリプトのサポート
deno cache
またはDENO_FUTURE=1 deno install
でライフサイクルスクリプトの実行がサポートされています。公式ブログでも紹介されているduckdb-nodeを例に使い方について紹介します。
まず、Denoはdeno cache
またはDENO_FUTURE=1 deno install
によってライフサイクルスクリプトを含むnpmパッケージがダウンロードされた際に、デフォルトではライフサイクルスクリプトを実行せずに以下のような警告を表示します。
$ deno cache npm:duckdb@1.0.0
warning: Packages contained npm lifecycle scripts (preinstall/install/postinstall) that were not executed.
This may cause the packages to not work correctly. To run them, use the `--allow-scripts` flag with `deno cache`
(e.g. `deno cache --allow-scripts=pkg1,pkg2 <entrypoint>`):
npm:duckdb@1.0.0
--allow-scripts
オプションにパッケージ名を指定することで、対象のパッケージに限定してライフサイクルスクリプトの実行を許可することができます。
$ deno cache --allow-scripts=npm:duckdb@1.0.0 npm:duckdb@1.0.0
現時点での制限として、この--allow-scripts
が機能するためには"nodeModulesDir": true
が設定されている必要があります。
{
"nodeModulesDir": true
}
.npmrc
Deno v1.44で導入された.npmrc
サポートが改善され、ユーザーのホームディレクトリにある.npmrc
の読み込みがサポートされました。
ただし、複数の.npmrc
のマージはまだサポートされておらず、プロジェクトルート直下に.npmrc
がある場合は、そちらがホームディレクトリのものよりも優先して読み込まれます
Node.js組み込みパッケージの改善
様々な改善が行われており、node-tapが動作するようになったようです。
node:fs
:lutimes
とlutimesSync
が実装されています。node:fs
:lchown
とlchownSync
が実装されています。node:http
:ServerResponse#appendHeader
が実装されています。node:http
:ClientRequest#end
を呼ぶまでHTTPリクエストが送信されない問題が修正されています。node:http
:Transfer-Encoding: chunked
を有効化した場合、サーバーがhangする問題が修正されています。node:http
: リクエストの送信前にClientRequest#destroy
を呼ぶとエラーが発生する問題が修正されています。node:http
:ServerResponse#writeHead
で未実装だったwriteHead(status: number, headers: Record<string, string> = {}): this
以外のシグネチャがサポートされています。node:crypto
:Hash
が再実装され、様々なハッシュアルゴリズムのサポートが追加されているようです (#24302)node:assert
:assert.throws
の2つめの引数にError
コンストラクタが与えられた際に、throwされたエラーが該当クラスのインスタンスであることがチェックされるように改善されました。node:zlib
: リソースリークが修正されています。node:process
:getegid
が実装されています。
その他
--allow-sys
にnode:fs
やnode:os
, node:process
などの各API向けにパーミッションが追加されています。
username
cpus
homedir
statfs
getPriority
setPriority
また、npmパッケージの外部でBuffer
などのNode.jsのグローバルAPIを参照した際に、エラーが発生せずにundefined
が返却される問題が修正されています。
CLI
--frozen
/--frozen-lockfile
オプションが追加
DenoにCIなどでの利用が想定された--frozen
(--frozen-lockfile
)オプションが追加されています。このオプションが指定された場合、deno.lock
の内容と実際に使用されているパッケージのバージョンに差異がある場合にエラーが発生します。もし--frozen
オプションによってエラーが発生した際は、deno.lock
を更新する(--frozen=false
)かまたは使用する依存パッケージのバージョンをdeno.lock
で指定されたバージョンにあわせると解消するはずです。
$ deno test --allow-net --no-check --frozen-lockfile ./test
バージョンが合わない場合は、以下のようなエラーが発生します。
error: The lockfile is out of date. Run `deno cache --frozen=false` or rerun with `--frozen=false` to update it.
changes:
24 | - "npm:@nestjs/common@^10.3.9": "npm:@nestjs/common@10.3.9_reflect-metadata@0.2.2_rxjs@7.8.1",
24 | + "npm:@nestjs/common@^10.3.10": "npm:@nestjs/common@10.3.10_reflect-metadata@0.2.2_rxjs@7.8.1",
25 | - "npm:@nestjs/core@^10.3.9": "npm:@nestjs/core@10.3.9_@nestjs+common@10.3.9__reflect-metadata@0.2.2__rxjs@7.8.1_reflect-metadata@0.2.2_rxjs@7.8.1",
25 | + "npm:@nestjs/core@^10.3.10": "npm:@nestjs/core@10.3.10_@nestjs+common@10.3.10__reflect-metadata@0.2.2__rxjs@7.8.1_reflect-metadata@0.2.2_rxjs@7.8.1",
125 | - "@nestjs/common@10.3.9_reflect-metadata@0.2.2_rxjs@7.8.1": {
125 | + "@nestjs/common@10.3.10_reflect-metadata@0.2.2_rxjs@7.8.1": {
126 | - "integrity": "sha512-JAQONPagMa+sy/fcIqh/Hn3rkYQ9pQM51vXCFNOM5ujefxUVqn3gwFRMN8Y1+MxdUHipV+8daEj2jEm0IqJzOA==",
126 | + "integrity": "sha512-H8k0jZtxk1IdtErGDmxFRy0PfcOAUg41Prrqpx76DQusGGJjsaovs1zjXVD1rZWaVYchfT1uczJ6L4Kio10VNg==",
131 | - "tslib": "tslib@2.6.2",
131 | + "tslib": "tslib@2.6.3",
135 | - "@nestjs/core@10.3.9_@nestjs+common@10.3.9__reflect-metadata@0.2.2__rxjs@7.8.1_reflect-metadata@0.2.2_rxjs@7.8.1": {
135 | + "@nestjs/core@10.3.10_@nestjs+common@10.3.10__reflect-metadata@0.2.2__rxjs@7.8.1_reflect-metadata@0.2.2_rxjs@7.8.1": {
136 | - "integrity": "sha512-NzZUfWAmaf8sqhhwoRA+CuqxQe+P4Rz8PZp5U7CdCbjyeB9ZVGcBkihcJC9wMdtiOWHRndB2J8zRfs5w06jK3w==",
136 | + "integrity": "sha512-ZbQ4jovQyzHtCGCrzK5NdtW1SYO2fHSsgSY1+/9WdruYCUra+JDkWEXgZ4M3Hv480Dl3OXehAmY1wCOojeMyMQ==",
138 | - "@nestjs/common": "@nestjs/common@10.3.9_reflect-metadata@0.2.2_rxjs@7.8.1",
138 | + "@nestjs/common": "@nestjs/common@10.3.10_reflect-metadata@0.2.2_rxjs@7.8.1",
145 | - "tslib": "tslib@2.6.2",
145 | + "tslib": "tslib@2.6.3",
221 | - "tslib": "tslib@2.6.2"
221 | + "tslib": "tslib@2.6.3"
234 | - "tslib@2.6.2": {
234 | + "tslib@2.6.3": {
235 | - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
235 | + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
261 | - "npm:@nestjs/common@^10.3.9",
261 | + "npm:@nestjs/common@^10.3.10",
262 | - "npm:@nestjs/core@^10.3.9"
262 | + "npm:@nestjs/core@^10.3.10"
deno init --lib
deno init
に--lib
オプションが追加されました。このオプションはJSRパッケージ向けのプロジェクトを作成したい場合に使用されることが想定されていて、下記の3ファイルのみが含まれるプロジェクトが作成されるようです。
deno.json
mod.ts
mod_test.ts
deno compile --env
deno compile
で--env
オプションがサポートされています。このオプションを指定すると、.env
ファイルで宣言された環境変数がdeno compile
によって生成されるバイナリーの中に埋め込まれます。
deno compile
によって生成されたバイナリーでDeno.env.get
が呼ばれた場合、--env
オプションによってバイナリーに埋め込まれた環境変数がある場合はそれが返却されます。
この--env
を指定した場合、.env
で宣言された変数がバイナリーの中に埋め込まれるため、機密情報などは含めないように取り扱いには注意が必要そうです。
deno jupyter
Jupyter Notebook (deno jupyter)でprompt
とconfirm
がサポートされています。こちらについてはDenoの公式ブログに動画があるため、そちらを参照いただくとイメージしやすいかと思います。
また、公式ブログによると、今後、deno jupyter
でJSXなどによってインタラクティブなウィジェットを作成できるようにすることなども検討されているようです。
deno test
deno test
コマンドでJestなどと同様に__tests__
ディレクトリに配置されたテストファイルが検出されるように改善されています。
deno lsp
deno lspにおける複数のdeno.json
の取り扱いが改善されています。具体的には、検出された各deno.json
ごとに、型チェックや依存解決などの挙動が分離されたようです。
TypeScript v5.5
Deno本体に組み込まれているTypeScriptのバージョンがv5.5.2へアップデートされています。Inferred Type Predicatesなどの機能が利用できるようになりそうです。
破壊的変更
--lock-write
の非推奨化
--frozen
(--frozen-lockfile
)オプションの導入に合わせて、--lock-write
が非推奨化されました。
--lock-write
と同様のことを行いたい場合は、今後は--frozen=false
を指定する必要があります。
deno vendor
コマンドが非推奨化
deno vendor
コマンドが非推奨化されました。
今後はdeno.json
で"vendor": true
を指定するか--vendor
オプションを使用することが推奨されます。
ForeignFunction.callback
の削除
ForeignFunction.callback
がFFIなどの改善により不要になったため、削除されています。
Web API
Blob#bytes
新規APIとしてBlob#bytes
が実装されています。
バグ修正
deno check
型チェックが必要無い際はcompilerOptions.types
で指定された型定義がダウンロードされないように挙動が改善されています。
deno task
カレントディレクトリなどの変更の操作がsubshellの外部にも伝播してしまう問題が修正されています。
Windows
Denoがホームディレクトリを探索する際にUSERPROFILE
環境変数が参照されるように挙動が変更されているようです。
WebGPU
TypeScriptの型定義においてGPUUncapturedErrorEvent
がEvent
ではなくEventTarget
のサブクラスとして定義されていた問題が修正されています。