ここ数週間、新しいWebView2 と Electron の違いについていくつかの質問が寄せられています。
両チームとも、Web テクノロジーをデスクトップで最高のものにするという共通の目標を掲げており、包括的な比較が検討されています。
Electron と WebView2 は、急速に進化し続けるプロジェクトです。今日は、Electron と WebView2 の類似点と相違点の簡単なスナップショットをまとめました。
アーキテクチャの概要
Electron と WebView2 はどちらも、Web コンテンツのレンダリングに Chromium ソースからビルドされています。厳密に言うと、WebView2 は Edge ソースからビルドされていますが、Edge は Chromium ソースのフォークを使用してビルドされています。Electron は Chrome と DLL を共有しません。WebView2 バイナリは Edge(Edge 90 時点では安定版チャネル)に対してハードリンクしているため、ディスクと一部のワーキングセットを共有します。詳細については、エバーグリーン配布モードを参照してください。
Electron アプリは、常に開発に使用した Electron の正確なバージョンをバンドルして配布します。WebView2 には、配布に 2 つのオプションがあります。アプリケーションの開発に使用した WebView2 ライブラリの正確なバージョンをバンドルするか、システムにすでに存在している可能性がある共有ランタイムバージョンを使用できます。WebView2 は、共有ランタイムが存在しない場合に備えて、ブートストラップインストーラーなど、それぞれのアプローチに対応するツールを提供します。WebView2 は、Windows 11 以降でインボックスで出荷されます。
フレームワークをバンドルするアプリケーションは、セキュリティに関するマイナーリリースを含め、これらのフレームワークを更新する責任があります。共有 WebView2 ランタイムを使用するアプリの場合、WebView2 には、アプリケーションとは独立して実行される Chrome または Edge と同様の独自のアップデーターがあります。アプリケーションのコードまたはその他の依存関係の更新は、Electron の場合と同様に、開発者の責任です。Electron も WebView2 も Windows Update では管理されません。
Electron と WebView2 はどちらも Chromium のマルチプロセスアーキテクチャを継承しています。つまり、1 つのメインプロセスが 1 つ以上のレンダラープロセスと通信します。これらのプロセスは、システムで実行されている他のアプリケーションとは完全に分離されています。すべての Electron アプリケーションは、ルートブラウザプロセス、いくつかのユーティリティプロセス、およびゼロ以上のレンダープロセスを含む、別個のプロセストレートです。同じユーザーデータフォルダ(アプリのスイートが行うような)を使用する WebView2 アプリは、レンダラー以外のプロセスを共有します。異なるデータフォルダを使用する WebView2 アプリはプロセスを共有しません。
WebView2 のプロセスモデルとElectron のプロセスモデルの詳細については、こちらをご覧ください。
Electron は、メニュー、ファイルシステムアクセス、通知など、一般的なデスクトップアプリケーションのニーズに対応する API を提供します。WebView2 は、WinForms、WPF、WinUI、Win32 などのアプリケーションフレームワークに統合することを目的としたコンポーネントです。WebView2 は、JavaScript を介した Web 標準以外のオペレーティングシステム API を提供しません。
Node.js は Electron に統合されています。Electron アプリケーションは、レンダラープロセスおよびメインプロセスから Node.js API、モジュール、または node-native-addon を使用できます。WebView2 アプリケーションは、アプリケーションの残りの部分がどの言語またはフレームワークで記述されているかを想定していません。JavaScript コードは、アプリケーションホストプロセスを介してオペレーティングシステムへのアクセスをプロキシする必要があります。
Electron は、Fugu プロジェクトで開発された API を含む、Web API との互換性を維持するよう努めています。Electron の Fugu API 互換性のスナップショットがあります。WebView2 は、Edge との API の違いの同様のリストを保持しています。
Electron には、フルアクセスからフルサンドボックスまで、Web コンテンツの構成可能なセキュリティモデルがあります。WebView2 コンテンツは常にサンドボックス化されています。Electron には、セキュリティモデルの選択に関する包括的なセキュリティドキュメントがあります。WebView2 にもセキュリティのベストプラクティスがあります。
Electron ソースは GitHub で保守されており、利用可能です。アプリケーションは、独自の Electron のブランドを構築するために変更できます。WebView2 ソースは GitHub で利用できません。
簡単なまとめ
|  | Electron | WebView2 | 
|---|
| ビルド依存関係 | Chromium | Edge | 
| GitHub でソースが利用可能 | はい | いいえ | 
| Edge/Chrome DLL を共有 | いいえ | はい (Edge 90 時点) | 
| アプリケーション間の共有ランタイム | いいえ | オプション | 
| アプリケーション API | はい | いいえ | 
| Node.js | はい | いいえ | 
| サンドボックス | オプション | 常に | 
| アプリケーションフレームワークが必要 | いいえ | はい | 
| サポートされているプラットフォーム | Mac、Win、Linux | Win (Mac/Linux は計画中) | 
| アプリ間のプロセス共有 | なし | オプション | 
| フレームワークの更新を管理 | アプリケーション | WebView2 | 
Web コンテンツのレンダリングに関しては、Electron、WebView2、およびその他の Chromium ベースのレンダラー間でパフォーマンスの差はほとんどないと考えています。潜在的なパフォーマンスの違いを調査することに関心のある人のために、Electron、C++ + WebView2、C# + WebView2 を使用して構築されたアプリの足場を作成しました。
Web コンテンツのレンダリング以外で考慮すべきいくつかの違いがあり、Electron、WebView2、Edge の担当者などが PWA を含む詳細な比較に取り組むことに関心を示しています。
プロセス間通信 (IPC)
ここでは、Electron アプリケーションでパフォーマンスに影響を与えることが多いと思われる 1 つの違いをすぐに強調したいと思います。
Chromium では、ブラウザプロセスはサンドボックス化されたレンダラーとシステムの他の部分との間の IPC ブローカーとして機能します。Electron ではサンドボックス化されていないレンダリングプロセスを使用できますが、多くのアプリケーションはセキュリティを強化するためにサンドボックスを有効にすることを選択しています。WebView2 では常にサンドボックスが有効になっているため、ほとんどの Electron アプリケーションと WebView2 アプリケーションでは、IPC が全体的なパフォーマンスに影響を与える可能性があります。
ElectronとWebView2は、プロセスモデルが似ていますが、基盤となるIPC(プロセス間通信)は異なります。JavaScriptとC++またはC#の間で通信するには、マーシャリングが必要です。最も一般的なのはJSON文字列への変換です。JSONのシリアライズ/パースはコストのかかる処理であり、IPCのボトルネックはパフォーマンスに悪影響を与える可能性があります。Edge 93以降、WV2はネットワークイベントにCBORを使用します。
Electronは、MessagePorts APIを介して、任意の2つのプロセス間で直接IPCをサポートしています。このAPIは、構造化クローンアルゴリズムを利用しています。これを利用するアプリケーションは、プロセス間でオブジェクトを送信する際にJSONシリアライズのコストを回避できます。
まとめ
ElectronとWebView2には多くの違いがありますが、Webコンテンツのレンダリングパフォーマンスに関しては大きな違いはないでしょう。結局のところ、アプリのアーキテクチャやJavaScriptライブラリ/フレームワークの方が、メモリやパフォーマンスに大きな影響を与えます。なぜなら、Chromiumはどこで実行されてもChromiumだからです。
この投稿をレビューし、WebView2アーキテクチャの最新情報を提供してくれたWebView2チームに感謝します。彼らはプロジェクトに関するフィードバックを歓迎しています。