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:

JavaScript
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-Executable

userData ist das wichtigste — hier speichert deine App ihre Settings, SQLite-Datei, Config-Files. Plattform-Pfade:

PlattformuserData-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

JavaScript
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-Build

isPackaged ist sehr nützlich: für Dev/Prod-Verhalten unterscheiden:

JavaScript
if (app.isPackaged) {
    win.loadFile('dist/index.html');
} else {
    win.loadURL('http://localhost:5173');
    win.webContents.openDevTools();
}

Command-Line-Argumente

JavaScript
// 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:

JavaScript
// 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änger

app.dock existiert nur auf macOS — auf Windows/Linux ist es undefined. Plattform-Check vorher.

Windows — Badge und JumpList

JavaScript
// 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:

JavaScript
// 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

MethodeWas
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":

JavaScript
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.

Weiterführende Ressourcen

Externe Quellen

/ Weiter

Zurück zu Grundlagen

Zur Übersicht