macOS
Swift
開発
パフォーマンス

ネイティブMac開発:なぜElectronだけでは不十分なのか

2025年11月3日
HarborDB Team

HarborDBでは、早い段階で議論の余地のある決定を下しました。Electron(VS Code、Slack(重い)、Discordなどが使用)やTauriのようなクロスプラットフォームフレームワークを使用するのではなく、SwiftとSwiftUIを使用してネイティブのmacOSアプリを構築しました。

「一度書けば、どこでも動く」がデフォルトのマントラである時代に、ネイティブを選択することは後退しているように見えます。2025年における真のネイティブソフトウェア開発に対する私たちの技術的および哲学的な擁護は次のとおりです。

パフォーマンスの議論:メモリとスレッド

Electronのオーバーヘッド

すべてのElectronアプリは、ChromiumとNode.jsのインスタンス全体をバンドルしています。

  • アイドル時のRAM使用量:「Hello World」ウィンドウで約150MB。
  • 実際のRAM使用量:Slackはテキストを表示するだけで、頻繁に1GB以上を使用します。
  • アーキテクチャ:各ウィンドウは個別のレンダラープロセスです。メインプロセス(Node)とレンダラー(UI)間の通信にはシリアル化(IPC)が必要であり、大量のデータの場合は低速です。

ネイティブの利点

SwiftUIアプリは、すでにメモリにロードされているOSライブラリを共有します。

  • アイドル時のRAM使用量:約15〜30MB。
  • データ処理:データをコピーすることなく(ゼロコピー)、データベースエンジン(C++)からUIレイヤー(Swift)にメモリポインタを直接渡すことができます。

具体的な例: テーブルに100,000行をロードします。

  • Electron:JSオブジェクトをシリアル化 -> IPC -> レンダラーで逆シリアル化 -> DOMを生成する必要があります。(知覚可能な遅延)。
  • Swift:構造体をメモリにロード -> NSTableView または List は瞬時にスクロールし、表示されているものだけをレンダリングします。

深いシステム統合

「適切なMacアプリ」であることは、メニューバーが上部にあること以上の意味があります。それは、Macユーザーがお金を払っている機能をサポートすることを意味します。

1. キーボードショートカットとフォーカス

Webアプリは、複雑なキーボードフォーカスをうまく処理できないことがよくあります。Webアプリ内のコードエディタからTabキーで移動しようとしたことはありますか? macOSのネイティブレスポンダーシステム(NSResponder)は、イベントの伝播を予測可能かつ標準的な方法で処理します。

2. ファイルシステム

HarborDBはデータベースツールです。SQLiteファイル、大量のSQLダンプ、CSVエクスポートを読み取る必要があります。 ブラウザ(および拡張機能によりElectron)は、セキュリティ上の理由から積極的に「サンドボックス化」されています。Electronはファイルシステムにアクセスできますが、次の処理を行うネイティブの FileCoordinator フレームワークほどスムーズではありません:

  • ファイルロック。
  • アトミック更新。
  • iCloudドライブとの調整。

3. サービスとAutomator

ネイティブアプリは「サービス」を公開します。Finderで .db ファイルを右クリックして、カスタムアクションを表示できます。AppleScriptまたはショートカットを介してアプリをスクリプト化できます。

「ネイティブソフトウェアはユーザーのコンピュータを尊重します。実行されている唯一のプログラムであるふりをしません。」

開発者体験(DX):Swift vs Typescript

ここは主観的になりますが、聞いてください。

TypeScriptは素晴らしいです。Web UIを構築するための最良のツールです。しかし、JavaScriptエコシステムは脆弱です。node_modules には10,000の依存関係があり、複雑なwebpack/vite/rollup構成があり、絶え間なく変化しています。

Swiftは強く型付けされ、コンパイルされ、めちゃくちゃ高速です。 SwiftUIを使用すると、宣言型UIの構築はReactと同じくらい高速ですが、次の機能があります:

  • コンパイル時の真の型安全性(any なし)。
  • C++ APIへの直接バインディング(Objective-C++またはSwift C Interop経由)。
  • どのコード行がメモリを割り当てているか、メインスレッドをブロックしているかを正確に示す、素晴らしいプロファイリングツール(Xcode Instruments)。

なぜ誰もがネイティブを使わないのですか?

ネイティブがそんなに素晴らしいなら、なぜElectronが勝っているのですか?

  1. クロスプラットフォーム:これは明白な理由です。
  2. 採用:Swift/macOS開発者1人に対して、React開発者は100人います。
  3. イテレーション速度:Web更新のプッシュは瞬時です。ネイティブアプリの更新をプッシュするには、App StoreのレビューまたはSparkleの更新が必要です。

私たちの賭け

私たちは、職人技のソフトウェア品質に対する市場があると賭けています。 プロのユーザーは、アプリのように感じられない遅いアプリにうんざりしています。チャットアプリが暗号通貨をマイニングしているためにバッテリーが消耗することにうんざりしています(冗談ですが、あながち冗談でもありません)。

HarborDBは高速です。200ミリ秒で開きます。100万行を120 FPSでスクロールします。キーボードショートカットを尊重します。

時代遅れかもしれませんが、私たちにとって、それはプロフェッショナルな生産性の未来です。