HN 日本語サマリー

← 一覧へ戻る
プログラミング

Deno 2.9

Deno 2.9 (deno.com)

76 pointsby enz25 コメント

要約

Deno 2.9がリリースされ、特にウェブ技術スタックからネイティブデスクトップアプリケーションを構築できる新機能「deno desktop」が注目されています。また、既存のNodeプロジェクトをDenoに移行する際、npm、pnpm、yarn、Bunのロックファイルを直接読み込むことで、以前よりもはるかに容易になりました。このリリースでは、CSSモジュールインポート、テストランナーの強化、起動時間の短縮、Node.js 26との互換性向上など、多数の改善も含まれています。

全文翻訳

Deno 2.9が登場しました。その目玉は「deno desktop」で、使い慣れたウェブスタックからネイティブデスクトップアプリケーションを構築する新しい方法を提供します。Electronのような定型コードは不要で、最終的には単一のバイナリになります。また、既存のNodeプロジェクトを移行するのがこれまでで最も簡単なリリースでもあります。deno installがnpm、pnpm、yarn、Bunのロックファイルを直接読み込むようになり、パッケージマネージャーをDenoに切り替えるのに数コマンドで済み、大掛かりな移行は不要です。その他にも、CSSモジュールインポートや大幅に強化されたテストランナーから、起動時間の高速化やNode.js 26との互換性まで、多くの新機能があります。Deno 2.9にアップグレードするには、ターミナルで次のコマンドを実行してください: `deno upgrade` If Deno is not yet installed, run one of the following commands to install or learn how to install it here. # Using Shell (macOS and Linux): curl -fsSL https://deno.land/install.sh | sh # Using PowerShell (Windows): iwr https://deno.land/install.ps1 -useb | iex deno desktop デスクトップアプリの構築は通常、ElectronやTauriを取り込み、別個のツールチェーンを構築し、プロジェクトの残りの部分とはほとんど似ていないバンドルを配布することを意味していました。Deno 2.9では「deno desktop」が導入されました。スクリプト(またはウェブフレームワークプロジェクト)を指定すると、UIがウェブビューで実行され、ロジックがDenoで実行され、全体が単一の配布可能バイナリにコンパイルされるネイティブの自己完結型デスクトップアプリケーションが生成されます(#33441)。 deno desktopは2.9では実験的機能です。ここで説明されているインターフェースは安定化されており、一部のプラットフォーム機能はまだ実装中です。 最もシンプルなアプリは、UIを提供するエントリーポイントです。デスクトップエントリーポイント内の`Deno.serve()`は、ウェブビューが開くポートに自動的にバインドされるため、ポートの配線は不要です。 `main.ts` `Deno.serve(` ` () =>` ` new Response(` ` "<!DOCTYPE html><h1>Hello from Deno desktop 👋</h1>",` ` { headers: { "content-type": "text/html" } },` ` ),` `);` `$ deno desktop main.ts` これにより、ページをレンダリングするネイティブウィンドウが開きます。deno desktopはdeno compileと同じフレームワーク検出を共有します。エントリーポイントなしで(または`deno desktop .`として)実行すると、現在のディレクトリ内のウェブフレームワーク(Next.js、Astro、Fresh、Remix、Nuxt、SvelteKit、SolidStart、TanStack Start、Vite SSRがすべてサポートされています)を自動検出し、ビルドして結果をラップします。 `$ deno desktop # auto-detect the framework in the current directory` `$ deno desktop --hmr # run with Hot Module Replacement during development` ネイティブデスクトップAPI よりリッチなアプリのために、Deno.*の下に一連のネイティブデスクトップAPIがランタイムに直接組み込まれており、追加の依存関係なしにすぐに利用できます。`Deno.BrowserWindow`は、ウィンドウのサイズ、位置、可視性、メニュー、DevToolsをプログラムで制御でき、ウェブビューとDenoの間をブリッジできます。`window.bind()`でエントリーポイントに関数をバインドし、`bindings`名前空間を介してページJavaScriptから呼び出すことができます。システムトレイのアイコンとパネルのための`Deno.Tray`、およびmacOS用の`Deno.Dock`もあります。 `tray.ts` `const tray = new Deno.Tray();` `tray.setIcon(iconBytes);` `const panel = tray.attachPanel({ url: "https://localhost:8000/panel" });` `panel.window.bind("doThing", async () => {/* ... */});` `prompt()`、`alert()`、`confirm()`はネイティブダイアログとしてレンダリングされ、`Deno.autoUpdate()`はバックグラウンドでバイナリパッチを適用するポーリング式の自動アップデーターを構築します。 WebviewまたはCEF すべてのデスクトップアプリはUIを描画するためにブラウザエンジンを必要とし、deno desktopは`--backend`で選択できる2つのエンジンを搭載しています。`webview`(デフォルト)はオペレーティングシステムに組み込まれたエンジン(WindowsではWebView2、macOSとLinuxではWebKit)でレンダリングします。余分なものはバンドルされないため、バイナリは小さく、起動は高速です。そのトレードオフとして、レンダリングはホストが提供するエンジンに依存します。`cef`はChromium Embedded Frameworkを介してChromiumをバンドルするため、すべてのユーザーはすべてのプラットフォームで同じモダンなエンジンを利用できます。これには数十メガバイトの追加とビルド時のダウンロードが必要ですが、すべての場所で同一のレンダリングと最新のウェブプラットフォーム機能が保証されます。 `$ deno desktop main.ts # native webview (default)` `$ deno desktop --backend cef main.ts # bundled Chromium` ほとんどのアプリはデフォルトのウェブビューで最も快適に動作します。すべてのプラットフォームで同一のエンジンが必要な場合は`cef`を使用してください。 配布 deno desktopはdeno compileと同じ仕組みで構築されているため、出力はコードとアセットが埋め込まれたスタンドアロンバイナリです。形式は`--output`に渡す拡張子に従います。macOSでは`.app`と`.dmg`、Windowsでは`.exe`または`.msi`インストーラー、Linuxでは`.AppImage`、`.deb`、または`.rpm`です。ただし、クロスプラットフォームで配布するために多数のマシンは必要ありません。`--target`はアプリをサポートされている任意のプラットフォームにクロスコンパイルし、`--all-targets`はすべてのターゲットを1つのコマンドでビルドするため、単一のLinux CIランナー(またはあなたのラップトップ)からWindows、macOS、Linux用のバイナリをまとめて生成できます。Windowsの`.msi`およびLinuxの`.deb` / `.rpm`インストーラーは純粋なRustで作成されているため、プラットフォーム固有のパッケージングツールチェーンなしでどのホストからも生成できます。 `$ deno desktop --output MyApp.dmg main.ts # build for the host` `$ deno desktop --target x86_64-pc-windows-msvc main.ts # cross-compile to Windows` `$ deno desktop --all-targets main.ts # build every supported target` サポートされている5つのターゲットはdeno compileと同じです。Linux x64/arm64、Windows x64、macOS x64/arm64。より小さなアーティファクトの場合、`--compress`はランタイムとUIバックエンドを自己解凍型のバンドルとして配布し、初回起動時に解凍します。詳細なガイドについては、deno desktopのドキュメントを参照してください。完全で実用的な例として、denidianはdeno desktopで構築されたメモ帳アプリです。 パフォーマンス Deno 2.9は、起動時間、メモリ使用量、HTTPスループットにおいて広範なパフォーマンス向上をもたらします。以下の`Deno.serve`ベンチマークは、並行度100で3つのワークロードを実行します。プレーンテキストのHello, World!、1 MiBのレスポンスボディ、およびBearer認証ヘッダー付きのJSONペイロードをPOSTしてJSONとしてエコーバックする実世界のHTTPリクエストです。すべてDeno 2.8.0と比較して専用のx86_64 Linuxマシンで測定されました。 Deno 2.8 (灰色) 対 2.9 (青色) コールドスタート(低いほど良い) v2.8: 34.2 ms v2.9: 17.3 ms 1.98倍高速 Deno.serve 実世界(高いほど良い) v2.8: 56.8k req/s v2.9: 72.4k req/s 1.27倍高速 Deno.serve プレーンテキスト(高いほど良い) v2.8: 77.0k req/s v2.9: 85.6k req/s 1.11倍高速 Deno.serve 1 MiBボディ(高いほど良い) v2.8: 1,617 req/s v2.9: 1,907 req/s 1.18倍高速 RSS、実世界(低いほど良い) v2.8: 142 MB v2.9: 64 MB 2.2倍少ないメモリ RSS、1 MiBボディ(低いほど良い) v2.8: 197 MB v2.9: 63 MB 3.1倍少ないメモリ Deno.serveスループットとピークRSSは並行度100で測定。コールドスタートは150回のhyperfine実行の平均。専用のx86_64 Linuxマシンで、サーバーとロードジェネレーターは異なるコアにピン留め、ohaの3回実行の中央値。 起動時間。Hello-worldプログラムのコールドスタート時間は、2.8の約半分(34msから17ms)になりました。この改善は、スナップショットからの`node:`グローバルの遅延ロード、Nodeワーカーへの積極的なNodeブートストラップの制限、残りの遅延ロードESMモジュールのV8コードキャッシュ、およびミニファイされたスナップショット(#34450、#35373、#35338、#35183)によるものです。macOSでは、チェインドフィックスアップにより追加のプレメイン時間が短縮されます(#35409)。 メモリ。今回のサイクルで際立っているのは、負荷時のメモリ使用量です。2.8では、プレーンテキストの提供で約94MBから、1MiBボディのストリーミングで197MBまで、ワークロードとともに常駐セットサイズが増加しました。2.9では、サーバーが何をしていても約62MBを維持し、実質的に横ばいになります。これにより、実世界のワークロードでピークRSSが2.2倍少なく(142MBから64MB)、1MiBボディで3.1倍少なく(197MBから63MB)なり、同じマシンでより多くの`Deno.serve`インスタンスを並行して実行できるようになります。 HTTPスループット。`Deno.serve`も全体的に高速化されています。実世界のワークロードで1.27倍、プレーンテキストで1.11倍、1MiBボディで1.18倍の向上を果たしており、新しいDenoが所有するHTTP/1.1サービングパス(#34446)が貢献しています。また、このリリースではいくつかのホットパス(`crypto.subtle` (#34966) と`console` / `Deno.inspect` (#35087))がJavaScriptからRustに移行しました。 CSSモジュールインポート Deno 2.9は、インポート属性を使用してCSSファイルを構成可能なスタイルシートとしてインポートすることをサポートしており、CSSモジュールスクリプトのウェブ標準に準拠しています(#35093)。 `main.ts` `import sheet from "./styles.css" with { type: "css" };` `document.adoptedStyleSheets = [sheet];` インポート評価