Abschied von riesigen Deployment-Dateien
Es ist ineffizient, bei jeder Ausführung einer Electron-App ein hunderte Megabyte großes Chromium-Binary mit auszuliefern. Für Solo-Entwickler steht die Größe der Installationsdatei in direktem Zusammenhang mit der Installationsrate. Deno Desktop verwendet die native Webview des Betriebssystems. Damit lässt sich eine bestehende 180-MB-App auf etwa 19 MB reduzieren. Das ist nicht nur eine einfache technologische Änderung, sondern ein Vorgang, der das Gewicht der Betriebsumgebung spürbar reduziert.
Migrations-Sprint-Checkliste
Um das Refactoring in 10 Tagen abzuschließen, muss die bestehende Struktur verworfen werden.
- Anstatt der komplexen Abhängigkeiten in package.json wird deno.lock verwendet, um das Cache-Management zu vereinfachen.
- Schwere Tools wie electron-builder und asar werden entfernt und durch die interne Deno-Build-Engine ersetzt.
- Die Kommunikations-Layer ipcMain und ipcRenderer werden gelöscht und die Prozesskontrolle mit der Methode win.bind() vereinheitlicht.
Sobald dieser Prozess abgeschlossen ist, lässt sich die Zeit des Build-Prozesses um 40 % verkürzen.
Kontrolle plattformspezifischer Webview-Unterschiede
Mac, Windows und Linux verwenden unterschiedliche Web-Engines. WKWebView und WebView2 liefern unterschiedliche Rendering-Ergebnisse. Selbst die Art und Weise, wie CSS-Spezifikationen interpretiert werden, unterscheidet sich. Insbesondere das veraltete WebKitGTK unter Linux zerstört häufig das Layout.
Um die Diskrepanzen zwischen den Plattformen zu verringern, sollten Korrektur-Skripte in die Deployment-Pipeline integriert werden.
- Mit CSS-Reset-Code werden die Standardabstände aller Browser auf 0 erzwungen.
- In der Bootstrap-Phase wird bindings.getPlatformMetadata() aufgerufen, um das laufende Betriebssystem zu identifizieren.
- Unter macOS wird im Frameless-Modus ein 28px hoher Wrapper-Div für den Bereich der Ampelsymbole reserviert, während unter Windows je nach Erkennung des Dark-Mode eine CSS-Klasse injiziert wird.
Durch diese Vorgehensweise sinkt der Aufwand, die UI für jedes Betriebssystem einzeln anpassen zu müssen.
Implementierung von Sicherheits-Wrappern für native API-Aufrufe
Die IPC-Kanäle von Electron sind anfällig für Sicherheitsvorfälle. Deno Desktop erhöht die Sicherheit durch die Übertragung von Daten über direkte Bindings. Um OS-Funktionen sicher zu steuern, müssen Wrapper-Klassen eigenständig implementiert werden.
- Datei-I/O muss zwingend auf den Sandbox-Pfad /app_sandbox_storage beschränkt werden.
- Der Klassenkonstruktor sollte eine Logik zur Verhinderung von Path Traversal enthalten, die ".."-Zeichen in Pfaden sofort blockiert.
- Beim Aufruf von Systemfunktionen wie Benachrichtigungen sollte überprüft werden, ob die übergebenen Ressourcen auf einer Whitelist stehen; es sollten ausschließlich base64-kodierte Daten verwendet werden.
Automatisierung des Deployments mit GitHub Actions
Konfiguriere und baue die Umgebung nicht für jedes OS einzeln. Durch die Matrix-Strategie von GitHub Actions lassen sich mit einem einzigen Commit gleichzeitig Windows-MSI-, Linux-AppImage- und Mac-DMG-Dateien erstellen.
- In der Umgebung ubuntu-latest werden Windows und Linux, in macos-14 das Mac-Binary erstellt.
- Der Befehl deno desktop --target wird um die Option --compress=xz ergänzt, um die finale Dateigröße zu reduzieren.
- Die Linux-Ergebnisse werden mit einem xvfb-run-Aufruf in einer virtuellen Umgebung auf ihre tatsächliche Funktionsfähigkeit getestet.
Der Aufbau dieser Pipeline beschleunigt den Deployment-Zyklus im Vergleich zum manuellen Build um das Zweifache. Die Umstellung auf Deno bietet zweierlei Vorteile: leichtere Binaries und Sandbox-Sicherheit.
