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.jsondeno.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.jsontasks.devで定義されたスクリプトが実行されます (deno runの引数としてJavaScriptまたはTypeScriptファイルを指定した場合は、今まで通りそのスクリプトが実行されます)

$ deno run dev

この変更に合わせて、エントリポイントを指定せずにdeno runコマンドを実行した場合、deno.jsontasksで定義されたスクリプトの一覧を表示する機能が追加されています (引数なしで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.jsonunstableフィールドによって有効化することも可能です:

{
  "unstable": [
    "fmt-yaml",
    "fmt-html",
    "fmt-css",
    "fmt-component"
  ]
}

deno compile

コード署名

MacWindows向けに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ルールが導入されました。

processBufferなどのNode.jsのグローバルAPIへの参照が検出されると、node:processnode: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.jsonlicenseフィールドを定義するか、パッケージを公開する際にLICENSEファイルを含める必要があります。

deno check & deno cache

glob形式のサポート

deno checkdeno cacheコマンドの引数をglob形式で指定できるように改善されています:

$ deno check 'tests/**/*.ts'

deno.lock

deno.jsonlockフィールドでオブジェクト形式の設定がサポート

deno.jsonlockフィールドでオブジェクトの指定がサポートされました:

{
  "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.jsonpatchフィールドを定義します:

{
  "imports": {
    "@std/ulid": "jsr:@std/ulid@^1.0.0"
  },
  "patch": [
    "./patches/std_ulid"
  ]
}

./patches/std_ulid/deno.jsonには、上記のdeno.jsonimportsで定義されたバージョン要求にマッチするようにパッケージのメタ情報を定義しておく必要があります:

{
  "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互換性の改善

Playwrightshelljsなどのパッケージに関するサポートが改善されているようです。

また、先程紹介した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.watchFsrenameイベントがサポートされました。

Web API

fetch()

fetchbodyAsyncIterable<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へアップデートされています。

参考