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"などを設定すると有効化されます。

deno-lsp-inlay-hints.png

また、vscode_denoでは、Inlay Hintsの挙動を制御するために、様々なオプションが提供されています。

オプション説明デフォルト
deno.inlayHints.enumMemberValues.enabledtrueを設定すると、enum値に対するヒントが表示されますfalse
deno.inlayHints.functionLikeReturnTypes.enabledtrueを設定すると、関数の暗黙的に推論された戻り値の型がヒントとして表示されますfalse
deno.inlayHints.parameterNames.enabled関数の引数名に関するヒントの表示を制御できます。設定値は"none"/"literals"/"all"のいずれかです"none"
deno.inlayHints.parameterNames.suppressWhenArgumentMatchesNametrueを設定すると、関数の呼び出し時に、変数名が対応する引数名に一致する場合、ヒントが表示されなくなります。true
deno.inlayHints.parameterTypes.enabledtrueを設定すると、暗黙的に推論された引数の型に関するヒントが表示されます。false
deno.inlayHints.propertyDeclarationTypes.enabledtrueを設定すると、暗黙的なプロパティ定義に関するヒントが表示されます。false
deno.inlayHints.variableTypes.enabledtrueを設定すると、暗黙的に推論された変数の型に関するヒントが表示されますfalse
deno.inlayHints.variableTypes.suppressWhenTypeMatchesNametrueを設定すると、変数名が暗黙的に推論された型に一致する場合にヒントが表示されなくなります。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には、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しようとすると、処理が停止する問題が修正されています。

参考