Deno v1.44がリリースされました。
この記事では主な変更点などについて解説します。
Node.js互換性の改善
.npmrc
のサポート
プライベートレジストリからnpmパッケージを読み込むために、.npmrc
のサポートが追加されています。
現時点ではpackage.json
またはdeno.json
と同一ディレクトリにある.npmrc
のみが探索されます (ホームディレクトリなどからの読みこみはまだサポートされていません)
.npmrc
の設定内容はnpm:
などによりnpmパッケージを利用する場合に適用されます。設定内容としては、現時点では_authToken
と_auth
のみがサポートされています。
組み込みパッケージ
主にgrpc-nodeやNext.js, Eleventyなどに関連したNode.js組み込みパッケージの互換性が改善されています。
Next.jsのサポートについて
公式ブログによると、DENO_FUTURE=1
の指定が必要なもののNext.jsが動作するようになったようです (後日ブログポストが公開予定とのこと)
@google-cloud/vision
のサポート
@google-cloud/visionも動作するようになったようです。
主な変更点
node:buffer
:isUtf8
とisAscii
が実装されていますnode:fs
:fstatSync
でthrowIfNoEntry
オプションがサポートされていますnode:fs
:write
などでposition
引数がうまく機能しない問題が修正されていますnode:http
:ServerResponse
でstatusCode
のデフォルト値がundefined
から200
に変更されています- @11ty/eleventy-dev-serverを動かすための対応 (#78)
node_modules/.bin
Denoがnode_modules
を作成する際に、node_modules/.bin
が作成されるようになりました。
$ deno run --allow-env --allow-read --node-modules-dir npm:cowsay@1.6.0 hi
$ ls node_modules/.bin
cowsay cowthink
deno.lock
サポート
今までdeno.lock
はdeno.json
がある場合は自動的に生成されていました。今回のリリースでpackage.json
がある場合にも自動でdeno.lock
が作成されるように挙動が変更されました。
またDENO_FUTURE=1
が設定された状態でdeno install
を実行した際に、deno.lock
をベースにパッケージを解決することによりパフォーマンスの改善も図られています (#23918)
deno task
deno task
でスクリプトを実行する際に、そのスクリプトでnpm run
が利用されていて かつ npm run
にフラグが指定されていなければ、npm run
をdeno task
に置きかえた上でpackage.json
のスクリプトが実行されるように挙動が変更されています。
例えば、以下のような内容のdeno.json
とpackage.json
が存在する場合、deno task test
を実行すると、package.json
のhi
スクリプトが実行されます。
deno.json
:
{
"tasks": {
"hi": "echo deno.json",
"test": "npm run hi"
}
}
package.json
:
{
"scripts": {
"hi": "echo package.json"
}
}
Deno API
Deno.exitCode
Deno.exitCode
が追加されました。process.exitCode
と同様に、プロセス終了時の終了コードを設定することができます。
$ deno eval 'Deno.exitCode = 1;’
$ echo $?
1
FFI (Deno.dlopen
)
i64
とu64
型がnumber | bigint
型からbigint
型で取り扱われるように変更されています。
安定化
Deno.FsFile
Deno.FsFile
の下記メソッドが安定化されました。(--unstable-fs
なしで利用できます)
sync
syncSync
syncData
syncDataSync
lock
lockSync
unlock
unlockSync
DENO_FUTURE=1
DENO_FUTURE=1
が設定された場合、下記の機能を--unstable-*
オプションなしで利用できるようになりました。
- FFI (
Deno.dlopen
など) - WebGPU API
- unstableなファイルシステムAPI (
Deno.umask
など)
Deno.upgradeWebSocket
のidleTimeout
のデフォルト値の変更
Deno.upgradeWebSocket
のidleTimeout
オプションのデフォルト値が120
から30
に変更されています。Nginxなどはデフォルトで60秒を想定しており、その影響で120秒だと想定よりも早くDeno.upgradeWebSocket
でWebSocket接続が切れてしまう問題があったようです。
Web API
Request#bytes()
/Response#bytes()
Request
とResponse
でbytes
メソッドがサポートされました。リクエストまたはレスポンスのボディをUint8Array
として取得できます
const response = new Response("OK");
const body = await response.bytes();
console.assert(body instanceof Uint8Array);
console.assert(new TextDecoder().decode(body) === "OK");
ReadableStream.from
の改善
ReadableStream.from
でIterableIterator
だけでなくIterable
もサポートされました。
const readable = ReadableStream.from({
[Symbol.iterator]() {
let done = false;
return {
next() {
if (done) {
return { done: true };
} else {
done = true;
return { value: 123, done: false };
}
},
};
},
});
console.info(await Array.fromAsync(readable)); // => [ 123 ]
また、ReadableStream.from
でSymbol.asyncIterator
/Symbol.iterator
の取り扱いが改善されています。これらにnull
が設定されていた場合に、undefined
が指定された場合と同様に振る舞うように挙動が変更されています。
CLI
deno test
時間がかかっているテストケースへの警告
deno test
でテストケースの実行に時間がかかっている場合に警告が表示される機能が追加されました。
デフォルトではDENO_SLOW_TEST_TIMEOUT*(2**n)
ごとの間隔で警告が表示されます (DENO_SLOW_TEST_TIMEOUT
のデフォルト値は60
のため、60秒 → 120秒 → 240秒…といった間隔で警告が表示されます)
$ DENO_SLOW_TEST_TIMEOUT=5 deno test test.js
running 1 test from ./test.js
slowTestCase ...'slowTestCase' has been running for over (5s)
'slowTestCase' has been running for over (10s)
'slowTestCase' has been running for over (20s)
--clean
オプションが追加
deno test
コマンドに--clean
オプションが追加されています。--coverage
オプションとの併用が想定されていて、このオプションが指定されている場合はテストの実行前にcoverage
ディレクトリが削除されます。
deno coverage
deno coverage
コマンドで--ignore
オプションが動作しない問題が修正されています。また、coverage
ディレクトリにリモートスクリプト(https:
)に対するjsonファイルが生成されてしまう問題も解消されています。
deno lint
no-boolean-literal-for-arguments
ルールの追加
no-boolean-literal-for-arguments
ルールが実装されています。以下のようにboolean
リテラルを関数の引数として指定している箇所に対して警告されます。
function renderReport(verbose: boolean) {
// ...
}
renderReport(true); // => エラー
renderReport(false); // => エラー
以下のように定数を利用することで警告を解消できます。
const VERBOSE = true;
const CONCISE = false;
function renderReport(verbose: boolean) {
// ...
}
renderReport(VERBOSE);
renderReport(CONCISE);
このルールはデフォルトでは無効化されているため、利用する際はdeno.json
などで明示的に有効化する必要があります。
{
"lint": {
"rules": {
"include": ["no-boolean-literal-for-arguments"]
}
}
}
no-unused-vars
ルールの改善
no-unused-vars
ルールがJSX/TSXファイルでも動作するように改善されています。
deno serve
deno serve
コマンドの--port
オプションに0
を指定した場合、ランダムな空きポートが採番されるように改善されました。
vendor
vendor
ディレクトリ(deno.json
に"vendor": true
を指定すると作成されます)のリモートファイルを編集しても、deno.lock
による検証でエラーが発生しないように挙動が改善されています。
deno -v
deno -v
でバージョンを表示できます。
$ deno -v
deno 1.44.0
パフォーマンス改善
メモリ消費の改善
v8のPointer Compressionを有効化することで、メモリ使用量の最適化が図られています。
キャッシュ用のSQLiteデータベースでWALモードが有効化
DENO_DIR
配下に作成される各種キャッシュ用のSQLiteデータベースでjournal_mode=WAL
が適用されるようになりました。(v8コードキャッシュやdeno lint
, tsc
による型チェックの高速化などで活用されています)
これにより起動の高速化などが期待されるようです。この変更の影響でデータベースのファイル名がv2に変更されています (例: $DENO_DIR/v8_code_cache_v2
)
node_modules
node_modules
のセットアップに関するパフォーマンスが改善されています。特にmacOSではcopyfile
の代わりにclonefile
を使うようにする最適化が導入されており、大幅な改善が見込まれるようです。(#23980)
処理の並列化
swcによるソースの解析などを並列化することで、スクリプトの起動の高速化が図られています。
バグ修正
Deno.writeFile
にReadableStream
を渡すと、元のファイルの内容が部分的に置き換えられてしまう問題が修正されています。