Eine Electron-App lässt sich auf drei Ebenen konfigurieren: Command-Line-Argumente (für eigene Switches und Chromium-Flags), Environment-Variablen (für Build- und Runtime-Mode) und App-interne Config-Files. Hier die wichtigsten Wege und wann welcher passt.
Eigene Command-Line-Argumente
process.argv enthält die Args wie in jedem Node-Prozess. Achtung: bei Electron sind argv[0] die Electron-Executable und argv[1] der App-Pfad (in Dev) bzw. weitere Argumente in Production:
// Dev: electron . --debug --port=8080
// process.argv = ['electron', '.', '--debug', '--port=8080']
// Production: my-app.exe --debug --port=8080
// process.argv = ['my-app.exe', '--debug', '--port=8080']
const args = process.argv.slice(app.isPackaged ? 1 : 2);
const isDebug = args.includes('--debug');
const portArg = args.find(a => a.startsWith('--port='));
const port = portArg ? parseInt(portArg.split('=')[1]) : 3000;isPackaged ? 1 : 2 wegen des unterschiedlichen Argv-Layouts in Dev vs. Production.
Für komplexere CLIs: commander, yargs o. ä. wie bei normalen Node-Apps.
Chromium-Switches
Chromium akzeptiert hunderte Switches — von Hardware-Beschleunigung bis Memory-Limits.
// VOR app.whenReady() registrieren!
app.commandLine.appendSwitch('disable-gpu-vsync');
app.commandLine.appendSwitch('lang', 'de-DE');
app.commandLine.appendSwitch('disable-http-cache');
// Mehrere Werte
app.commandLine.appendSwitch('enable-features', 'SharedArrayBuffer');Klassische Use-Cases:
--disable-http-cachewährend Dev (verhindert Render-Cache-Probleme)--disable-gpubei Hardware-Problemen auf bestimmten Treibern--lang=de-DEzum Erzwingen der Sprache (Spell-Check, etc.)--enable-features=...für experimentelle Web-APIs
Liste aller Switches: List of Chromium Command Line Switches.
Debugging mit --inspect
Main-Prozess debuggen — wie jeder Node-Prozess:
electron --inspect=5858 .
electron --inspect-brk=5858 . # mit Halt am StartDann in Chrome chrome://inspect öffnen, Connection einrichten — DevTools für den Main. Oder mit VS Code direkt:
{
"type": "node",
"request": "launch",
"name": "Electron Main",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
"args": [".", "--inspect=5858"],
"outputCapture": "std"
}Im Renderer: DevTools sind eingebaut — Cmd+Alt+I (macOS), Ctrl+Shift+I (Windows/Linux), oder per Code: win.webContents.openDevTools().
ELECTRON_* Environment-Variablen
Eine Handvoll Env-Variablen steuert Electron-Verhalten:
| Variable | Effekt |
|---|---|
ELECTRON_ENABLE_LOGGING | Console-Output von Chromium auf stdout |
ELECTRON_ENABLE_STACK_DUMPING | Stack-Trace bei Crash |
ELECTRON_LOG_FILE | Log-Output in Datei |
ELECTRON_DISABLE_SANDBOX | Sandbox global deaktivieren (NUR Debug!) |
ELECTRON_NO_ATTACH_CONSOLE | Verhindert Console-Window auf Windows |
ELECTRON_OVERRIDE_DIST_PATH | Custom Electron-Binary nutzen |
ELECTRON_ENABLE_LOGGING=1 electron .
# mit Logfile
ELECTRON_LOG_FILE=/tmp/app.log ELECTRON_ENABLE_LOGGING=1 electron .Sehr hilfreich bei „App startet nicht und zeigt nichts" — ELECTRON_ENABLE_LOGGING=1 macht oft das Problem sichtbar.
App-eigene Konfiguration
Für persistente App-Konfig (Theme, Sprache, letzte Fenster-Größe): electron-store ist der pragmatische Default.
import Store from 'electron-store';
const store = new Store({
schema: {
theme: { type: 'string', enum: ['light','dark','system'], default: 'system' },
language: { type: 'string', default: 'de' },
windowBounds: {
type: 'object',
default: { width: 1200, height: 800 }
}
}
});
const theme = store.get('theme'); // 'system'
store.set('theme', 'dark');electron-store schreibt JSON in userData — automatisch plattformsicher, mit Schema-Validierung. Mehr im Datenpersistenz-Kapitel.
Build-Time-Konfiguration
Wer Konstanten zur Build-Zeit injizieren will (API-URL, Feature-Flags), nutzt das via Vite/Webpack:
import { defineConfig } from 'electron-vite';
export default defineConfig({
main: {
define: {
'process.env.API_URL': JSON.stringify(
process.env.NODE_ENV === 'production'
? 'https://api.example.com'
: 'http://localhost:3000'
)
}
}
});So wird process.env.API_URL zur Build-Zeit ersetzt — keine Runtime-Lookup-Kosten, keine versehentliche Config-Datei in der Distribution.
Custom Protocol Handler
App registrieren, damit Links wie myapp://login?token=xyz die App öffnen:
if (!app.isDefaultProtocolClient('myapp')) {
app.setAsDefaultProtocolClient('myapp');
}
// macOS: ankommende Links
app.on('open-url', (event, url) => {
event.preventDefault();
handleDeepLink(url);
});
// Windows/Linux: kommen via second-instance args
app.on('second-instance', (_event, argv) => {
const url = argv.find(a => a.startsWith('myapp://'));
if (url) handleDeepLink(url);
});Klassischer Use-Case: OAuth-Callback („Login mit GitHub" → Browser-Redirect zu myapp://oauth?code=...).
Besonderheiten
Chromium-Switches NUR vor app.whenReady().
Nach Init hat appendSwitch keinen Effekt mehr. Pattern: ganz oben in main.js, vor allem anderen — sogar vor Imports, die app.ready triggern könnten.
process.argv-Layout unterscheidet sich Dev vs. Production.
Dev: argv[1] ist der App-Pfad. Production: argv[1] ist schon das erste echte Argument. Mit app.isPackaged umschalten — sonst frisst dein Argument-Parser den Pfad.
ELECTRON_ENABLE_LOGGING=1 ist die Notbremse beim Crash-Debugging.
Wenn die App startet und sofort tot ist — keine Fenster, kein DevTools. Mit dieser Env-Variable schreibt Chromium seine Logs auf stdout, oft mit klarer Fehler-Ursache.
setAsDefaultProtocolClient braucht macOS-Plist-Eintrag.
Auf Windows reicht der API-Aufruf, auf macOS muss in Info.plist zusätzlich der CFBundleURLTypes-Eintrag stehen. electron-builder/Forge generieren das aus der Konfig — manuelle Setups müssen das selbst pflegen.
ELECTRON_DISABLE_SANDBOX niemals in Production.
Kann während Debug nützlich sein, aber nie in einer ausgelieferten App. Sandbox ist eine Sicherheits-Säule — wer sie deaktiviert, öffnet sich für jede Web-Schwachstelle.
Build-Time-Konstanten besser als Runtime-Config.
Was sich nach Build nicht ändern soll (API-URLs für Dev/Prod, Feature-Flags), via define injizieren — keine if (process.env.NODE_ENV) zur Runtime, kein versehentliches Auslieferen einer .env-Datei.
Weiterführende Ressourcen
Externe Quellen
- Command Line Switches — Electron-spezifische Switches
- Environment Variables — alle ELECTRON_*-Variables
- Chromium Switches — community-gepflegte Übersicht
- Deep Links
- Application Debugging