Zero-native: Zig と WebView を用いたデスクトップアプリ開発の再考
デスクトップアプリケーション開発の状況は、長らくウェブ技術の豊かさとネイティブバイナリの性能との間で綱引きが続いてきました。何年も前から、Electron は完全な Chromium インスタンスと Node.js ランタイムをバンドルすることでこの領域を支配し、開発者に膨大な柔軟性を提供する代わりに、巨大なバイナリサイズと多大な RAM 消費というコストを伴ってきました。
zero-native は、Vercel Labs の新しいプロジェクトで、このギャップを埋めることを目指しています。Zig プログラミング言語とシステムネイティブ WebView を活用することで、zero-native はウェブのような開発体験とネイティブアプリのようなパフォーマンスを約束します。現代のデスクトップフレームワークに見られる「肥大化」に対処し、サブメガバイトのバイナリと即時リビルドへの道を提供します。
コアアーキテクチャ: Zig + WebView
zero-native の核となるのは、軽量シェルとして設計されていることです。重いブラウザエンジンをバンドルする代わりに、デフォルトで system WebView(OS に既に存在するブラウザエンジン)を使用します。このアーキテクチャ上の選択により、アプリケーションは独自のレンダリングエンジンを持つ必要がなくなるため、生成されるバイナリは非常に小さく保たれます。
主な技術的利点
- Tiny Binaries and Low Memory: system WebView を利用することで、zero-native アプリはバンドルされたランタイムのオーバーヘッドを回避し、Electron と比較してディスク容量が大幅に小さく、メモリ使用量も削減されます。
- Flexible Web Engines: system WebView が軽量アプリのデフォルトである一方、zero-native は開発者が CEF (Chromium Embedded Framework) を介して Chromium をバンドルできるようにし、異なるプラットフォーム間でピクセル単位のレンダリング一貫性が必要なプロジェクトに対応します。
- Rapid Iteration: フレームワークは Zig の高速コンパイルを活用します。開発者は bridge コマンドやシステム統合を変更し、数秒で結果を確認でき、フロントエンドは標準的なウェブのホットリローディングの恩恵を受け続けます。
- Seamless C Integration: Zig の際立った特徴の一つは C ライブラリを直接呼び出せることです。zero-native はこれを継承し、開発者は C ヘッダーを含めてネイティブ SDK、オーディオコーデック、または ML ランタイムを呼び出すことができ、複雑なバインディングジェネレータや「unsafe」ラッパーは不要です。
「Bridge」とアプリモデル
ウェブ UI をデスクトップアプリとして機能させるために、zero-native は Bridge を実装しています。これにより、WebView 内で実行される JavaScript がネイティブ Zig コードと直接通信できるようになります。この双方向通信により、ウェブ開発者はファイルシステムへのアクセスやハードウェア統合といったシステムレベルの操作をトリガーでき、標準的なブラウザ環境では通常不可能なことが可能になります。
フレームワークは組み込みのコマンド、ダイアログ、システムトレイサポートも提供し、最初から「ネイティブ」な感覚が開発者のワークフローに統合されるようにします。
コミュニティの議論: 「ネイティブ」とは何か?
システム領域の新しいツールには常にそうであるように、zero-native は開発者コミュニティ、特に Hacker News で活発な議論を呼び起こしました。議論の多くは「ネイティブアプリ」の定義に焦点を当てています。
定義の対立
複数の批評家は、WebView を使用すること(システム提供かバンドルかに関わらず)は「ネイティブ」ではないと主張しています。この観点では、ネイティブアプリとは OS のプリミティブ(SwiftUI や WinForms など)を使用して UI を描画するものです。
WebView に依存するアプリケーションを「ネイティブデスクトップアプリ」と呼ぶのは好きではありません。私の考えでは、ネイティブデスクトップアプリとは OS のプリミティブや指示を使って UI を描くことを意味します。
Tauri との比較
観測者は、zero-native と Tauri の顕著な類似点に注目しています。Tauri もシステム WebView と Rust ベースのバックエンドを使用しています。このことが Zig と Rust のトレードオフに関する議論を呼び、zero-native は Zig のシンプルさと借用チェッカーがないことによる開発スピードの向上を強調していますが、一部のシステムプログラマはこれをリスクと見なしています。
Tauri だが、メモリ安全性、資金、ガバナンスモデル、あるいは人間のメンテナがないバージョン。
プラットフォーム固有の懸念
クロスプラットフォームの基盤という約束は魅力的ですが、一部のユーザーは「system WebView」という用語が可変であることを指摘しています。たとえば Linux では、WebKitGTK に依存することは Chromium 系の代替手段と比べて最適でないと見なされることが多いです。
最後に
zero-native は、デスクトップ上でウェブベースの UI を提供するより効率的な方法への取り組みを示しています。重い Node.js/Chromium バンドルを軽量な Zig バックエンドとシステム提供のレンダラに置き換えることで、ウェブの機敏さを求めつつ Electron のリソースオーバーヘッドを回避したい開発者にとって魅力的な代替手段を提供します。「ネイティブ」アプリの定義に関する哲学的議論は続くものの、技術的な目標は明確です:デスクトップソフトウェアの提供コストを削減することです。