Deno v1.29がリリースされました。
この記事では主な変更点などについて解説します。
サブプロセスAPIに関する変更
Deno.spawn
, Deno.spawnSync
, Deno.spawnChild
の削除
Deno v1.28でDeno.Command
が実装されたため、下記のAPIが削除されています。
Deno.spawn
Deno.spawnSync
Deno.spawnChild
このあたりの背景などについては、下記の記事で詳しく解説されています。
また、Deno.Command
についてもv1.28.3でAPIが若干変更されています。
Deno.spawn
系統のAPIからDeno.Command
への移行について
Deno.spawn()
はDeno.Child#output()
, Deno.spawnSync()
はDeno.Child#outputSync()
で代用できます。
const command = new Deno.Command("deno", {
args: ["info", "--json"],
});
const status = await command.output();
if (status.success) {
console.info(new TextDecoder().decode(status.stdout));
}
Deno.spawnChild()
はDeno.Child#spawn()
で代用できます。
const command = new Deno.Command("deno", {
args: ["fmt", "--ext=json", "-"],
stdin: "piped",
stdout: "piped"
});
const child = command.spawn();
const file = await Deno.open("deno.json");
file.readable.pipeTo(child.stdin);
const status = await child.status;
if (status.success) {
const output = [];
for await (const x of child.stdout.pipeThrough(new TextDecoderStream())) {
output.push(x);
}
console.info(output.join(''));
}
Deno.Command#spawn
のstdout
とstderr
オプションのデフォルト値が"inherit"
に変更
Deno.Command
の作成時にstdout
やstderr
オプションが未設定の場合、これらのオプションのデフォルト値が"inherit"
に変更されています。
Deno.Command#output
やDeno.Command#outputSync
については引き続き"piped"
がデフォルト値として扱われます。
Node.js互換性の改善
NPM_CONFIG_REGISTRY
環境変数
Denoはデフォルトでhttps://registry.npmjs.orgからnpmパッケージをダウンロードします。
今回のリリースからNPM_CONFIG_REGISTRY
環境変数がサポートされ、npmパッケージをダウンロードする際のレジストリをカスタマイズできるようになりました。
$ NPM_CONFIG_REGISTRY=https://registry.npmjs.org/ deno run --allow-env --allow-read --allow-write npm:make-dir-cli@3.0.0 ./path/to/dir
将来のリリースでは、パッケージスコープごとのレジストリや認証情報の設定などをサポートすることなども検討されているようです。
deno install
でのnpm:
のサポート
deno install
コマンドでnpmパッケージから提供されるコマンドのインストールがサポートされました。(Deno v1.28.1)
例えば、下記はmake-dir-cliパッケージをインストールする例です。
$ deno install --allow-env --allow-read --allow-write npm:make-dir-cli@3.0.0
$ which make-dir-cli
/home/uki00a/.deno/bin/make-dir-cli
deno.json(c)
に関する改善
bench
フィールドのサポート
deno.json(c)
でdeno bench
のカスタマイズがサポートされました。
現在ではbench.files.include
フィールドとbench.files.exclude
によるファイルの絞り込みがサポートされています。
{
"bench": {
"files": {
"include": ["./benchmark"]
}
}
}
ロックファイルに関する挙動の制御
deno.json(c)
でロックファイルに関する挙動を制御できるようになりました。
例えば、lock: false
を指定することでロックファイルの適用を無効化できます(--no-lock
相当の挙動)
{
"lock": false
}
また、lock
オプションにパスを指定することで、ロックファイルの名前をカスタマイズすることも可能です。
{
"lock": "./lock.json"
}
deno init
コマンドの改善
deno init
コマンドで新しくdeno.jsonc
及びmain_bench.ts
の生成がサポートされました。
$ deno init ./my-deno-project
$ ls ./my-deno-project
deno.jsonc main.ts main_bench.ts main_test.ts
REPLの改善
deno repl
コマンドのパーミッションが変更
deno repl
コマンドを実行した際は、デフォルトで一切の権限がない状態でREPLが起動するように挙動が変更されています。
Deno v1.28までは、deno repl
コマンドは全ての権限が許可された状態でREPLを起動していましたが、これはDenoの"secure by default"の考えに反するということが変更の背景のようです。
ただし、deno
コマンドを単独で実行した場合は、引き続き全ての権限が与えられた状態でREPLが起動されます。
この変更に伴い、deno repl
コマンドで--allow-read
や--allow-net
などのオプションがサポートされています。
$ deno repl --allow-read
npm:
のサポート
REPLでnpmパッケージの読み込みがサポートされています。
$ deno repl --allow-env --allow-read
Deno 1.29.1
exit using ctrl+d, ctrl+c, or close()
> import chalk from "npm:chalk@5.0.0";
undefined
> chalk.green("foobar");
"\x1b[32mfoobar\x1b[39m"
deno lint
コマンドなどでnode_modules
や.git
が無視されるように
元々、deno fmt
コマンドではnode_modules
や.git
が無視されていましたが、deno lint
などのコマンドではこれらのディレクトリは無視されませんでした。
今回のリリースでは、deno lint
などのコマンドでもデフォルトでnode_modules
や.git
が無視されるようになり、一貫性が向上しています。
新しいCLIオプション
deno check
コマンドで--all
オプションがサポート
deno run
コマンドでリモートモジュールも含む全コードの型チェックを行いたい場合、下記のように--check=all
オプションを指定する必要があります。
$ deno run --check=all mod.ts
それに対して、deno check
コマンドでリモートモジュールも含む全コードの型チェックを行う場合は、下記のように--remote
オプションを指定する必要がありました。
$ deno check --remote mod.ts
同様の挙動を実現するために、deno run
では--check=all
を指定するのに対して、deno check
では--remote
を指定する必要があり、オプションに一貫性がないという課題がありました。
この問題を解消するために、deno check
コマンドで--all
オプションがサポートされました。
# Deno v1.28における`deno check --remote`と同様の振る舞いをします
$ deno check --all mod.ts
--inspect-wait
オプション
元々、Denoには--inspect
と--inspect-brk
というデバッガに関する2種類のオプションがありました。
これらのオプションはそれぞれ下記のように動作します。
--inspect
:
- デバッガを有効化する
- コードを実行する
--inspect-brk
:
- デバッガを有効化する
- デバッガとの間でセッションが確率されるまで待機する
- コードの最初の行で実行をストップする
今回のリリースでは、新しく--inspect-wait
オプションが追加されています。
挙動としては、--inspect
と--inspect-brk
の中間のような振る舞いをします。
- デバッガを有効化する
- デバッガとの間でセッションが確率されるまで待機する
- コードを実行する
Deno.TcpConn
のsetNoDelay
とsetKeepAlive
メソッドが安定化
Deno v1.19で実装されたsetNoDelay
メソッドとsetKeepAlive
メソッドが安定化されました。
今後は--unstable
オプションなしでこれらのAPIを利用できます。
Deno.writeFile
でcreateNew
オプションがサポート
Deno.writeFile
にcreateNew
オプションが追加されています。
await Deno.writeFile(path, content, { createNew: true });
このオプションにtrue
が指定された場合、対象ファイルが新しく作成されます。
もし対象のファイルがすでに存在する場合はエラーが発生します。
このオプションのデフォルト値はfalse
です
Deno.dlopen
の型推論が改善
例えば、下記のようにDeno.dlopen
を呼んだとします。
const lib = Deno.dlopen({
doSomething: {
parameters: ["i32", "bool"],
result: "i8",
},
});
Deno v1.28ではlib.doSomething
の引数の型はArray<number | boolean>
として推論されます。
今回のリリースではlib.doSomething
の引数が[number, boolean]
型として推論されるように改善され、使い勝手が向上しています。
TypeScript v4.9
Denoの内部に搭載されているTypeScriptのバージョンがv4.9.3へアップデートされました。
これにより、Denoでもsatisfies
オペレータなどを活用できるようになりそうです。
その他のバグ修正
別の
Request
オブジェクトから新しいRequest
を作る際に、options
が直接変更されてしまう問題が修正されています。const req = new Request("https://example.com/", { method: "POST", body: "foobar" }); new Request(req, { body: "foo" }); await req.text(); // v1.28: "foo", v1.29: "foobar"
deno compile
コマンドでdeno.json(c)
で指定されたImport Mapsファイルが無視されてしまう問題が修正されています。プログラム中で
npm:
が使用されていて かつ--inspect-brk
などでデバッガが有効化されている場合、ランタイムエラーが報告されなくなる問題が修正--allow-ffi
の挙動の改善- 例えば、
--allow-ffi=somelib
のようにパスを指定した際に、下記のような読み込みが許可されるようになりました。
Deno.dlopen("somelib/lib.so", symbols);
- 例えば、
deno vendor
コマンドで名前がhttp
で始まるbare import文が適切に処理されない問題が修正されています。