A quick reference guide to fundamental Electron components, APIs, and concepts.
- Main Process vs Renderer Process
- Core Modules
- BrowserWindow
- IPC Communication
- Menu API
- Dialog API
- Tray API
- Native File Operations
- App Lifecycle
- Main Process: Controls application lifecycle, creates browser windows, accesses native APIs
- Renderer Process: Runs web pages, handles UI, limited access to native APIs
app- Controls application lifecycleBrowserWindow- Creates and manages application windowsipcMain/ipcRenderer- Communication between processesdialog- Native system dialogsMenu/MenuItem- Native application menusTray- System tray integrationshell- Open files/URLs with default applicationsnativeImage- Work with images in native formats
const { BrowserWindow } = require("electron");
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
preload: path.join(__dirname, "preload.js"),
},
});
win.loadURL("https://example.com");
// or
win.loadFile("index.html");// In main process
const { ipcMain } = require("electron");
ipcMain.on("asynchronous-message", (event, arg) => {
console.log(arg); // prints "ping"
event.reply("asynchronous-reply", "pong");
});
ipcMain.handle("synchronous-message", async (event, arg) => {
return "pong";
});
// In renderer process
const { ipcRenderer } = require("electron");
// Asynchronous
ipcRenderer.send("asynchronous-message", "ping");
ipcRenderer.on("asynchronous-reply", (event, arg) => {
console.log(arg); // prints "pong"
});
// Synchronous (Promise-based)
async function sendMessage() {
const response = await ipcRenderer.invoke("synchronous-message", "ping");
console.log(response); // prints "pong"
}const { Menu, MenuItem } = require("electron");
const menu = new Menu();
menu.append(
new MenuItem({
label: "File",
submenu: [{ role: "quit" }],
})
);
Menu.setApplicationMenu(menu);const { dialog } = require("electron");
dialog
.showOpenDialog({
properties: ["openFile", "multiSelections"],
})
.then((result) => {
console.log(result.filePaths);
});
dialog.showMessageBox({
type: "info",
buttons: ["OK"],
title: "Information",
message: "Operation completed successfully",
});const { Tray, Menu } = require("electron");
const path = require("path");
const tray = new Tray(path.join(__dirname, "icon.png"));
const contextMenu = Menu.buildFromTemplate([
{ label: "Item1", type: "radio" },
{ label: "Item2", type: "radio" },
]);
tray.setToolTip("My Application");
tray.setContextMenu(contextMenu);const { app } = require("electron");
const fs = require("fs");
const path = require("path");
const userDataPath = app.getPath("userData");
const filePath = path.join(userDataPath, "settings.json");
// Save data
fs.writeFileSync(filePath, JSON.stringify({ theme: "dark" }));
// Read data
const data = JSON.parse(fs.readFileSync(filePath));const { app } = require("electron");
app.on("ready", createWindow);
app.on("window-all-closed", () => {
if (process.platform !== "darwin") app.quit();
});
app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});