스크립트
00:00:00クロスプラットフォームのデスクトップアプリ開発といえば、以前はElectronが定番でしたが、現在は
00:00:04選択肢が豊富で迷ってしまうほどです。そこで今日は、最適な選択肢を明確にするため、
00:00:093つの主要なクロスプラットフォーム向けデスクトップアプリ開発ツールを比較します。Rust製のTauri、Bunチームによる
00:00:14Electro Bun、そしてDenoの新しいデスクトップ向けツールであるDeno Desktopを扱います。基準としてElectronも使用します。
00:00:20もしこのチャンネルで他のツールを取り上げてほしい場合は、コメント欄で教えてください。
00:00:23今回は、バンドルサイズ、起動パフォーマンス、ランタイムパフォーマンス、そして開発体験の4点を比較します。
00:00:29検証のために、全く同じアプリを4回作成しました。画面録画ツールで、タイムライン上で編集して
00:00:35MP4として書き出せるものです。動画処理は、こうしたツールの限界を試すのに適しているため、あえてこの種類を選びました。
00:00:40もちろん、すべてがパフォーマンスだけで決まるわけではありません。
00:00:44チームのスキルセットや、構築しようとしている製品の種類も、どのフレームワークを選ぶかに影響します。
00:00:49しかし、本動画が選択の参考になれば幸いです。
00:00:58それでは、今回構築したアプリのデモを簡単に紹介します。アプリを起動して、
00:01:03録画する画面を選択し、録画ボタンを押します。これで画面を短く録画できます。
00:01:08終了したら「停止」ボタンを押します。すると、タイムライン上に録画データが表示されたウィンドウが現れます。
00:01:12ここで不要な部分をカットし、エクスポートしてMP4として保存できます。アプリ自体は非常にシンプルですが、
00:01:18録画、動画処理、UIレンダリングといった複数のAPIを使用しているため、テストとしては適切です。
00:01:24では、最初の項目であるバンドルサイズを確認してみましょう。
00:01:28繰り返しになりますが、すべて同一機能のアプリです。基準となるElectronは323MB、
00:01:35Tauriはわずか57MB、Electro Bunは418MB、Denoは111MBでした。
00:01:44MP4書き出し用にすべてffmpegを内蔵しており、これだけで45MBを占めます。Electro Bunがこれほど大きいのは、
00:01:52Chromiumを同梱する必要があったからです。何とかして回避しようと試みましたが、
00:01:56JavaScriptから直接システム標準のWebViewを使って画面を録画することはできませんでした。
00:02:01画面を録画するには「Screen Capture API」と「getDisplayMedia」関数が必要です。ブラウザに画面を要求して、
00:02:06ストリームを受け取り、MediaRecorderでエンコードします。ElectronとDenoはこの方法です。Electro Bunは
00:02:12そのAPIを一切含んでいないため、利用するにはChromiumを再導入するしかありませんでした。
00:02:17その結果、さらに200MBも肥大化します。DenoのAPIはこの機能を実装しているため、同じコードでも
00:02:24Chromium不要で、バンドルサイズは約100MBに収まります。一方、Electro Bunは約400MBに達します。
00:02:30RustのTauriはWebViewでの録画を一切行わないため、この対策は不要でした。
00:02:35すべてバックエンドで、ネイティブの「Screen Capture Kit」を介して録画されます。
00:02:40これはmacOSのQuickTimeと同じフレームワークで、バックエンドから直接録画が行われます。
00:02:46ディスプレイ、コーデック、ファイルパスを渡すと、アプリが自らファイルを作成します。WebViewはUIのみを担当し、
00:02:52描画データには一切触れません。JavaScript側で処理が必要なことも、Tauriなら
00:02:56ネイティブ機能で完結します。Screen Capture Kitはマイクとシステム音声をミキシングしてMP4に仕上げます。
00:03:02他のフォーマットへのエクスポート用にffmpegを同梱していますが、これは必須ではありません。
00:03:07次に起動速度を測定します。10回実行して中央値を取るスクリプトを作成しました。
00:03:13基準のElectronは273ミリ秒、Tauriは
00:03:19311ミリ秒でした。Electro Bunは773ミリ秒、Denoは242ミリ秒という結果でした。
00:03:29驚いたことにTauriは最速ではなく、Electronよりわずかに遅かったです。Denoが全員を上回りました。
00:03:34RustとシステムWebViewなら瞬時に起動すると思われがちですが、
00:03:39レンダリングエンジンが起動する点は共通なので、それが要因かもしれません。
00:03:44Electro Bunは異常で、Electronの3倍近くかかりました。ランチャーがBunを起動し、さらにChromiumを起動するという
00:03:503段構えのランタイムが原因であり、その遅延は体感できます。
00:03:56続いて、起動後のメモリ使用量を見てみましょう。基準のElectronは
00:04:01128MBでした。Tauriは109MB、Electro Bunは208MB、Denoは98MBでした。
00:04:10DenoとTauriはほぼ同等で、Electro Bunは他よりほぼ倍でした。
00:04:15Tauriについて、マーケティングで謳われているような10倍の改善とは言い難いです。ディスク容量は
00:04:21確かに小さいですが、実行時のメモリ消費量は他のツールと大差ありませんでした。
00:04:26測定時に注意すべき点として、Tauriは
00:04:31システムWebViewを使用しており、そのプロセスはアプリの子プロセスではありません。macOSが個別に起動するため、
00:04:36アクティビティモニター上ではTauriは約36MBと表示され、Electronの3倍優秀に見えますが、
00:04:42実際には関連プロセスを合計すると109MB近くになり、今回のテスト結果と一致します。
00:04:48録画自体のパフォーマンスについては、Tauriの方が明らかに優れていました。
00:04:53これはWebView内で録画データを橋渡しするのではなく、
00:04:58OSが提供するネイティブSDKで直接録画しているからでしょう。
00:05:0460fpsに近い滑らかな録画を実現したいなら、RustとTauriを選ぶのが正解です。
00:05:10次に開発体験についてですが、各プラットフォームの違いにより、この
00:05:15単純なアプリを作るだけでも一苦労でした。全体として、ElectronとTauriが最も
00:05:20実装が容易でしたが、DenoとElectro Bunでは多くの問題やシステムクラッシュが発生しました。Denoは
00:05:26録画を開始してアプリを非表示にすると、アプリ全体が強制終了してしまいました。おそらく
00:05:30表示される画面がなくなると、Denoがアプリのタスクが完了したと判断してしまうためでしょう。
00:05:36そのため、画面外に移動させるという無理な回避策をとる必要がありました。
00:05:41Electro Bunは、画面録画のためにChromiumを同梱する必要があり、さらに
00:05:46なぜか3Dレンダリング用のThree.jsやBabylon.jsに依存しており、それがバンドルサイズを膨らませていました。
00:05:53結論として、個人的にはTauriを選びます。ただし、Rustでプログラムしたくないなら、
00:05:58TypeScript開発者には成熟したElectronが依然として最適です。Denoは期待できますが、
00:06:04成熟にはまだ時間が必要でしょう。Electro Bunは今回の選択肢の中では最も残念でした。
00:06:09皆さんが判断する参考になれば幸いです。感想をコメントで聞かせてください。
00:06:13Deno Desktopについては別途動画を作成したので、詳しく知りたい方はこちらをクリックしてください。
00:06:18それでは、BetterstackのWarrenでした。ご視聴ありがとうございました。また次回お会いしましょう。