Electronでメニューを実装する方法はいくつかありますが、「最も適切な方法」は、目的(ネイティブアプリのような統一感・ショートカット対応・クロスプラットフォームでの整合性)に応じて次の方法が推奨されます。
✅ 推奨されるメニュー実装方法:Menu
モジュールを使う
ElectronのMenu
モジュールを使うことで、macOSやWindowsなどの各OSに適したネイティブメニュー を構築できます。
// main.js(メインプロセス)
const { app, Menu } = require('electron');
app.whenReady().then(() => {
const template = [
{
label: 'ファイル',
submenu: [
{
label: '新規',
accelerator: 'CmdOrCtrl+N',
click: () => {
console.log('新規が選択されました');
},
},
{ type: 'separator' },
{ role: 'quit' }, // OSに応じた「終了」メニュー
],
},
{
label: '表示',
submenu: [
{ role: 'reload' },
{ role: 'toggledevtools' },
],
},
];
const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
});
macOSでは、アプリ名メニューが標準で追加されます。以下のように分岐して対応します:
if (process.platform === 'darwin') {
template.unshift({
label: app.name,
submenu: [
{ role: 'about' },
{ type: 'separator' },
{ role: 'services' },
{ type: 'separator' },
{ role: 'hide' },
{ role: 'hideothers' },
{ role: 'unhide' },
{ type: 'separator' },
{ role: 'quit' },
],
});
}
const { Menu, MenuItem } = require('electron');
const contextMenu = new Menu();
contextMenu.append(new MenuItem({ label: 'コピー', role: 'copy' }));
contextMenu.append(new MenuItem({ label: '貼り付け', role: 'paste' }));
mainWindow.webContents.on('context-menu', (e, params) => {
contextMenu.popup({ window: mainWindow });
});
もしレンダラープロセス側の状態に応じてメニューを変えたい場合は、ipcMain
/ ipcRenderer
を用いた通信を使います。
特徴 | 説明 |
---|---|
クロスプラットフォーム対応 | OSごとにネイティブUIへ適応 |
ショートカットの設定 | acceleratorで簡単に指定可能 |
システム統合 | roleでUndoやQuitなどを自動処理 |
メンテナンス性 | JSONライクなテンプレートで保守性◎ |