Web技術(HTML/CSS/JavaScript)を使ってデスクトップアプリを作れるElectron。この記事では、Electronの基本的な仕組みと、実際にアプリを開発する際のポイントを解説します。

Electronとは

Electronは、ChromiumとNode.jsを組み合わせたフレームワークで、Web技術だけでWindows、macOS、Linux向けのデスクトップアプリを開発できます。

有名なElectronアプリ

  • Visual Studio Code
  • Slack
  • Discord
  • Notion

これらの人気アプリもElectronで作られています。

Electronの基本構造

Electronアプリは大きく2つのプロセスで構成されます。

メインプロセス Node.jsが動作し、アプリのライフサイクルやウィンドウの管理を担当します。ファイルシステムへのアクセスやOSとのやり取りはここで行います。

レンダラープロセス Chromiumで動作し、UIを表示します。通常のWebページと同じようにHTML/CSS/JavaScriptを使って開発できます。各ウィンドウごとに独立したレンダラープロセスが起動します。

プロジェクトのセットアップ

まずは基本的なプロジェクト構成から始めましょう。

必要なパッケージ

npm install --save-dev electron

package.jsonの設定mainフィールドにメインプロセスのファイル(通常はmain.js)を指定し、scriptsに起動コマンドを追加します。

基本的なファイル構成

project/
├── main.js (メインプロセス)
├── index.html (UI)
├── renderer.js (レンダラープロセスのスクリプト)
└── package.json

ウィンドウの作成

BrowserWindowクラスを使って、アプリのウィンドウを作成します。

ウィンドウのサイズ、リサイズ可否、フレームの有無など、様々なオプションを設定できます。開発時はwebPreferencesnodeIntegrationcontextIsolationなどのセキュリティ設定に注意が必要です。

プロセス間通信(IPC)

メインプロセスとレンダラープロセス間でデータをやり取りするには、IPCを使います。

レンダラーからメインへipcRenderer.send()でメッセージを送信し、メイン側でipcMain.on()で受信します。非同期処理に適しています。

メインからレンダラーへwebContents.send()を使って、特定のウィンドウにメッセージを送信できます。

同期的な通信ipcRenderer.invoke()ipcMain.handle()を組み合わせることで、Promise/async-awaitベースの通信が可能です。

ファイル操作

Node.jsのfsモジュールを使えば、ローカルファイルの読み書きが自由に行えます。

セキュリティのポイント ファイルパスの選択にはdialog.showOpenDialog()dialog.showSaveDialog()を使い、ユーザーに選ばせることでセキュリティリスクを軽減できます。

非同期処理 ファイル操作は必ず非同期メソッド(fs.promisesasync/await)を使い、UIがブロックされないようにします。

メニューとトレイアイコン

ネイティブアプリらしい体験を提供するため、メニューやシステムトレイの実装も重要です。

アプリケーションメニューMenu.buildFromTemplate()でカスタムメニューを作成できます。ショートカットキーの設定や、プラットフォームごとの違いにも対応可能です。

システムトレイTrayクラスを使うことで、タスクバーやメニューバーにアイコンを表示できます。常駐型アプリケーションに便利です。

パッケージング

開発したアプリを配布するには、実行可能ファイルにパッケージングする必要があります。

electron-builder 最も人気のあるパッケージングツールです。Windows(.exe)、macOS(.app、.dmg)、Linux(.deb、.AppImage)など、様々な形式に対応しています。

設定のポイント

  • アプリアイコンの準備(各プラットフォーム向け)
  • コード署名(特にmacOS)
  • 自動更新機能の組み込み

パフォーマンス最適化

Electronアプリは「重い」と言われがちですが、適切な最適化で改善できます。

起動時間の短縮

  • 不要なモジュールの遅延ロード
  • ウィンドウの段階的な表示
  • キャッシュの活用

メモリ使用量の削減

  • 不要なレンダラープロセスの終了
  • 大きなデータの適切な管理
  • DevToolsの本番ビルドでの無効化

よくある課題と解決策

セキュリティnodeIntegration: falsecontextIsolation: trueを設定し、preloadスクリプトで必要な機能だけを公開します。

ファイルサイズ 不要な依存関係を削除し、electron-builderの圧縮オプションを活用します。アプリ本体は100MB以上になることも珍しくありません。

デバッグ メインプロセスは通常のNode.jsデバッグ、レンダラーはChrome DevToolsを使います。--inspectフラグも有効です。

まとめ

Electronを使えば、Web開発のスキルをそのまま活かして、本格的なデスクトップアプリを開発できます。学習コストが低く、クロスプラットフォーム対応も容易なため、個人開発者にとって強力な選択肢です。

まずは小さなアプリから始めて、徐々に機能を追加していくことをおすすめします。Electronの豊富なエコシステムとコミュニティが、開発をサポートしてくれるはずです。