虎の穴ラボ技術ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

Deno 1.44 へのアップデートと変更事項まとめ

皆さんこんにちは。おっくんです。

去る 2024 年 5 月 30 日に Deno 1.44 がリリースされました。
今回も、リリースノートを参考に変更事項の気になるところを紹介します。

Deno 1.44

Deno 1.44 での変更事項をDeno 1.44 リリースノートを元に確認します。

gRPC 接続のサポートが追加

Deno は @grpc/grpc-js を利用した gRPC サービスへの接続ができるようになりました。

これによりGoogle Cloud Platform が公開する gRPC サービスへ接続ができるようになります。 リリースノートでは、以下のサンプルが紹介されています。

import { ImageAnnotatorClient } from "npm:@google-cloud/vision";

const client = new ImageAnnotatorClient();
const [result] = await client.labelDetection("./cat_dog.webp");
const labels = result.labelAnnotations;
console.log("Labels:");
for (const label of labels) {
  console.log(" - ", label.description);
}

既存Node.jsアプリケーションでの gRPC クライアントを利用しているケースで移行が可能になってくることが見込めます。

Node.js との互換性向上

Deno 1.44 ではこれまで同様、Node.js との互換性向上に引き続き取り組まれています。 一連の互換性向上の施策により、Next.js アプリケーションを Deno で動作させることが可能になったそうです。 Next.js アプリケーションの実行のためには、DENO_FUTURE=1 を設定する必要がありますが、すぐにこれは使用せずに済む見込みとされています。

実際に動かしてみました。

$ deno -v
deno 1.44.0

$ DENO_FUTURE=1 deno run -A npm:create-next-app@latest
# 細かい記述は省略しますが、my-app 以下に作成しました。

$ cd my-app

$  deno task
Available tasks:
- dev (package.json)
    next dev
- build (package.json)
    next build
- start (package.json)
    next start
- lint (package.json)
    next lint

# package.json に記述された npm script が deno task で実行できます。

$ DENO_FUTURE=1 deno task dev -p 8080

このように実行すると、次のように Next.js アプリケーションを立ち上げた時の画面まで到達することができました

近日、Deno.land/blog にて、Next.js アプリケーションの実行方法についての記事が公開される予定だそうなので、より詳しい案内などを見たい方はそちらを待つとよいでしょう。

その他多数の修正が行われているので、詳細はリリースノートを参照してください。

パフォーマンスの改善

このリリースにより、メモリ効率と、パフォーマンスに関する改善が行われています。

  • V8 ポインターの圧縮によるメモリ使用量削減
    「V8 ポインターの圧縮」を有効にしたことで、ポインターの効率的な保存ができるようになったそうです。これにより、メモリ使用量が削減され、より多数のオブジェクト割り当てが行われるとき有効に働くそうです。
  • モジュール読み込み高速化
    CommonJSのエクスポート・再エクスポートの分析や出力、deno cache 処理中のTS->JSへのコンパイル他、多数の処理の並列化によりモジュール読み込みの最適化が行われました。 このことで、起動時間が高速になり、ダイナミックインポートを多用するアプリケーションでは起動が2~3倍高速になるそうです。
  • サーバーレスアプリケーションの応答性向上
    Write-Ahead Logging (WAL) ジャーナルをDENO_DIRに作成されるSQLite データベースに 使うことで、Deno インスタンスのコードキャッシュと、起動時間が高速化します。
    このことで、コールドスタートするサーバーレスアプリケーションの応答性の向上に寄与するそうです。

このほか、LSPサーバーのパフォーマンス向上が挙げられていました。

Deno.exitCodeAPI の追加

Deno.exitCodeAPIを使用することで、プログラムの終了コードを設定、取得できるようになりました。

以下のように確認できます。

$ cat exit_code_get.ts
console.log(Deno.exitCode);

$ deno run exit_code_get.ts
0
$ echo $?
0

デフォルトの終了コードは0でした。 設定する場合次のように使えます。

$ cat exit_code_set.ts
Deno.exitCode = 999;


$ deno run exit_code_set.ts
$ echo $?
231

Deno.exitCode = 999; のように設定すると231が設定されており、 Deno.exitCode = 232; とすると 232 が設定されます。

安直に設定したコードは返ってこなかったので注意が必要なようです。

時間がかかるテストのフィードバックを表示する

時間がかかるテストでは、見た目の動きが無く出力がない場合に、テストが進行しているかわかりにくいので、進行状況を表示するようになりました。

次のサンプルを使用します。

// app_test.ts
import { assertEquals } from "jsr:@std/assert";
import { delay } from "jsr:@std/async";

Deno.test("#1", async () => {
  await delay(130000);
  assertEquals(1,1);
})

こちらを動作させると次のようになります。

$ deno test app_test.ts
running 1 test from ./app_test.ts
#1 ...'#1' has been running for over (1m0s)
'#1' has been running for over (2m0s)
 ok (2m10s)

ok | 1 passed | 0 failed (2m10s)

60秒を超えると、進行状況が表示されました。

タイムアウト間隔は、環境変数、DENO_SLOW_TEST_TIMEOUT を使用することで調整できます。デフォルトは60秒に設定されており、DENO_SLOW_TEST_TIMEOUT*(2**n) で表示される時間が増えていきます。

$ DENO_SLOW_TEST_TIMEOUT=10 deno test app_test.ts
running 1 test from ./app_test.ts
#1 ...'#1' has been running for over (10s)
'#1' has been running for over (20s)
'#1' has been running for over (40s)
'#1' has been running for over (1m20s)
 ok (2m10s)

ok | 1 passed | 0 failed (2m10s)

以上のようにタイムアウト間隔を調整できました。

deno serve でポートのランダム選択を導入

deno serve でポートを指定しない場合、8000番ポートが使用されていました。 Deno 1.44 から、--port 0 を指定することで、OSにより選択されるランダムな空きポートが選択されるようになりました。

$ cat server.ts
export default {
  fetch(_request: Request) {
    return new Response("Hello Deno!");
  },
};

# ポート指定なし
$ deno serve server.ts
deno serve: Listening on http://localhost:8000/

# ポート指定あり
$ deno serve --port 3333 server.ts
deno serve: Listening on http://localhost:3333/

# ポートランダム指定
$ deno serve --port 0 server.ts
deno serve: Listening on http://localhost:38069/

# deno serve --port 0 server.ts
deno serve: Listening on http://localhost:41261/

# deno serve --port 0 server.ts
deno serve: Listening on http://localhost:36465/

# deno serve --port 0 server.ts
deno serve: Listening on http://localhost:43537/

DENO_FUTURE=1

DENO_FUTURE=1 環境変数を設定することで、将来の Deno 2で提供される変更を試すことができます。

新たに、--unstable-fs--unstable-webgpu--unstable-ffi のフラグが設定不要になることなどが挙げられています。

その他

  • Request#bytes() と Response#bytes() を導入
  • lint ルールの変更と追加
    • no-undefined-vars
    • no-boolean-literal-for-arguments
  • テスト実行時カバレッジディレクトリをクリーンアップする --clean を追加
    deno test --coverage --clean のように使用できます。
  • Deno.FsFile の安定化
    以下のメソッドが安定化。
    • Deno.FsFile.syncData[Sync]()
    • Deno.FsFile.sync[Sync]()
    • Deno.FsFile.unlock[Sync]()
    • Deno.FsFile.lock[Sync]()
  • FFI API の変更
    ネイティブ型でu64かi64は、numberかbigintとしてDeno で取り扱っていましたが、これをbigintに統一されました。
  • WebSocket ping/pong タイムアウトの変更
    Deno の WebSocket のタイムアウトは、デフォルトで 120 秒でしたが、30秒に変更されました。 一般的なリバースプロキシのタイムアウト時間が60秒であることから、接続が切れることが起きていたための対応です。
  • 言語サーバーの改善

Deno 1.44 の変更点を確認しました。

Deno test の進行状況表示については、テストツールなどをシングルバイナリに含むDenoならではの拡張だと感じます。 また、Viteが動作するようになった時に一定のNode.js互換性のラインを達成したと感じましたが、Next.js が動作するようになることで、また1つラインを超えると感じます。 まだDenoをさわっていない方に、おすすめできる理由になるかもしれないと感じました。

次回もまた追いかけていきます。

採用情報

虎の穴では一緒に働く仲間を募集中です!

この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。

カジュアル面談やエンジニア向けイベントも随時開催中です。ぜひチェックしてみてください。 toranoana-lab.co.jp