Deno v1.27がリリースされました。
この記事では主な変更点などについて解説します。
npmパッケージサポートの改善
Deno v1.25で追加されたnpmパッケージのサポートに関する改善が実施されています。
型チェックのサポート
npm:
で読み込んだnpmパッケージに対して型定義が適用されるようになりました
これにより、deno check
などのコマンドを実行した際に、npmパッケージを使用しているコードについても適切に型チェックが実行されます。
import { default as stringWidth } from "npm:string-width@5.1.2";
console.info(stringWidth("foo")); // => 3
console.info(stringWidth(123)); // => 型エラー
このように、型定義ファイルを同梱したパッケージについては、自動でそれが読み込まれて適用されます。
型定義ファイルを同梱していないパッケージについては、@deno-types
を使用することで型定義を適用することができます。
// @deno-types="npm:@types/express@4.17.14"
import { default as express } from "npm:express@4.18.2";
console.info(express("foo")); // => 型エラー
Node-APIのサポート
Deno本体にNode-APIのサポートが入りました。
Node-APIは、CやC++などを使用してネイティブアドオンを記述するためにNode.jsから提供されている仕組みです。
import { compress, uncompress } from "npm:lz4-napi@2.2.0"
const data = await Deno.readFile("./deno.json");
const compressed = await compress(data);
const uncompressed = await uncompress(compressed);
Node-APIのサポートが入ったことにより、例えば、Prismaのクエリエンジンやnode-sqlite3などのパッケージも動かせる可能性が出てきました。
アップデートチェッカー
Denoにアップグレードチェッカーが導入されました。
deno run
コマンドを実行した際に、1日につき1回、バックグラウンドで新しいバージョンがリリースされているか自動で確認されます。
$ deno run main.ts
A new release of Deno is available: 1.27.0 → 1.27.1
Run `deno upgrade` to install it.
この挙動を無効化したいときはDENO_NO_UPDATE_CHECK
環境変数に1
を設定する必要があります。
ロックファイル v2
--lock-write
オプションによって出力されるロックファイルで新しいフォーマット(v2)が導入されています。
$ deno run --unstable --lock=lock.json --lock-write main.ts
新しいフォーマットが導入された背景として、Deno v1.25でnpmパッケージのサポートが導入されたため、それらについてもロックファイルで管理できるようにすることが目的のようです。
v1.26までの既存のフォーマット(v1)については引き続きサポートされます。
deno lsp
でInlay Hints(textDocument/inlayHint
)がサポート
Visual Studio CodeではInlay Hintsはデフォルトでは無効化されており、vscode_denoを最新バージョンにアップデートし、"editor.inlayHints.enabled"
に"on"
などを設定すると有効化されます。
また、vscode_deno
では、Inlay Hintsの挙動を制御するために、様々なオプションが提供されています。
オプション | 説明 | デフォルト |
---|---|---|
deno.inlayHints.enumMemberValues.enabled | true を設定すると、enum値に対するヒントが表示されます | false |
deno.inlayHints.functionLikeReturnTypes.enabled | true を設定すると、関数の暗黙的に推論された戻り値の型がヒントとして表示されます | false |
deno.inlayHints.parameterNames.enabled | 関数の引数名に関するヒントの表示を制御できます。設定値は"none" /"literals" /"all" のいずれかです | "none" |
deno.inlayHints.parameterNames.suppressWhenArgumentMatchesName | true を設定すると、関数の呼び出し時に、変数名が対応する引数名に一致する場合、ヒントが表示されなくなります。 | true |
deno.inlayHints.parameterTypes.enabled | true を設定すると、暗黙的に推論された引数の型に関するヒントが表示されます。 | false |
deno.inlayHints.propertyDeclarationTypes.enabled | true を設定すると、暗黙的なプロパティ定義に関するヒントが表示されます。 | false |
deno.inlayHints.variableTypes.enabled | true を設定すると、暗黙的に推論された変数の型に関するヒントが表示されます | false |
deno.inlayHints.variableTypes.suppressWhenTypeMatchesName | true を設定すると、変数名が暗黙的に推論された型に一致する場合にヒントが表示されなくなります。 | true |
deno task
の改善
警告メッセージの削除
deno task
のリリース以降、様々な改善が実施されたこともあり、実行時の警告メッセージが削除されました。
今後は、deno task
の実行時に、以下のメッセージが表示されなくなります。
$ deno task benchmark
Warning deno task is unstable and may drastically change in the future
...
sleep
コマンドの改善
サフィックスがサポートされました。
{
"tasks": {
"sleep-test": "sleep 5s && echo 'foobar'"
}
}
複数のコマンドを並列で実行する際の挙動が変更
以下のように、複数のコマンドを並列で実行する際の挙動が変更されています。
{
"tasks": {
"test-async": "exit 1 & exit 0"
}
}
v1.26までは、いずれかのコマンドが失敗しても、残りのコマンドは実行され続けていました。
v1.27では、いずれか一つでもコマンドが失敗したら、タスク全体が失敗するように挙動が変更されました。
# v1.27.0
$ deno task test-async
$ echo $?
1
# v1.26.0
$ deno task test-async
$ echo $?
0
V8がv10.8へアップデート
大きな変更点として、Change Array by copyがサポートされています。
[1, 2, 3].toReversed() // => [3, 2, 1]
[4, 2, 10, 5].toSorted() // => [10, 2, 4, 5]
[1, 2, 3, 4].toSpliced(1, 2) // => [1, 4]
[1, 2, 3].with(1, 20) // => [1, 20, 3]
unstable APIの安定化
下記のAPIが安定化されました。
今後は--unstable
を指定せずに利用できます。
Deno.consoleSize()
- 安定化に合わせて、
rid
を引数として受け取らないよう変更されています (Denoが標準入出力のいずれかからコンソールのサイズを自動で判定して返却してくれます)
- 安定化に合わせて、
Deno.osRelease()
Deno.stdin.setRaw()
Deno.futime()
Deno.futimeSync()
Deno.loadavg()
Deno.utime()
Deno.utimeSync()
navigator.language
とnavigator.languages
がサポート
navigator.languageには、OSの言語設定に関する文字列が設定されます。
navigator.language; // => "ja-JP"
また、LC_ALL
が設定されている場合、navigator.language
はそれを元に設定されます。
その他の新機能
Deno.listen()
とDeno.listenTls()
でreusePort
オプションがサポートtrue
を指定すると、SO_REUSEPORT
が設定されます。- 現在では、Linuxのみがサポートされていて、利用する際は
--unstable
の指定が必要です
Deno.listenDatagram()
でreuseAddress
オプションがサポートtrue
を指定すると、WindowsやLinuxではSO_REUSEADDR
が設定され、それ以外のUnix環境ではSO_REUSEPORT
が設定されます。
deno.json(c)
でlint.report
オプションがサポートdeno lint
実行時の出力形式をカスタマイズすることができ、pretty
/json
/compact
のいずれかを指定できます。
その他の変更点
- (破壊的変更)
Deno.listen()
によってUnixドメインソケットを開く際に、Denoの内部で行われていたソケットファイルの削除処理が廃止されています。- 今後は、必要であれば、利用者が自前でソケットファイルを削除する必要があります
Deno.kill()
とDeno.Process.kill()
のsignal
引数がオプショナルに変更 (デフォルトでSIGTERM
が送信されます)Deno.getGid()
がDeno.gid()
に、Deno.getUid()
がDeno.uid()
にリネームされています。
バグ修正
- 別の箇所でも参照中のTCPソケットに対して
Deno.startTls()
などを呼んだ際にプロセスがパニックしないように修正 (詳細については、magurotunaさんの下記記事で詳しく解説されています) deno upgrade
コマンドの実行時に、Denoの実行可能ファイルのパーミッションを確認し、書き込み権限がなければ、アップグレードせずに処理が終了するように挙動が改善されていますError.prototype.cause
に設定されたエラーで循環参照が発生している際も適切にエラーの内容が表示されるように修正deno repl
で不正なURLをimportしようとすると、処理が停止する問題が修正されています。