Electron vs. Tauri für eine Capacitor-App kommt auf einen einzigen Kompromiss an: Electron bringt sein eigenes Chromium und Node.js mit, ist dadurch groß, aber überall identisch und hat eine ausgereifte Update-Lösung. Tauri nutzt die System-Webview mit einem Rust-Backend, ist also klein und leicht, rendert aber je nach Betriebssystem unterschiedlich und benötigt Rust für native Features. Für die meisten Teams, die eine bestehende Capacitor-App portieren, ist Electron die risikoärmere Standardwahl. Tauri gewinnt, wenn Downloadgröße und Speicherbedarf wichtiger sind als das Ökosystem.
Nachfolgend ein detaillierter Vergleich aus der Perspektive einer Capacitor-Codebase: Was lässt sich wiederverwenden, was muss neu geschrieben werden und was bedeutet jede Runtime für Releases?
Schnellvergleich
| Kriterien | Electron | Tauri 2 |
|---|---|---|
| Rendering-Engine | Bundled Chromium, identisch auf jedem OS | WebView2 (Chromium) auf Windows, WKWebView auf macOS, WebKitGTK auf Linux |
| Natives Backend | Node.js (TypeScript/JavaScript) | Rust |
| Typische Installationsgröße | 80 bis 150 MB | Ein paar MB für kleine Apps |
| Idle-Speicher | Höher, ein Chromium pro App | Niedriger, nutzt System-Engine |
| Wiederverwendung von Capacitor Web-code | Vollständig | Vollständig, nach Cross-Engine-Tests |
| Nur native Capacitor-Plugins | Im Main-Prozess umschreiben | Als Rust-Commands oder Tauri-Plugins umschreiben |
| Web-Bundle-Live-Updates | Ja, @capgo/electron-updater |
Keine Capgo-Unterstützung, nur Binary-Updates |
| Automatische Binary-Updates | electron-builder / autoUpdater |
tauri-plugin-updater |
| Sicherheitsmodell | Context Isolation, Sandbox, Preload-Bridge | Capabilities und Berechtigungen pro Fenster |
| Toolchain | Nur Node.js | Rust plus OS-Build-Abhängigkeiten |
Wie jede Runtime deine Capacitor App ausführt
Eine Capacitor-App ist ein statischer Web-Build plus native Plugins. Weder Electron noch Tauri führen die Capacitor-Native-Schicht aus, daher laden beide deine webDir als Web-App, und Capacitor fällt auf die Web-Implementierung jedes Plugins zurück. Capacitor.getPlatform() gibt zurück 'web' in beiden.
Das macht die Frage praktisch: Welche Runtime erleichtert es, die verlorenen nativen Teile zu ersetzen und das Ergebnis auszuliefern?
Electron
Electron bietet dir einen Node.js-Hauptprozess und Chromium-Renderer. Du schreibst Desktop-Features in TypeScript und stellst sie über ein Preload-Skript contextBridge, und rufen Sie sie aus Ihrem Web-code auf. Die vollständige Einrichtung finden Sie in unserem Guide zu der Entwicklung einer Desktop-App mit Capacitor und Electron.
Tauri
Tauri 2 bietet dir einen Rust-Kern und die System-Webview. Du rufst Rust-Commands aus JavaScript mit invokeauf und fügst Funktionen über offizielle Plugins (Dateisystem, Dialoge, Benachrichtigungen, Shell, Store, Deep Links, Updater und mehr) oder eigene Rust-code hinzu. Eine minimale Einrichtung für ein bestehendes Capacitor-Projekt:
bun add -d @tauri-apps/cli
bunx tauri init
Beantworte die Prompts, damit Tauri auf deinen Build zeigt:
{
"build": {
"frontendDist": "../dist",
"devUrl": "http://localhost:5173",
"beforeDevCommand": "bun run dev",
"beforeBuildCommand": "bun run build"
}
}
Dann bunx tauri dev für die Entwicklung und bunx tauri build für Installer. Du brauchst die Rust-Toolchain und, auf Linux, die WebKitGTK-Entwicklungspakete.
Binärgröße und Speicher
Das ist Tauris klarer Vorteil. Electron enthält in jeder App eine vollständige Chromium- und Node.js-Runtime, sodass selbst eine kleine App einen Installer im Bereich von mehreren Dutzend Megabyte erzeugt – oft noch mehr. Tauri nutzt den Webview, den das Betriebssystem bereits mitbringt, sodass der Installer hauptsächlich aus deinen Web-Assets und einer kompilierten Rust-Binary besteht.
Der Speicherbedarf folgt derselben Logik. Jede Electron-App führt ihre eigenen Chromium-Prozesse aus. Tauri verwendet die gemeinsame System-Engine und einen kleinen Rust-Prozess. Wenn deine Nutzer deine App den ganzen Tag neben anderen ressourcenintensiven Anwendungen ausführen oder du in Regionen mit begrenzter Bandbreite verteilst, ist dieser Unterschied real.
Wenn die Größe nur ein Nebenaspekt ist, etwa bei einem internen Tool, das nur einmal installiert wird, sollte sie allein nicht über die Wahl entscheiden.
Webview-Konsistenz
Electron rendert überall gleich, weil es die Engine mitliefert. Tauri rendert mit drei verschiedenen Engines.
Hier hat eine Capacitor-App einen Vorteil: Du testest bereits auf zwei Engines. Dein iOS-Build läuft in WKWebView, der Engine, die Tauri auf macOS verwendet, und dein Android-Build läuft in Android System WebView, das wie WebView2 auf Windows auf Chromium basiert. Das neue Risiko liegt hauptsächlich bei Linux, wo die WebKitGTK-Versionen zwischen Distributionen variieren und bei Funktionen und Performance hinter Safari zurückbleiben können.
| Desktop-OS | Tauri-Engine | Nächste Engine, die du bereits testest |
|---|---|---|
| macOS | WKWebView | iOS-Build |
| Windows | WebView2 (Chromium) | Android-Build |
| Linux | WebKitGTK | Keine, direkt testen |
Wenn Linux ein wichtiges Ziel ist und deine App auf modernem CSS oder intensivem WebGL basiert, eliminiert Electron eine ganze Klasse von Bugs.
Plugin-Support und native Features
Keine der beiden Laufzeitumgebungen kann die nativen iOS- und Android-code von Capacitor laden. Übertragbar ist alles, was eine Web-Implementierung hat, plus deine eigenen code.
Für jedes nativ-exklusive Plugin, von dem du abhängst:
- Electron: Schreibe die Funktion in TypeScript im Main-Process, oft mit einem Node.js-Paket von npm. Dein Team kennt die Sprache bereits.
- Tauri: Prüfe zuerst die offizielle Plugin-Liste. Wenn nichts passt, schreibe einen Rust-Command. Rust bringt eine Lernkurve mit sich, bietet aber starke Performance und Memory Safety.
Einige gängige Anforderungen lassen sich so zuordnen:
| Benötigt | Electron | Tauri |
|---|---|---|
| Dateien und Dialoge | fs, dialog Module |
fs und dialog Plugins |
| Benachrichtigungen | Notification Klasse |
notification Plugin |
| Sicherer Speicher | safeStorage |
stronghold Plugin- oder OS-Keychain-Crates |
| Deep Links | setAsDefaultProtocolClient |
deep-link Plugin |
| Autostart, Tray, Menüs | Integriert | Integriert oder offizielle Plugins |
Live-Updates und Over-the-Air-Updates
Für Capacitor-Teams gibt oft die Update-Strategie den Ausschlag.
Electron unterstützt zwei Ebenen:
- Web-Bundle-Updates mit
@capgo/electron-updater. Du lädst mitbunx @capgo/cli@latest bundle upload --channel=productionhoch, demselben Befehl, den du für Capgo Live Updates auf Mobile. Channels, Rollback und staged Rollouts verhalten sich gleich. Siehe die electron-updater-Plugin-Seite. - Binary-Updates mit dem Updater von electron-builder für Änderungen an Electron selbst oder am Main-Prozess. Unser Electron-Auto-Update-Guide erklärt alles.
Tauri hat ein offizielles Updater-Plugin, das signierte neue Versionen der gesamten App herunterlädt und installiert. Es funktioniert gut, aber jede Änderung, selbst eine einzeilige CSS-Änderung, erfordert ein neues signiertes Binary pro Plattform. Es gibt aktuell keinen Capgo Web-Bundle-Updater für Tauri, und Remote-Web-code in ein Tauri-Fenster zu laden, müsstest du selbst bauen und absichern.
Wenn dein Mobile-Release-Prozess schon auf Live Updates setzt, läuft Electron auf dem Desktop in derselben Pipeline mit.
Sicherheitsmodell
Beide können sicher sein. Der Weg dorthin ist anders.
Electron gibt dem Renderer keinen Node.js-Zugriff, wenn du contextIsolation: true, nodeIntegration: false, und sandbox: true. Du exponierst eine schmale API über den Preload und validierst jeden IPC-Call im Main-Process. Das Risiko ist Configuration Drift: Ein unsicheres Flag öffnet viel.
Tauri 2 nutzt Capabilities. Jedes Fenster bekommt eine explizite Liste von Berechtigungen, z. B. „Dateien im App-Data-Ordner lesen“, und Commands außerhalb dieser Liste werden abgelehnt. Der Default ist geschlossen, was Fehler unwahrscheinlicher macht. Der Rust-Kern eliminiert zudem Memory-Safety-Bugs aus deinem nativen code.
So oder so: Behandle die Web-Schicht als nicht vertrauenswürdig, besonders wenn du User-Content renderst oder Third-Party-Scripts lädst.
Entwickler-Setup und Team-Fit
| Frage | Electron | Tauri |
|---|---|---|
| Weitere Sprachen | Keine | Rust für native Features |
| Installieren | bun add -d electron electron-builder |
Rust-Toolchain, Tauri CLI, OS-Pakete |
| Build-Zeit | Schnell, hauptsächlich Packaging | Erster Rust-Compile langsamer, danach inkrementell |
| Debugging | Chrome DevTools überall | Engine DevTools pro OS |
| Ökosystem-Alter | Seit 2013, sehr groß | Tauri 2 seit Ende 2024 stabil, wachsend |
Ein reines Web-Team liefert eine Electron-Desktop-App in Tagen aus. Ein Team mit Rust-Erfahrung (oder dem Willen dazu) erhält mit Tauri ein schlankeres Produkt.
Wann man Electron wählen sollte
- Du benötigst das gleiche Rendering auf jedem OS, inklusive Linux.
- Du willst Live Updates des Web-Bundles auf dem Desktop über dieselben Capgo Channels wie auf Mobile.
- Dein Team schreibt TypeScript und hat keine Rust-Erfahrung.
- Du bist auf npm Packages mit Node.js-APIs für Desktop-Features angewiesen.
- Die Installationsgröße und der Speicherverbrauch sind für Ihre Nutzer akzeptabel.
Wann man Tauri wählen sollte
- Download-Größe und Idle-Speicher sind Produktanforderungen.
- Deine App läuft bereits gut in Safari und Chromium, und Linux ist ein Nischenziel oder du kannst es gründlich testen.
- Du hast Rust-Kenntnisse oder möchtest sie für performancekritische native code.
- Binary-only-Updates passen zu deinem Release-Takt.
Ein praktischer Migrationspfad
Ihr müsst euch nicht für immer entscheiden. Haltet euren Capacitor-Web-code frei von runtime-spezifischen Aufrufen:
// src/platform/desktop.ts
export interface DesktopApi {
getVersion(): Promise<string>;
openFile(): Promise<string | null>;
}
// Electron implementation calls window.desktop.* exposed by the preload
// Tauri implementation calls invoke('get_version') and the dialog plugin
Wählt die Implementierung beim Start. Eure mobilen Builds nutzen Capacitor-Plugins, und jede Desktop-Runtime bekommt einen dünnen Adapter. Ein späterer Runtime-Wechsel bedeutet, den Adapter umzuschreiben, nicht die App.
Häufige Überraschungen debuggen
Das Layout unterscheidet sich unter Linux mit Tauri. WebKitGTK hinkt hinterher. Testet auf den Distributionen, die ihr unterstützt, und vermeidet dort sehr neue CSS-Features.
Ein Plugin funktioniert auf Mobile, schlägt aber auf Desktop fehl. Es gibt keine Web-Implementierung. Schreibe die Desktop-Version in deinem Adapter.
Der Electron-Installer ist zu groß. Prüft, ob devDependencies und Source Maps aus den gepackten Dateien ausgeschlossen werden, und baue pro Architektur statt universell, wenn die Größe zählt.
Der Tauri-Build schlägt in der CI für Linux fehl. Installiere die in den Tauri-Voraussetzungen aufgeführten Pakete WebKitGTK und build-essential, bevor du baust.
Fazit
Für ein Capacitor-Team ist Electron die sicherere Wahl: keine neue Sprache, konsistentes Rendering und dieselbe live update-Pipeline wie deine iOS- und Android-Apps über Capgo. Tauri ist die bessere Produktentscheidung, wenn Größe und Speicher zählen und du dir ein bisschen Rust zutraust. So oder so: Halte runtime-spezifische code hinter einem kleinen Interface, damit die Entscheidung reversibel bleibt. Für weitere Capgo Plugins, die auf jeder Plattform helfen, schau dir die Plugin-Verzeichnis.