虎の穴開発室ブログ

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

MENU

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

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

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

Deno 1.43

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

Deno LSP サーバーの高速化

LSPサーバーはオートコンプリート機能などを提供しています。 多数のファイルを含むような大規模プロジェクトでは、パフォーマンスの問題があることを一部のユーザーから報告されていたそうです。

今回のリリースでは、レスポンスとメモリ消費が改善され、6~8秒かかっていたオートコンプリートを 1秒未満に短縮できるようになったとのことです。

リリースノート記事では比較の動画も公開されているので、興味がある方はぜひご覧ください。

Node.js、npm との互換性

node:worker_threads node:vm のふたつのモジュールについて、数多くの改善が行われているそうです。

これらのモジュールは、Jest Vitest などのテストランナーやDocusaurus などで、使用されるそうです。
SolidStartや、各種フレームワークとの互換性の向上は、DENO_FUTURE=1 を設定することで確認できます。
また、現在 Next.jsのサポートも取り組んでいるそうです。 現在はNext.jsを使うためにいくつかのunstableなフラグの設定が必要ですが、それらの安定化を目指すそうです。

詳細な対応内容については、一覧があるのでリリースノート本体や、githubのリリースを参照してください。

ES Modules、CommonJS Modules の読み込み高速化

このリリースでは、V8 コードキャッシュがサポートされ、モジュールの解析とコンパイルが大幅に高速化したそうです。 Deno 社のテストでは、起動が5%から240%高速化したとのことです。

コードキャッシュについては、V8のブログに詳しい情報が記されているので一度読んでみるのがいいかもしれません。

v8.dev

v8.dev

deno serve サブコマンドが追加

deno serve サブコマンドが追加されました。

次のようにソースコードを用意します

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

deno serve で実行するには、次のようにします。

$ deno serve ./server.ts
deno serve: Listening on http://localhost:8000/

http://localhost:8000/ にアクセスすると、Hello Deno! が表示されます。 これまでの、Deno run ~~ のような使い方とは異なり、必要なアクセス許可フラグ --allow-net は自動で設定されます。

起動に必要な --allow-net は設定されますが、次のようなコードの場合には実行時にアクセス許可が求められます。

export default {
  async fetch(_request: Request) {
    const res = await fetch("https://example.jp")
    return new Response("Hello Deno!");
  },
};

実行すると、次のようにアクセス許可が求められます。

$ deno serve ./server.ts
deno serve: Listening on http://localhost:8000/
┌ ⚠️  Deno requests net access to "example.jp".
├ Requested by `fetch()` API.
├ Run again with --allow-net to bypass this prompt.
└ Allow? [y/n/A] (y = yes, allow; n = no, deny; A = allow all net permissions) >

また、deno serve は、--host --port フラグが提供されています。次のように使用できます。

$deno serve --host 0.0.0.0 --port 8888 ./server.ts
deno serve: Listening on http://localhost:8888/

リリースノートには、起動時のhostが0.0.0.0になるように書かれていますが、手元の確認では、コンソールへの出力は localhost になっていました。

将来的には、複数のCPUコアを使い自動的な負荷分散も見込んでいるとのことです。

Deno.serve() が改善

応答完了が取れるようになった

Deno.ServeHandlerInfo.completed が提供され、応答が完了したかどうかを確認できるようになりました。 リリースノートでは次のようなコードが紹介されています。

Deno.serve((_req, info) => {
  info.completed.then(() => {
    console.log("Response sent successfuly!");
  }).catch(() => {
    console.error("Failed sending the response.");
  });

  return new Response("Hello world");
});

これを実行し、アクセスすると、コンソールに Response sent successfuly! が表示されます。

「応答したか?」がポイントになるようで、new Response("Hello world"); の前で、throw new Error("Failed"); を記述しても、コンソールには Response sent successfuly! が表示されます。

また、AbortSignalを付与したRequestでも、トランザクションが終了するとabortが発火します。

Deno.serve((req, _info) => {
  req.signal.addEventListener("abort", () => {
    console.log("Response finished");
  });

  return new Response("Hello world");
});

サーバーアドレスの取得が容易になりました。

次のように、Deno.serve() から、サーバーアドレスを取得できるようになりました。

// server4.ts
const server = Deno.serve(() => new Response("hello Deno"));
const port = server.addr.port;
console.log(`HTTP server running. Access it at: http://localhost:${port}/`);

実行すると、次のようになります。

deno run -A server4.ts
Listening on http://localhost:8000/
HTTP server running. Access it at: http://localhost:8000/

以前は、次のような記述が必要でしたが、かなり簡単に記述できるようになりました。

let listenPort: number | null = null;

Deno.serve(
  {
    onListen: ({ port }) => (listenPort = port),
  },
  () => new Response("hello world"),
);

console.log(`HTTP server running. Access it at: http://localhost:${listenPort}/`);

STD ライブラリ

Deno2 で変更を予定されている変更の一部として、Deno 標準ライブラリ(deno_std)は、Deno1.43以降、JSRでのみ提供されるようになるそうです。

既存バージョンは、引き続き https://deno.land/stdで公開されるそうです

https://deno.land/std では今後更新はされないことになるので、早めに移行するのがよさそうです。

Deno 2 の機能を試すことができる DENO_FUTURE=1 について

Deno 1.42 で、DENO_FUTURE=1 フラグが登場しました。 これは、Deno2 での機能変更を試すことができるフラグです。 Deno 1.42 の時点では、DENO_FUTURE=1 を設定することでグローバルの window が削除され、それを確認できました。

このリリースでは、またいくつもの項目の変更が行われています。 詳細はリリースノートを参照下さい。

その他

  • deno.json で npm コマンドが使用できるように
  • JSX変換が改善され、プリコンパイルが防止されるオプションを追加
  • jsxImportSourceTypes プラグマ、とコンパイルオプションが追加
  • URL.parse() APIが、フォールバックを提供できるようになりました
  • Deno 1.42 にはV8 12.4が同梱されFloat16Arrayが使用できるようになります

Deno 1.43 のリリース内容を見てきました。 deno serve サブコマンドが登場しましたが、この設計がCloudfrere Workers のようなデフォルトエクスポートを提供する形になっています。 これまで、(フレームワーク使わないで)実装するには、Deno.serve() などAPIへの理解が必要でした。 これらが部分的に不要になる形だと感じていて、開発者の考えるスコープが少し狭く済むと考えています。 今後このサブコマンドで最初のサーバーを書いてみる方も増えてくるのかもしれません。

Toranoana.deno #16

5月15日 19:30から Toranoana.deno #16 開催です。
大変ありがたいことにLT枠が満員になりました。視聴枠はまだまだ募集中です。 是非ご参加ください。

yumenosora.connpass.com

採用情報

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

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

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