Das os-Modul aus Node liefert grundlegende System-Informationen — Plattform, Architektur, Speicher, CPU, User. In Electron-Apps brauchst du es regelmäßig, oft im Setup oder in der „About"-Information. Hier die wichtigsten Methoden.
Plattform und Architektur
import os from 'node:os';
os.platform(); // 'darwin', 'win32', 'linux'
os.arch(); // 'x64', 'arm64', 'ia32'
os.type(); // 'Darwin', 'Windows_NT', 'Linux'
os.release(); // '23.5.0' (Kernel-Version)
os.version(); // 'Darwin Kernel Version ...'platform und arch sind das, was du am häufigsten brauchst. Auch verfügbar als process.platform und process.arch — identische Werte, der direkte Pfad ist weniger zu importieren.
User und Hostname
os.hostname(); // 'macbook-anna'
os.userInfo(); // { uid, gid, username, homedir, shell }
os.userInfo().username;
os.homedir(); // gleicher Wert wie userInfo().homedirKlassischer Use-Case: Telemetrie mit Hostname (anonymisiert), oder default-Werte für „Du bist als <username> eingeloggt".
Speicher und CPU
os.totalmem(); // Bytes — gesamter RAM
os.freemem(); // Bytes — freier RAM
os.cpus();
// [{ model: 'Apple M2 Pro', speed: 3504, times: { user, nice, sys, idle, irq } }, ...]
os.cpus().length; // Anzahl CPU-Cores
os.loadavg(); // [1, 5, 15] — 1/5/15-Minuten Load (nur macOS/Linux)
os.uptime(); // Sekunden seit System-Bootloadavg funktioniert nicht auf Windows (gibt [0, 0, 0]). Wer plattform-übergreifend Last messen will: zeitbasiertes CPU-Sampling mit os.cpus().
Netzwerk-Interfaces
os.networkInterfaces();
// {
// en0: [
// { address: '192.168.1.42', family: 'IPv4', mac: 'a1:b2:...', internal: false }
// ],
// lo0: [...]
// }
// Erste nicht-interne IPv4
const ip = Object.values(os.networkInterfaces())
.flat()
.find(i => i.family === 'IPv4' && !i.internal)
?.address;Praktisch für Hostname-Anzeige in Settings, Multi-Device-Setups, Telemetrie.
EOL und Trennzeichen
os.EOL; // '\n' auf macOS/Linux, '\r\n' auf Windows
os.tmpdir(); // System-Temp-Verzeichnis (gleicher Wert wie app.getPath('temp'))os.EOL ist relevant beim Schreiben von Konfig-Dateien, die der User in einem Editor öffnet — Windows-User erwarten \r\n.
Verwendung in About-Dialog
ipcMain.handle('app:about-info', () => ({
appVersion: app.getVersion(),
electronVersion: process.versions.electron,
chromiumVersion: process.versions.chrome,
nodeVersion: process.versions.node,
os: `${os.type()} ${os.release()}`,
arch: os.arch(),
cpus: os.cpus().length,
totalRAM: Math.round(os.totalmem() / 1024 / 1024 / 1024) + ' GB'
}));Klassischer „About"-Dialog mit System-Info — User-freundlich, hilfreich für Bug-Reports.
Interessantes
os.platform() = process.platform.
Identische Werte. process.platform ist immer verfügbar (kein Import), os.platform() braucht den Import. Für inline-Checks oft process.platform schneller.
os ist nur im Main-Prozess.
Im Sandbox-Renderer kein direktes Node-Modul. Wer System-Info im Renderer braucht: per IPC vom Main holen — typisch beim Setup einmal abfragen, nicht in jeder Funktion neu.
os.freemem und os.totalmem sind Bytes.
Für menschen-lesbare Anzeige: Math.round(os.totalmem() / 1024**3) für GB. macOS hat eigene Memory-Pressure-Logik — freemem ist nicht 1:1 das, was Activity Monitor zeigt.
os.loadavg auf Windows = [0, 0, 0].
Nicht aussagekräftig — Windows hat das Konzept nicht nativ. Wer Load messen will: os.cpus() über die Zeit samplen und Differenz berechnen.
os.tmpdir() = app.getPath('temp').
Identische Werte. Für Konsistenz innerhalb der Electron-App: app.getPath('temp'). Sonst geht beides.
networkInterfaces() kann viele Einträge liefern.
VPN-Interfaces, Docker-Netzwerke, virtuelle Adapter. Für „die" lokale IP: nach family === 'IPv4' und !internal filtern, dann meist das erste oder das in einem privaten Bereich (192.168.*, 10.*).