Das app-Modul ist die zentrale Anlaufstelle für app-globale Operationen — vom Lebenszyklus bis zu Plattform-spezifischen Features wie Dock-Badge auf macOS oder JumpList unter Windows. Hier die wichtigsten Methoden, mit denen du beim Schreiben einer realen App ständig zu tun hast.
app.getPath() — Standard-Verzeichnisse
Postions-unabhängig die richtigen System-Pfade finden:
app.getPath('userData'); // App-spezifische User-Daten
app.getPath('home'); // User-Home-Verzeichnis
app.getPath('downloads'); // Downloads-Ordner
app.getPath('documents'); // Documents-Ordner
app.getPath('desktop'); // Desktop
app.getPath('temp'); // Temp-Verzeichnis
app.getPath('logs'); // App-spezifischer Log-Pfad
app.getPath('appData'); // OS-globaler AppData-Pfad
app.getPath('exe'); // Pfad zur App-ExecutableuserData ist das wichtigste — hier speichert deine App ihre Settings, SQLite-Datei, Config-Files. Plattform-Pfade:
| Plattform | userData-Pfad |
|---|---|
| macOS | ~/Library/Application Support/<AppName>/ |
| Windows | %APPDATA%\<AppName>\ |
| Linux | ~/.config/<AppName>/ |
<AppName> kommt aus package.json productName, name, oder per app.setPath/app.setName setzbar.
App-Identität
app.getName(); // 'My App' (aus package.json productName)
app.getVersion(); // '1.2.3'
app.getLocale(); // 'de-DE'
app.getCountryCode(); // 'DE'
app.isPackaged; // true in Production-BuildisPackaged ist sehr nützlich: für Dev/Prod-Verhalten unterscheiden:
if (app.isPackaged) {
win.loadFile('dist/index.html');
} else {
win.loadURL('http://localhost:5173');
win.webContents.openDevTools();
}Command-Line-Argumente
// Eigene Argumente parsen
const args = process.argv.slice(app.isPackaged ? 1 : 2);
// Electron/Chromium-spezifische Switches setzen (vor app.ready!)
app.commandLine.appendSwitch('disable-gpu-vsync');
app.commandLine.appendSwitch('lang', 'de-DE');
app.commandLine.appendArgument('--my-custom-flag');commandLine.appendSwitch muss vor app.whenReady() gerufen werden — danach hat es keinen Effekt mehr, weil Chromium schon initialisiert ist.
macOS — Dock-API
Auf macOS hat das Dock eine eigene API:
// Badge-Zähler (z. B. für ungelesene Nachrichten)
app.dock.setBadge('5');
app.dock.setBadge(''); // Badge entfernen
// Dock-Icon zeigen/verstecken (für Menüleisten-Apps)
app.dock.hide();
app.dock.show();
// Dock-Menü
const dockMenu = Menu.buildFromTemplate([
{ label: 'Neu', click: () => createWindow() },
{ label: 'Logout', click: () => logout() }
]);
app.dock.setMenu(dockMenu);
// Bouncing
app.dock.bounce('informational'); // 'critical' bounced längerapp.dock existiert nur auf macOS — auf Windows/Linux ist es undefined. Plattform-Check vorher.
Windows — Badge und JumpList
// Badge-Counter im Taskbar-Icon (Windows)
app.setBadgeCount(5);
app.setBadgeCount(0);
// JumpList-Tasks (Rechtsklick auf Taskbar-Icon)
app.setUserTasks([
{
program: process.execPath,
arguments: '--new-window',
iconPath: process.execPath,
iconIndex: 0,
title: 'Neues Fenster',
description: 'Öffnet ein neues Fenster'
}
]);setBadgeCount funktioniert auch auf macOS (mit numerischem Wert) und auf manchen Linux-Desktops (Unity, KDE).
Auto-Launch
App beim System-Start automatisch starten:
// Aktuellen Status prüfen
const settings = app.getLoginItemSettings();
console.log(settings.openAtLogin);
// Auto-Launch aktivieren
app.setLoginItemSettings({
openAtLogin: true,
openAsHidden: true, // ohne sichtbares Fenster (macOS)
args: ['--hidden']
});
// Deaktivieren
app.setLoginItemSettings({ openAtLogin: false });Funktioniert auf macOS und Windows. Auf Linux: keine Standard-API — man legt manuell eine .desktop-Datei in ~/.config/autostart/.
Wichtige Methoden im Überblick
| Methode | Was |
|---|---|
app.quit() | Quit anfordern (löst before-quit aus) |
app.exit(code) | Sofort beenden, ohne Events |
app.relaunch() | App neu starten (z. B. nach Update) |
app.focus() | Alle Fenster nach vorne |
app.hide() (macOS) | Wie Cmd+H — App verstecken |
app.show() (macOS) | App zeigen |
app.setAsDefaultProtocolClient(scheme) | Custom-Protocol registrieren |
app.requestSingleInstanceLock() | Single-Instance-Mode |
relaunch() + quit() ist das Pattern für „App neu starten":
app.relaunch();
app.quit();Besonderheiten
app.getPath('userData') ist der goldene Pfad für App-Daten.
NICHT in __dirname schreiben (read-only nach App-Packaging) und NICHT direkt nach ~/Library mit hartcodiertem Pfad. Immer getPath('userData') — Plattform-abstrahiert, immer schreibbar.
app.commandLine.appendSwitch NUR vor app.ready.
Chromium-Switches werden bei Init gelesen. Nach whenReady() registrierte Switches haben keinen Effekt mehr — und kein Fehler, der dich warnt. Daher: Switches ganz oben im main.js, vor allem anderen.
app.dock existiert nur auf macOS.
app.dock.setBadge('5') direkt aufrufen crasht auf Windows/Linux. Wer plattform-übergreifend Badges machen will: app.setBadgeCount(n) — funktioniert auf macOS und Windows, Linux teilweise.
isPackaged ist die saubere Dev-vs-Prod-Erkennung.
Besser als process.env.NODE_ENV (das im Main-Prozess oft nicht gesetzt ist). app.isPackaged ist true im fertigen Build, false während electron .. Nutzen für Dev-URL vs. File-Load und DevTools-Auto-Open.
app.relaunch braucht oft app.exit, nicht app.quit.
quit() kann durch before-quit blockiert werden. Wenn deine App definitiv neu starten soll (nach Update), app.relaunch() + app.exit(0) — ohne User-Dialog dazwischen.
setAsDefaultProtocolClient braucht macOS-Plist oder Windows-Registry.
Custom Protocols (myapp://...) müssen sich beim System registrieren. Auf Windows passiert das beim Aufruf, auf macOS muss zusätzlich in Info.plist der Protocol stehen — electron-builder/Forge können das automatisch.