Deno v1.46がリリースされました。
この記事では主な変更点などについて解説します。
Deno v2.0について
今回のv1.46がDeno v1.xにおける最後のリリースのようです。
Deno v2.0については、正式リリース前にまずはRCバージョンから順次リリースされていく想定のようです (後述のdeno upgrade
でもRCバージョンへのアップグレードがサポートされています)
今回のv1.46では、おそらくv2.0に向けて、CLIのオプションやUIに関する様々な改善が行われています。
CLI
deno clean
deno clean
という新しいコマンドが追加されました。
このコマンドを実行すると、Denoのグローバルキャッシュディレクトリ(DENO_DIR
)を削除してくれます。
deno remove
deno remove
という新しいコマンドが追加されました。
引数で指定されたパッケージの定義がdeno.json
とdeno.lock
から削除されます。
# `deno.json`の`imports`と`deno.lock`から`@std/assert`を削除します
$ deno remove @std/assert
deno <entrypoint>
deno run
コマンドにおけるrun
の指定の省略がサポートされました。
# `deno run --allow-read main.ts`と同様に動作します
$ deno --allow-read main.ts
deno run <task>
deno run
コマンドでdeno.json
で定義されたタスクの実行がサポートされました。
例えば、以下のように実行すると、deno.json
のtasks.dev
で定義されたスクリプトが実行されます (deno run
の引数としてJavaScriptまたはTypeScriptファイルを指定した場合は、今まで通りそのスクリプトが実行されます)
$ deno run dev
この変更に合わせて、エントリポイントを指定せずにdeno run
コマンドを実行した場合、deno.json
のtasks
で定義されたスクリプトの一覧を表示する機能が追加されています (引数なしでdeno task
コマンドを実行した場合と同じ振る舞いをします)
$ deno run
Available tasks:
- dev
deno serve --watch -R main.ts
追記: 引数なしでdeno run
を実行した際にタスクの一覧を表示する機能は、Deno v2.0.0-rc.3で削除されています。
パーミッションフラグの短縮形式
各種--allow-*
オプションの短縮形式がサポートされました:
パーミッションフラグ | 短縮形 |
---|---|
--allow-read | -R |
--allow-write | -W |
--allow-net | -N |
--allow-env | -E |
--allow-sys | -S |
例えば、以下はdeno run --allow-read --allow-env main.ts
と同等です:
$ deno -ER main.ts
--allow-run
や--allow-ffi
など、短縮形式が導入されていないフラグもあり、--allow-run
については-X
という形式で導入が提案されているようです。
deno serve
--parallel
オプション
deno serve
で--parallel
オプションがサポートされています。
このオプションが指定された場合、deno serve
はコア数またはDENO_JOBS
で指定された値に基づいて、リクエストを複数のワーカーへ分散してくれます。
$ DENO_JOBS=2 deno serve --parallel main.ts
deno serve: Listening on http://0.0.0.0:8000/ with 2 threads
Deno.ServeDefaultExport
Deno.ServeDefaultExport
という型が追加されています。
deno serve
のエントリポイントとして指定するモジュールでdefault export
するオブジェクトの型として利用することが想定されています。
export default {
fetch(req) {
return new Response("OK");
},
} satisfies Deno.ServeDefaultExport;
deno init --serve
deno serve
と@std/http/route
を使ったプロジェクトのテンプレートを作成してくれます:
$ deno init --serve
# `deno serve --watch`によって`main.ts`が実行されます
$ deno run dev
deno fmt
YAML/CSS/LESS/Sass/SCSS/HTML/Svelte/Vue/Astroのサポート
deno fmt
コマンドで以下の形式のファイルがサポートされました:
- YAML
- CSS
- LESS
- Sass
- SCSS
- HTML
- Component (Svelte/Vue/Astro/Angular)
現時点ではまだ実験的機能という扱いのため、これらに対してフォーマットを行う場合は--unstable-*
を指定して有効化する必要があります:
# YAMLファイルをフォーマット
$ deno fmt --unstable-yaml test.yml
# HTMLファイルをフォーマット
$ deno fmt --unstable-html test.html
# CSSファイルをフォ−マット
$ deno fmt --unstable-css test.css
# Vueファイルをフォーマット
$ deno fmt --unstable-component Test.vue
または、deno.json
のunstable
フィールドによって有効化することも可能です:
{
"unstable": [
"fmt-yaml",
"fmt-html",
"fmt-css",
"fmt-component"
]
}
deno compile
コード署名
MacとWindows向けにdeno compile
で生成されたバイナリーへのコード署名がサポートされています。
--icon
Windows向けに--icon
オプションによるアイコン(.ico
)の設定がサポートされました。
deno test
--permit-no-files
deno test
コマンドでテストファイルが見つからなかった際にエラーが発生するのを抑止するための--allow-none
オプションが--permit-no-files
にリネームされました
--allow-none
はまだ残ってはいるものの、Deno v2.0で削除予定のようです
--hide-stacktraces
--hide-stacktraces
オプションが追加されています。このオプションを指定すると、失敗したテストケースのテスト結果においてスタックトレースが表示されなくなります。
$ deno test --hide-stacktraces
--watch=<PATHS>
deno test
で--watch
オプションへのパスの指定がサポートされています。
deno lint
no-node-globals
ルール
no-node-globals
ルールが導入されました。
process
やBuffer
などのNode.jsのグローバルAPIへの参照が検出されると、node:process
やnode:buffer
などから読み込むことが促されます。
--ext
--ext
オプションが追加されています。
標準入力経由でJSXやTSXに対してLintを行いたい場合に使用することが想定されているようです:
$ some-command | deno lint --ext=jsx -
deno upgrade
deno upgrade [VERSION]
deno upgrade
コマンドで--version
オプションを使わずに引数として直接バージョンを指定できるようになりました:
# v1.46.0へのアップグレード
$ deno upgrade 1.46.0
# canaryバージョンへのアップグレード
$ deno upgrade canary
RCバージョンへのアップグレード
RCバージョンへのアップグレードもサポートされています:
# v1.46.0-rc.0へアップグレード
$ deno upgrade v1.46.0-rc.0
deno coverage
パンくずリストのサポート
deno coverage --html
でHTMLレポートを生成する際に、パンくずリストが出力されるよう改善されています。
deno add
dist tagsのサポート
npmパッケージをインストールする際のdist tagsの指定がサポートされています:
$ deno add npm:react@latest
ルートのエントリーポイントが未定義のパッケージがサポート
@std/testing
などのルートのエントリポイントが未定義のパッケージ(deno.jsonにexports["."]: "./mod.ts"
のような定義がないパッケージ)をdeno add
でインストールしようとすると、エラーが発生する問題が修正されています。
npm:
の指定漏れに関するエラーメッセージの改善
以下のようなエラーメッセージが出力されます:
# Deno v1.46
$ deno add react
error: jsr:react was not found, but a matching npm package exists. Did you mean `deno add npm:react`?
deno publish
ライセンスチェック
deno publish
でライセンスが未定義のパッケージを公開しようとした際に、エラーが発生するように挙動が変更されています。
これを回避するためには、deno.json
またはjsr.json
でlicense
フィールドを定義するか、パッケージを公開する際にLICENSEファイルを含める必要があります。
deno check
& deno cache
glob形式のサポート
deno check
とdeno cache
コマンドの引数をglob形式で指定できるように改善されています:
$ deno check 'tests/**/*.ts'
deno.lock
deno.json
のlock
フィールドでオブジェクト形式の設定がサポート
deno.json
のlock
フィールドでオブジェクトの指定がサポートされました:
{
"lock": {
"frozen": true
}
}
現状ではfrozen
フィールドがサポートされており、true
を指定すると--frozen
オプションと同様の効果を発揮します。
deno.lock
v4
deno.lock
の新しいバージョンであるv4が実装されています。
現状のdeno.lock
の形式であるv3よりも軽量化され、git diff
などによって差分が確認しやすくなるよう改善されているようです。
現時点ではまだ実験的機能という扱いであり、v4を利用するにはDENO_FUTURE=1
を指定する必要があります。(Deno v2.0からデフォルトで有効化される想定のようです)
JSRパッケージへのパッチ
実験的機能として、JSRパッケージにパッチを当てる機能が実装されています。
この機能を利用する際は、以下のようにdeno.json
でpatch
フィールドを定義します:
{
"imports": {
"@std/ulid": "jsr:@std/ulid@^1.0.0"
},
"patch": [
"./patches/std_ulid"
]
}
./patches/std_ulid/deno.json
には、上記のdeno.json
のimports
で定義されたバージョン要求にマッチするようにパッケージのメタ情報を定義しておく必要があります:
{
"name": "@std/ulid",
"version": "1.0.0",
"exports": {
".": "./mod.js"
}
}
このように設定された場合、@std/ulid
を読み込む際はjsr:@std/ulid@^1.0.0
ではなく、./patches/std_ulid/mod.js
が読み込まれます:
// `jsr:@std/ulid@^1.0.0`ではなく、`./patches/std_ulid/mod.js`が読み込まれます
import * as ulid from "@std/ulid";
この機能はまだ実験的機能のため、今後、使い方などが変更される可能性があります。
HMR
--unstable-hmr
が--watch-hmr
にリネームされ、HMR機能が安定化されました。
--env-file
--env-file
オプションが追加されています。
振る舞いは--env
と全く同じですが、他のランタイムとの一貫性の改善のためにこのオプションが導入されたようです。
UIの改善
ヘルプの改善
ヘルプの表示が改善されており、関連するオプションごとにグループ化することで、より使い方を確認しやすいように改善されています
この改善に伴い、--unstable-*
系統のフラグがデフォルトではヘルプに表示されないように挙動が変更されています
もし--unstable-*
について確認したい場合は、--help=unstable
を指定する必要があります
$ deno run --help=unstable
ダウンロード時などの進捗表示
npmパッケージのダウンロード時などに進捗状況が表示されるよう改善されています。
deno json_reference
ヘルプに関する表示の改善に併せて、deno json_reference
という新規コマンドが追加されています。ヘルプの内容をJSON形式で出力してくれるようです。
Node.js互換性の改善
Playwrightやshelljsなどのパッケージに関するサポートが改善されているようです。
また、先程紹介したdeno add
でnpmパッケージをインストールする際のdist tagsの指定もサポートされています。
.npmrc
.npmrc
でのusername
と_password
の設定がサポートされました。
非推奨化パッケージの警告
非推奨化されたnpmパッケージのインストール時に警告が表示されるように改善されています。
組み込みパッケージの改善
node:vm
node:vm
の再実装が行われており、Node.jsとの互換性が改善されています。
また、compileFunction()
やScript#createCachedData
, Script.sourceMapURL
などが実装されています。
node:crypto
互換性の改善のためにnode:crypto
が再実装されています。これに合わせて、様々なアルゴリズムのサポートが追加されています (feat(ext/node): rewrite crypto keys (#24463))
また、新しく以下のAPIが実装されています:
Cipher#setAutoPadding
X509Certificate#publicKey
diffieHellman()
node:child_process
spawn()
などのstdio
オプションに4つ以上の要素が設定できるように改善されています。この改善により、MacとLinux限定でPlaywrightが動作するようです。
また、child_process.execFile
などでパッケージ内に含まれるスクリプトを実行するようなnpmパッケージがあった場合、意図せぬ動作をする問題が解消されています。(shelljs
などのパッケージのサポートを想定した変更のようです)
node:fs
read()
とwrite()
でUint8Array
以外のTypedArray
を渡せるように改善されています。
破壊的変更
廃止されたTemporal APIが削除
Temporal APIに関して、廃止された以下のAPIが削除されています (#24836)
Temporal.Instant.fromEpochSeconds()
Temporal.Instant.fromEpochMicroseconds()
Temporal.Instant.epochSeconds
Temporal.Instant.epochMicroseconds
Temporal.PlainDate#getCalendar
Temporal.PlainDateTime#getCalendar
Temporal.PlainDateTime#withPlainDate
Temporal.PlainDateTime#toPlainYearMonth
Temporal.PlainDateTime#toPlainMonthDay
Temporal.PlainMonthDay#getCalendar
Temporal.PlainTime#toPlainDateTime
Temporal.PlainTime#toZonedDateTime
Temporal.TimeZoneProtocol#getNextTransition
Temporal.TimeZoneProtocol#getPreviousTransition
Temporal.TimeZone#equals
Temporal.TimeZone#getNextTransition
Temporal.TimeZone#getPreviousTransition
Temporal.PlainYearMonth#getCalendar
Temporal.ZonedDateTime#getTimeZone
Temporal.ZonedDateTime#getCalendar
Temporal.ZonedDateTime#withPlainDate
Temporal.ZonedDateTime#toPlainYearMonth
Temporal.ZonedDateTime#toPlainMonthDay
Temporal.Now.zonedDateTime
Temporal.Now.plainDateTime
Temporal.Now.plainDate
WebAPU
GPUAdapter#requestAdapterInfo
が削除され、代わりにGPUAdapter.info
が追加されています (#24783)
Import Assertions
Import Assertionsの使用時に警告が表示されるようになりました。
Import Assertionsは削除予定のため、Import Attributesへの移行が推奨されます。
Deno API
Deno.watchFs
Deno.watchFs
でrename
イベントがサポートされました。
Web API
fetch()
fetch
のbody
でAsyncIterable<Uint8Array>
の指定がサポートされています:
import { createReadStream } from "node:fs";
const stream = createReadStream("./data.txt");
const res = await fetch("http://localhost:8000/upload", {
method: "POST",
body: stream
});
URLPattern
ignoreCase
オプションとhasRegExpGroups
プロパティーがサポートされています。(#24741)
V8
Denoの内部で使用されているV8がv12.9へアップデートされています。