27 人が閲覧(直近 30 日) Electron

Electronとは?Web技術でデスクトップアプリを作る仕組みと始め方【v44で実測】

Electronとは?Web技術でデスクトップアプリを作る仕組みと始め方【v44で実測】

Electron(エレクトロン)とは、HTML・CSS・JavaScriptで書いた画面を、Windows・macOS・Linuxで動くデスクトップアプリにするオープンソースのフレームワークです。英単語のelectronは物理の「電子」を指しますが、開発の文脈ではこのソフトウェアを指します。この記事では、2026年10月21日時点の最新安定版 Electron 44.9.2 を手元のMacで動かし、Hello Worldの起動、配布用パッケージのサイズ、メモリ使用量を実測した結果をもとに、仕組みと始め方、採用を決める条件を整理します。

まとめ:Electronの要点

  • ElectronはChromium(画面の描画)とNode.js(OS機能)を1つに同梱したランタイムで、1つのコードから3つのOS向けアプリを作れます。VS Code・Slack・Discord・Figma・Notionなどが採用しています。
  • 2026年10月21日時点の最新安定版は44.9.2(Chromium 152・Node.js 24.22.0)。新しいメジャー版は8週ごとに出て、サポートされるのは最新の3系列だけです。
  • 始めるならElectron Forge 8の雛形(npx create-electron-app@latest my-app --template vite --typescript)が最短です。Electron 42以降は npm install の時点でバイナリを取得せず、初回起動時に取得します。
  • Hello WorldでもmacOS向けの.appは294MB、zipで134MB、起動中のメモリは4プロセス合計で約230〜245MBでした。アプリ本体のコード(app.asar)は11.5KBで、重さのほぼ全部がランタイムです。
  • 安全面の既定値は、contextIsolation・sandboxが有効、nodeIntegrationが無効です。画面とOS操作の受け渡しはpreloadとIPCに限り、送信元を検証します。
  • 配布サイズとメモリを最優先するならTauri、Web技術だけで全OS同じ描画を得たいならElectronを選びます。

Electronの仕組み:ChromiumとNode.jsを同梱するデスクトップアプリ基盤

Electronアプリは、ブラウザの描画エンジンであるChromiumと、JavaScriptの実行環境であるNode.jsを丸ごと抱えて配布されます。画面はWebページとして描き、任意のファイルの読み書きや外部プロセスの起動など、ブラウザのサンドボックスでは制限される処理はNode.js側で行います。OSごとにSwiftやC#で別々に書く必要がなく、Web開発の知識だけで3つのOS向けのアプリを出せるのが最大の利点です。公式サイトはElectron is an open-source project under the OpenJS Foundationと記しており、ライセンスはMITです。

メインプロセスとレンダラープロセスの役割分担

Electronアプリは役割の違う2種類のプロセスで動きます。メインプロセスはアプリの入口で、Node.jsのAPIを使ってウィンドウの生成やメニュー、ファイル操作を担当します。レンダラープロセスはウィンドウごとに起動し、Chromiumで画面を描きます。両者はIPC(プロセス間通信)でやり取りし、その仲介役が後述のpreloadスクリプトです。画面のコードはレンダラー、OSに触れるコードはメイン、と分けるのが基本設計です。実測時のプロセス構成は、Browser(メイン)・GPU・Utility・Tab(レンダラー)の4つでした。

読み方と名前の由来:Atom Shellからの改名

読み方は「エレクトロン」です。元はGitHubがテキストエディタAtomのために作った土台で、当初はAtom Shellという名前でした。最初のコミットは2013年3月13日で、2015年4月23日に公式ブログがAtom Shell is now called Electronと改名を告知しています。2019年にOpenJS Foundationへ参加し、現在はGitHubの一製品ではなく財団配下のプロジェクトです。なお検索結果には同じ綴りの美容機器ブランド「ELECTRON」も出ますが、本記事のElectronとは無関係です。

Electron製アプリの例と見分け方

公式サイトが挙げる採用アプリ

Electronの公式トップページは、採用例として1Password、Asana、Claude、Discord、Dropbox、Figma、GitHub Desktop、MongoDB Compass、Notion、Obsidian、Postman、Signal、Slack、Trello、Twitch、VS Codeなどを並べています。日本語の音声合成ソフトVOICEVOXも、GitHubのpackage.jsonでElectron 42.1.0を指定しています。大規模な商用アプリで使われ続けていることは、Web技術のデスクトップアプリが実用水準にある根拠になります。ただし自社の要件に合うかは、後述する配布サイズとメモリ、8週ごとの更新に追従できる運用体制で判断します。

手元のアプリがElectron製か確かめる手順

macOSでは、アプリの中に Electron Framework.framework が入っていればElectron製です。次のコマンドで、/Applications内のElectron製アプリと、それが使っているElectronの版を一覧にできます。

for a in /Applications/*.app; do
  f="$a/Contents/Frameworks/Electron Framework.framework/Resources/Info.plist"
  [ -f "$f" ] && echo "$(basename "$a")  app=$(defaults read "$a/Contents/Info.plist" CFBundleShortVersionString)  electron=$(defaults read "$f" CFBundleVersion)"
done

2026年10月21日に手元のMacで実行した結果の一部です(各アプリはその時点でインストールされていた版の値です)。

アプリ アプリの版 Electronの版
Claude 3.1623.0 44.9.0
Visual Studio Code 1.141.0 43.7.7
Evernote 11.37.5 37.6.0
Slack 4.39.95 31.2.1
Figma 116.15.4 26.2.4

この表は手元にインストールされていた版の観察で、各社が現在配布している版とは限りません。それでも、インストール済みのアプリが使うElectronの系列には大きな開きがあり、アプリの更新を止めると、組み込まれたElectronもサポート外の系列のまま残ることが分かります。Windowsでは、インストール先の resources フォルダに app.asar があれば、ほぼElectron製と判断できます。

2026年10月時点の最新バージョンとサポート期間

Electronは8週ごとに新しいメジャー版を出し、各版は4週間のalpha、4週間のbetaを経て安定版になります。公式のリリース方針は「The latest three stable major versions are supported」で、長期サポート(LTS)版はありません。2026年10月21日時点の状況を、公式のリリース一覧とリリーススケジュールから整理しました。

系列 状態 最新版 Chromium 安定版の公開 サポート終了予定
45 beta 45.0.0-beta.6 156 未公開 2027-04-27
44 最新安定版 44.9.2 152 2026-08-25 2027-03-02
43 サポート中 43.8.2 150 2026-06-30 2027-01-05
42 サポート中 42.11.17 148 2026-05-06 2026-10-20

44.9.2は2026年10月20日に公開され、Node.js 24.22.0とV8 15.2を同梱しています。45の安定版が出た時点で42はサポート対象から外れるため、42で配布しているアプリは44以降への更新を計画してください。版は短い周期で変わるので、導入時はElectron Releasesで最新を確認します。版ごとの新機能や更新時の注意はElectronのUIをWeb技術で作る実践ガイドで扱っています。

Electronの始め方:Hello Worldを動かす

Node.jsの必要バージョン

electron 44.9.2 のpackage.jsonは "node": ">= 22.12.0" を要求します。雛形ツールのElectron Forge 8はリリースノートで「Node.js 22.17 or newer」と明記しているため、Node.js 22.17以上、できれば現行のLTS系を入れておけば両方を満たします。Node.jsの版の選び方はNode.js 26の新機能と破壊的変更・LTS移行日にまとめています。

Electron Forge 8による雛形の生成

実務の出発点は公式の雛形ツールElectron Forgeです。2026年9月29日公開のForge 8で、テンプレートは「バンドラーごとに1つ」に整理され、TypeScriptは --typescript の指定に変わりました。Vite+TypeScriptの構成は次の1行で作れます。

npx create-electron-app@latest my-app --template vite --typescript
cd my-app
npm start

手元では45秒で依存関係のインストールまで終わり、forge.config.mts・vite.main.config.mts・vite.preload.config.mts・vite.renderer.config.mts と、src 配下に main.ts・preload.ts・renderer.ts が生成されました。package.jsonのスクリプトは start・package・make・release・lint・typecheck です。Forge 7の publish は release に改名され、旧名は非推奨の別名として残っています。リンターとフォーマッターにはESLint・Prettierではなく、Rust製のoxlintとoxfmtが入ります(Oxcの構成と使い方を参照)。

Electronの最小構成と手動セットアップ

仕組みを理解するには、Forgeを使わず手で書くのが早道です。まずプロジェクトを作ってElectronを入れます。

mkdir hello-electron && cd hello-electron
npm init -y
npm install --save-dev [email protected]

Electron 42で、npm install時のpostinstallスクリプトによるバイナリ取得が廃止されました。公式の破壊的変更の一覧は、理由をnpmを狙ったサプライチェーン攻撃への対策と説明しています。そのため上のコマンドは数秒で終わり、初回の npx electron . で「Downloading Electron binary…」と表示され、macOS x64版で128.2MBのzipを取得します(実測で初回起動まで約29秒、2回目以降は即時)。CIで事前に取得したいときは npx install-electron --no を使います。npm install --ignore-scripts でも動くようになったのは、この変更の利点です。

ここでは本記事の実測と同じ44.9.2に固定しています。新しく採用するときは、その時点でサポート中の最新版を指定してください。ファイルは package.json・main.js・preload.js・index.html・renderer.js の5つです。package.jsonは、npm installが書き込んだ devDependencies を残したまま、main と scripts を次のように書き換えます。

{
  "name": "hello-electron",
  "version": "1.0.0",
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "devDependencies": {
    "electron": "44.9.2"
  }
}

メインプロセス(main.js)でウィンドウを作ります。

const { app, BrowserWindow } = require('electron')
const path = require('node:path')

function createWindow () {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })
  win.loadFile('index.html')
}

app.whenReady().then(() => {
  createWindow()
  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})

preload.jsで、画面に渡す値だけを公開します。

const { contextBridge } = require('electron')

contextBridge.exposeInMainWorld('versions', {
  node: () => process.versions.node,
  chrome: () => process.versions.chrome,
  electron: () => process.versions.electron
})

index.htmlにはContent-Security-Policyを置き、スクリプトは別ファイルのrenderer.jsから読み込みます。script-src 'self' の下ではHTMLに直接書いたscriptは実行されないため、インラインに書かないのが正しい形です。

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <title>Hello Electron</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    <p id="v"></p>
    <script src="renderer.js"></script>
  </body>
</html>
// renderer.js
document.getElementById('v').textContent =
  `Node ${window.versions.node()} / Electron ${window.versions.electron()}`

npm start で「Hello World!」と「Node 24.22.0 / Electron 44.9.2」が表示されたウィンドウが開けば成功です。この画面で typeof require を評価すると undefined で、レンダラーからNode.jsのAPIには触れない状態になっています。コードを書かずにAPIを試したいときは、公式の実験用アプリElectron Fiddleも使えます。

配布用パッケージのサイズとメモリの実測

上のHello Worldを@electron/packager 20.3.0でmacOS(x64)向けの.appにし、Forge 8の雛形も npm run make でzipにして測りました。メモリは app.getAppMetrics() の値を起動5秒後に4回取得しています。

測ったもの 結果
Hello Worldの.app(ディスク使用量) 294MB
Hello Worldの.appのzip 133,842,370バイト
Forge 8のmakeが出したzip 133,953,890バイト
app.asar(Hello World/Forge雛形) 9,064/11,522バイト
Hello Worldのメモリ(4プロセス合計・4回) 約231〜244MB

アプリ本体のコードを収めたapp.asarはHello Worldで9KB、Forge雛形でも11.5KBしかなく、配布物の大きさはほぼ全部がChromiumとNode.jsのランタイムです。つまり自分のコードを削っても配布サイズはほとんど減りません。GitHubの44.9.2リリースに置かれたランタイム単体のzipも、Windows x64が151.1MB、macOS x64が128.2MB、Linux x64が117.4MBあります。メモリはmacOSの app.getAppMetrics() が返すworking setの合計で、Browser約101MB・Tab約60MB・GPU約46MB・Utility約24MBの内訳でした(Intel Core i9-9880H・macOS 26.6.2)。ウィンドウを1つ増やすごとにレンダラーのプロセスが1つ増えるため、画面を複数開くアプリほど差が開きます。

Mac App Store以外でmacOS向けに配布するにはコード署名とAppleの公証が必要で、その手順はElectron製Macアプリのコード署名とApple公証で実測しています。WindowsでMSIX形式にする場合はwinapp CLIの導入とMSIX化の手順が参考になります。

WindowsのNSISインストーラやLinuxのAppImageを作り、electron-updaterで自動更新まで配る設定はelectron-builderの使い方とelectron-updaterの自動更新で解説しています。

セキュリティの既定値と追加で守る設定

既定で有効になっている3つの保護

ElectronのレンダラーはWebページなので、XSSが起きるとNode.jsの権限まで奪われるおそれがあります。そこで現在の既定値は、レンダラーからNode.jsを切り離す側に倒れています。nodeIntegrationの無効化はElectron 5、contextIsolationの有効化は12、sandboxの既定化は20で入りました。上のHello Worldで getLastWebPreferences() を読むと、contextIsolation=true、nodeIntegration=false、sandbox=trueでした。古い記事のコードにある nodeIntegration: true や contextIsolation: false を写さないことが、最初の防御になります。

IPCの送信元と引数の検証

公式のセキュリティチェックリストは20項目あり、その17番目が「Validate the sender of all IPC messages」です。画面に公開する操作を絞ったうえで、メイン側で送信元と引数を確かめます。

// preload.js:画面に渡すのは「メモを保存する」操作だけ
const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('api', {
  saveNote: (text) => ipcRenderer.invoke('save-note', text)
})
// main.js:送信元と値を確かめてから保存する
const { app, ipcMain } = require('electron')
const path = require('node:path')
const fs = require('node:fs/promises')
const { pathToFileURL } = require('node:url')

// 受け付けるのは同梱した index.html を表示しているメインフレームだけ
const allowedUrl = pathToFileURL(path.join(__dirname, 'index.html')).href

ipcMain.handle('save-note', async (event, text) => {
  const frame = event.senderFrame
  if (!frame || frame !== event.sender.mainFrame || frame.url !== allowedUrl) {
    throw new Error('不正な送信元です')
  }
  if (typeof text !== 'string' || text.length > 10000) throw new Error('不正な値です')
  const file = path.join(app.getPath('userData'), 'note.txt')
  await fs.writeFile(file, text, 'utf8')
  return file
})

この組み合わせを44.9.2で動かすと、window.api.saveNote('メモの本文') はユーザーデータ領域のnote.txtへ保存され、saveNote(123) は「不正な値です」、同じフォルダの別のHTMLを開いて呼んだ場合は「不正な送信元です」で拒否されました。プロトコルが file: かどうかだけを見る判定では、この別のHTMLを通してしまいます。画面側からは window.require も window.process も undefined で、触れるのは公開した1関数だけです。なおElectron 29以降は ipcRenderer を丸ごとexposeInMainWorldで渡しても、受け取った側は空のオブジェクトになり、invoke は使えません(44.9.2でも確認)。チャンネル名を引数で受け取って何でも中継する汎用関数を作ると同じ穴が開くため、公開するのは用途を限った関数だけにします。

Forge雛形のfuses設定と機能制限

Forge 8の雛形は、配布時にElectronの機能スイッチ(fuses)を切り替える設定を最初から含んでいます。生成された forge.config.mts では、ElectronをNode.jsとして起動する RunAsNode、環境変数 NODE_OPTIONS と --inspect 系引数の受け付けを無効にし、Cookieの暗号化、ASARの整合性検証、ASARからだけアプリを読む設定を有効にしています。配布物を改ざんして任意のコードを動かす経路を塞ぐための設定です。ただし公式のfusesの解説のとおり、RunAsNodeを無効にすると child_process.fork でNode.jsとして子プロセスを起動する処理が動かなくなります。手で構成する場合は、アプリが使う機能と照らし合わせてから同じ値に揃えます。

ElectronとReact・Vue・Next.jsの連携

レンダラーの中身はChromiumなので、ReactやVueで作った画面をそのまま載せられます。Forge 8のViteテンプレートに、通常のWeb開発と同じ手順でReactを追加すれば動きます。Viteの基本はVite + Reactの環境構築手順、型の付け方はTypeScriptの型・型推論・型注釈の書き分けが参考になります。

Next.jsはサーバーで動く前提の機能(Server ActionsやAPIルート、画像最適化)がElectronの中ではそのまま使えないため、静的書き出しにしてレンダラーで読み込む構成が現実的です。Next.js 16の最新バージョンとリリース履歴で版の状況を確認してから選んでください。画面の作り込み方はElectronのUI構築ガイドでReact・Vue別に解説しています。

Electronを選ぶ条件と選ばない条件

比較の相手は主に、OSのWebViewを使うTauriと、独自エンジンで描くFlutterです。

項目 Electron Tauri Flutter
画面の言語 HTML/CSS/JS HTML/CSS/JS Dart
OS機能側の言語 JavaScript(Node.js) Rust Dart+必要に応じて各OSの言語
描画エンジン 同梱のChromium OSのWebView 独自エンジン
OSごとの描画差 出にくい 出る 出にくい
モバイル 非対応 2.0から対応 対応

Electronを選ぶのは、Web版と画面のコードを共有したい、全OSで描画を揃えたい、OS機能側もJavaScriptで書きたい場合です。全OSで同じ版のChromiumを使うので、OSごとにブラウザエンジンが違うことによるCSSやJavaScriptの差は出ません。フォントやウィンドウ枠などOS側の違いは残るため、OSごとの表示確認は省けません。逆に、配布サイズが数十MBに収まることが要件にある、常駐型でメモリを抑えたい、スマートフォン版も同じコードで出したい場合はElectronを選ぶべきではありません。Hello Worldでも294MBあり、設計では削れない部分だからです。

Tauriは2024年10月2日の2.0でiOS・Androidに対応しました。Electronとの実測比較はTauriとは?Electronとの違い・将来性にあります。モバイルを含めたクロスプラットフォーム開発を検討している場合は、一創のFlutter / React Native開発でもご相談を承っています。PHPの資産を生かしたい場合は、内部でElectronを使うNativePHPという選択肢もあります。

「Electronはオワコンか」という問いには、主要アプリの採用が続き、8週ごとの更新も止まっていない以上、オワコンではないと答えられます。将来性の根拠と、乗り換えを考えるべきケースはElectronのUI実践ガイドの将来性の章で詳しく扱っています。

よくある質問

Electronはオワコンですか?

オワコンではありません。主要アプリの採用が続き、2026年も8週ごとに新しいメジャー版が出ています。配布サイズとメモリを最優先する新規開発ではTauriが有力な候補です。

electronの意味は「電子」ですか?

英単語としてのelectronは物理の電子です。ソフトウェアのElectronは、2015年4月にAtom Shellから改名したデスクトップアプリ用フレームワークの名前で、読み方は「エレクトロン」です。

Electronで作ったアプリは商用利用できますか?

できます。ElectronはMITライセンスです。配布物には同梱するChromiumなどのライセンス文書(LICENSES.chromium.html、44.9.2で約20MB)が含まれるので、削除せずに配布してください。

Electronアプリが重いのはなぜですか?

ChromiumとNode.jsをアプリごとに同梱するためで、Hello Worldでも.appは294MBでした。ウィンドウ数を抑える、画面を必要になってから読み込むといった対策で増え方は抑えられますが、ランタイム分は減らせません。

ElectronでReactは使えますか?

使えます。Forge 8のViteテンプレートにReactを追加する構成が手早く、OSに触れる処理はpreloadとIPC経由でメインプロセスに任せます。

ElectronでiOSやAndroidのアプリは作れますか?

作れません。ElectronはWindows・macOS・Linux向けです。同じ技術でモバイルも出したい場合は、Tauri 2.0以降やFlutterを検討します。

関連記事

お気に入りに入れた記事の一覧

一創の公式 SNS

X では毎朝の新着記事と IT ニュースの速報を、YouTube・TikTok・Instagram・LinkedIn・Facebook では記事の解説動画を配信しています。

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.11.09 テックブログ エディオン不正アクセス第2報:カード番号の対象確認とログ・決済画面の改ざん対策
  2. 2026.11.09 テックブログ LANSCOPE不正アクセス第2報:製品への影響と偽連絡の確認、停止中のライセンス認証の窓口
  3. 2026.11.10 テックブログ Claude Fable 5.2とは:料金・破壊的変更4点とFable 5.1からの移行手順【2026年11月】
  4. 2026.11.09 テックブログ ステップゴルフ不正アクセス:口座情報の対象確認と偽連絡・引き落としの注意点
  5. 2026.11.10 テックブログ ニトリの情報漏洩:最大3,762万件の対象確認となりすまし連絡の見分け方

RELATED POSTS 関連記事

目次