1 ポイント 投稿者 GN⁺ 5 시간 전 | 1件のコメント | WhatsAppで共有
  • WebアプリとTypeScriptコードで作られたDenoプロジェクトを、プラットフォームごとに再配布可能なデスクトップアプリのバイナリにまとめられる
  • 出力物にはアプリケーションコード、Denoランタイム、Webレンダリングエンジンが含まれ、Deno v2.9.0に入ったが、まだ安定リリースではない
  • デフォルトのWebViewバックエンドはOS内蔵のwebviewを使って小さなバイナリを目指し、レンダリングの一貫性が必要なら**Chromium(CEF)**バックエンドを選べる
  • Next.js、Astro、Fresh、Remix、Nuxt、SvelteKit、SolidStart、TanStack Start、Vite SSRプロジェクトを検出し、リリースモードと--hmr開発モードに合わせてサーバーを実行する
  • Denoコードとwebview間の通信にはソケットベースのIPCではなくインプロセスチャネルを使い、クロスコンパイルとbsdiffベースの自動更新まで範囲に含まれる

deno desktopの役割と現状

  • deno desktopはDenoプロジェクトを自己完結型デスクトップアプリケーションに変換する
    • 入力は単一のTypeScriptファイルからNext.jsアプリまで可能
    • 出力はプラットフォーム別に再配布可能なバイナリ
    • バイナリにはアプリケーションコード、Denoランタイム、Webレンダリングエンジンが含まれる
  • この機能はDeno v2.9.0に含まれているが、まだ安定リリースではない
    • 今試すにはdeno upgrade canarycanaryビルドをインストールする必要がある
    • コマンド、設定キー、TypeScript APIは安定化前まで変更される可能性がある

バックエンドの選択とWebプロジェクトの実行

  • Web技術をデスクトップUIツールキットとして使いながら、既存のWebスタックベースのデスクトップアプリツールのトレードオフを減らす方向を取っている
    • Electron、Tauri、Electrobunのようなツールには、大きなバイナリ、プラットフォーム対応の不足、JavaScriptエコシステムの欠如、組み込みアップデーターの不在、フレームワーク統合の不在といったトレードオフがあり得る
  • デフォルトのWebViewバックエンドはOSのwebviewを使い、小さなバイナリを目指す
    • DenoのNode互換レイヤーを通じてnpmエコシステムを利用できる
    • macOS・Windows・Linuxで同じレンダリングが必要なら、バンドルされたChromiumであるCEFバックエンドを選べる
  • フレームワーク自動検出は、既存のWebプロジェクトをコード変更なしでデスクトップ上で実行する方式
    • 対象はNext.js、Astro、Fresh、Remix、Nuxt、SvelteKit、SolidStart、TanStack Start、Vite SSRなど
    • リリースモードでは本番サーバーを実行する
    • --hmrではホットリロード付きの開発サーバーを実行する

ランタイム通信、ビルド、更新

  • バックエンドとUIの通信にはインプロセスチャネルを使う
    • 値は呼び出し境界を越える際にエンコードされる
    • Denoコードとwebviewの間にクロスプロセスの往復がない
  • 1台のマシンからmacOS、Windows、Linux向けにクロスコンパイルできる
    • バックエンドはローカルでビルドせず、必要なときにダウンロードされる
  • 自動更新はlatest.jsonマニフェストとbsdiffパッチを使う、組み込みのバイナリ差分更新方式
    • ランタイムがポーリング、適用、失敗した実行に対するロールバックを処理する

簡単な例とドキュメント構成

  • 1ファイルのデスクトップアプリは、Deno.serve()でHTMLレスポンスを返すmain.tsを作り、deno desktop main.tsを実行して作成できる
Deno.serve(() =>
  new Response("Hello, desktop

", {
    headers: { "content-type": "text/html" },
  })
);
deno desktop main.ts
  • コンパイル済みバイナリは、Deno.serve()ハンドラーにバインドされたローカルHTTPサーバーを指すウィンドウを開く
    • macOS/Linuxでは./mainで実行する
    • Windowsでは.\\main.exeで実行する
  • Deno.serve()はwebviewが移動するアドレスに自動でバインドされるため、ポートやホスト名を渡す必要はない
  • 関連ドキュメントは、設定、バックエンド、HTTP配信、フレームワーク、ウィンドウ管理、バインディング、メニュー、トレイとdock、ダイアログ、通知、HMR、DevTools、自動更新、エラー報告、デプロイ、比較、CLIリファレンスに分かれている
    • Deno.BrowserWindowはウィンドウのライフサイクル、複数ウィンドウ、イベントに関連する
    • Deno.autoUpdate()はマニフェスト、bsdiff、ロールバックに関連する
    • bindings.()はwebviewからDenoコードを呼び出すバインディング方式

1件のコメント

 
GN⁺ 5 시간 전
Hacker Newsのコメント
  • Deno Desktopは、その折衷案をかなり強めに決めているように見える。「デフォルトは小さく、Node互換性は完全に」
    記事の5行のHello Worldで deno desktop index.ts を試したところ、Windows 10では結果が 442MB だった
    Electronビルドより小さいだろうと思っていたのに、はるかに大きくて驚いた。libcef.dll が247MB、Hello Worldが入った deno-test.dll が78MBだった
    何か間違えたのか気になる

    • ElectronのHello Worldもブラウザ/Chromiumランタイム込みでだいたい 100〜150MB だった記憶がある
      なので、OSのWebViewのようなものを再利用して 20MB以下 の解決策が出てくることを期待していたが、400MBを超えるのは少し誤魔化しっぽく感じる
      設定を間違えたのかもしれないので、deno desktop test.ts 以外に何かすべきことがあるのか気になる
  • 「アプリごとにCEFをそれぞれバンドルする代わりに、共有CEFランタイムを管理すれば、アプリごとのバイナリサイズを数MBまで減らせて、ロードマップにも入っている」という部分は興味深い
    CEFに詳しくないので、バージョン管理がどうなるのか気になる
    アプリごとに必要なCEFのバージョンが違うなら、結局Electronのように各アプリが自分のブラウザを抱えて持ち歩くモデルに戻るのか、それともそういう場合でも共有ランタイムの利点が残るのか知りたい
    https://docs.deno.com/runtime/desktop/comparison/

    • CEFは Chromium Embedded Framework のこと
      https://github.com/chromiumembedded/cef
    • 参考までに、CEFはRiotと League of Legendsクライアント にも使われていた
      結果はあまり良くなかったが、それがCEF技術自体の問題だったのか、ほかの構成要素やプロセスのせいだったのかは分からない
      https://www.riotgames.com/en/news/architecture-league-client...
    • 利点が大きいかどうかは疑わしい
      デスクトップのElectronアプリは、実際にはほとんどが互いに異なる Chromiumバージョン を使っていて、アップグレード時に壊れるリスクのせいで古いバージョンを維持することも多い
    • Web開発者は、対象環境が継続的に最新へ更新されることに慣れているので、「とにかく手元の最新のものを使わせてくれ」みたいなモデルに参加するか外れるかを選べるのかもしれない
    • 内蔵ブラウザを自前でダウンロードして管理するより、システムWebView を使えるといい
      WindowsならWebView2のような方式だ
  • Denoは相変わらず印象的だ
    新しいプロジェクトをDeno抜きで始めなくなってからかなり経つし、Node.jsより Denoエコシステム を完全に支持するようになった
    この機能をどれだけ頻繁に使うかは分からないが、選択肢が増えたのは本当に良い

  • 印象的な仕事だ
    バイブコーディングでデスクトップアプリ を作るとき、かなり面白そうだ
    Lovable、Bolt、v0のようなツールはWebアプリを作るときに基本的にTypeScriptを使うので、ここにうまく合いそう
    小さなデスクトップアプリにはChromiumとNodeをバンドルする代わりにGo/Wailsを使ってきたし、Electronも役目は十分果たしていたが、あの大きなバンドルには自分としてはかなり抵抗があった

  • Denoの最大の強みのひとつである 権限システム とどう統合されるのか気になった
    とくにエージェントを自分のデバイス上で自由に動き回らせるときには重要だ
    CLIリファレンスには「コンパイル時に付与した権限は、コンパイル済みバイナリに焼き込まれる」と書かれている
    ユーザーがどんな権限を与えるのか把握して判断できるよう、表に出してくれるとよいと思う
    https://docs.deno.com/runtime/reference/cli/desktop/#runtime...

    • 開発者から受け取ったバイナリを実行する状況だ
      そこでDenoの権限プロンプトを見せると、その権限の 完全性保証 がないため、かえって誤解を招く可能性があると思う
    • Deno Desktopにまだないもののひとつが、デスクトップアプリ向けの実行時権限
      ファイルシステムやネットワークアクセスのたびに権限プロンプトを出す、Denoの権限システムをデスクトップのサンドボックス化に適用する方式だ
  • リリースするには賢い機能だ
    どのプラットフォームを使うか決めるとき、十分に検討対象になると思う

    • 同意する
      小さなインストールサイズ とクロスプラットフォームであれば、ElectronやTauriの有力な代替に見える
  • 「Web技術は世界で最も広く知られたUIツールキット」という表現は、あまり適切ではないと思う
    Electronアプリがよく批判される理由は、UIツールキットとはむしろ正反対に近いからだ
    ホストOSのUIパターンにきちんと従えていないことが多い
    Web技術は単なるWeb技術であって、ボタンをレンダリングすることはできても、スタイルを当てていないボタンですらOSネイティブのように見える保証はなく、ブラウザごとに異なる

    • 人々がElectronを使う理由はそこではない
      目標が単に「UIツールキット」や「ホストOSのUIパターンに従うこと」だったことはない
      Chromiumには膨大な機能が入っており、Electronはそのユーティリティをそのまま持ってこれるし、それは利点だ
      たとえば動画処理をしたことがあるなら、デスクトップアプリの中で現代のブラウザの全能力を使えることがゲームチェンジャーだと分かるはずだ
      動画再生はもちろん、現代のWebとWebCodecsで可能なトランスコードまで自前で実装するのは非常に大きな作業であり、しかもWindows/macOS/Linuxで動くデスクトップアプリならなおさらだ
      Electronで数十時間で作ったアプリがあるが、別のやり方なら数十日かかったと思うし、AIを使っても動画の専門家でなければ難しかったはずだ
    • なぜその表現が悪いのか分からない
      「ネイティブ」UIだと主張したことはない
      LinuxのネイティブUIは昔からかなり見た目が悪いと感じていて、むしろきちんと作り込んだ HTML+CSSレイアウト を使うほうがずっと良いと思ってきた
      私の経験では、Electronは主に肥大化して遅いという理由で叩かれていて、ネイティブではないことは人々が付け足しで言う程度だ
      昔からHTML+CSSでレイアウトは使いつつ、JavaScriptランタイムは不要な直接的なブラウザ統合を作りたいと思っていた
      Servoがどれほど軽量なのかは分からないが、いつかそういうアイデアが実現するといいと思う
    • Linux、macOS、WindowsでZedを使うたびに、GPUIフレームワーク がどれほど安定していて高速かに驚かされる
      ユーザーとしてはとても満足しているし、アクセシビリティのような基本機能はまだ不足しているが、近いうちに実装されると思う
      開発者の立場では、Rust以外に何が参入障壁なのかよく分からないし、同時にRustが差別化要因でもある
    • UIが ネイティブっぽく見えるか は、反論材料としてはもうずいぶん前に力を失っている
      25年くらい前の話で、Microsoftですら気にしなくなってからは、もう誰もあまり気にしていない
    • ホストOSのUIパターンに従わないことを欠点と見ているようだが、私にとってはそれがElectronの中核的な利点の1つだ
      OSごとに自分のアプリの見た目が変わってほしくない
      すべてのデバイスでテストするリソースはないし、あるシステムでテストした画面が別のシステムでもまったく同じに見えるのは非常に大きな利点だ
  • この領域に競合が出てきたのはうれしい
    特にDenoは、現在のNode実装のように型を取り除くだけではなく、本物のTypeScriptを直接実行できる点がよい
    ただ、これはTauriの市場をかなり奪いそうだ
    これでなぜTauriを使う必要がある?
    たいていのインターネット接続では、バンドルサイズが150MB増えてもダウンロード時間の差は1〜10秒にすぎず、その代わり信頼できるレンダリングエンジンを得られる

    • DenoもTypeScriptコードを実行するとき、デフォルトでは 型アノテーションを削除 するだけだ
      型チェックをするには deno run --check で実行するか、別途 deno check サブコマンドを使う必要がある
      開発中は通常IDEが型チェックとリンティングを自動でやってくれるので、大きな問題ではない
    • Tauriは特定の JavaScriptエコシステム に閉じ込めない
      実際、JavaScriptを使う必要すらない
      それに、Astro、Nuxt、UV、Bun、Viteのような開発者向けフレームワーク系スタートアップがいくつも買収されるのを見てきた
      何年にもわたって維持・サポートされるべきソフトウェアなら、そういう流れは信頼感につながらない
    • 「バックエンド」がJavaScriptではないときはTauriを使う
    • 「信頼できるレンダリングエンジン」を得るという言い方がよく分からない
      Deno DesktopとTauriはどちらも システムWebView を使うのではないか?
    • その理屈だとElectronを使おうという話と同じだ
      なぜこれは使って、Electronは使うべきではないのか?
  • Denoが出した資料の中では、比較セクション がいちばん良かった
    最後の行でiOS/Android対応がElectronは「no」、Denoは「not yet」になっているが、これを本当に実現できればずっと大きなものになるだろう

  • Webゲームを Steamアプリ やオンライン購入向けアプリとして配布するのに本当に良さそうだ
    一度使ってみるつもりだ