Zum Inhalt springen

Wie Wails funktioniert

Wails ist ein Framework zum Erstellen von Desktop-Anwendungen mit Go für das Backend und Webtechnologien für das Frontend. Im Gegensatz zu Electron bündelt Wails jedoch keinen Browser, sondern verwendet das native WebView des Betriebssystems.

Diagram

Hauptunterschiede zu Electron:

AspektWailsElectron
BrowserVom Betriebssystem bereitgestelltes WebViewGebündeltes Chromium (~100MB)
BackendGo (kompiliert)Node.js (interpretiert)
KommunikationIn-Memory-BridgeIPC (Inter-Prozess-Kommunikation)
Paketgröße~15MB~150MB
Speicher~10MB~100MB+
Startzeit<0,5s2-3s

Wails verwendet die im Betriebssystem integrierte Web-Rendering-Engine:

WebView2 (Microsoft Edge WebView2)

  • Basierend auf Chromium (selbe Engine wie der Edge-Browser)
  • Vorinstalliert auf Windows 10/11
  • Automatische Updates über Windows Update
  • Vollständige Unterstützung moderner Webstandards

Warum das wichtig ist:

  • Kein gebündelter Browser → Kleinere App-Größe
  • OS-nativ → Bessere Integration und Leistung
  • Automatische Updates → Sicherheitspatches durch OS-Updates
  • Vertrautes Rendering → Gleich wie im Systembrowser

Die Bridge ist das Herzstück von Wails – sie ermöglicht die direkte Kommunikation zwischen Go und JavaScript.

Diagram

So funktioniert es:

  1. Frontend ruft eine Go-Methode auf (über automatisch generierte Bindings)
  2. Bridge kodiert den Aufruf in JSON (Methodenname + Argumente)
  3. Router findet die Go-Methode in den registrierten Diensten
  4. Go-Methode wird ausgeführt und gibt einen Wert zurück
  5. Bridge decodiert das Ergebnis und sendet es an das Frontend zurück
  6. Promise wird aufgelöst in JavaScript mit dem Ergebnis

Leistungseigenschaften:

  • In-Memory: Keine Netzwerk-Overhead, kein HTTP
  • Zero-Copy wo möglich (für große Datenmengen)
  • Standardmäßig asynchron: Nicht-blockierend auf beiden Seiten
  • Typsicher: TypeScript-Definitionen werden automatisch generiert

Dienste sind der empfohlene Weg, um Go-Funktionalität für das Frontend verfügbar zu machen.

// Define a service (just a regular Go struct)
type GreetService struct {
prefix string
}
// Methods with exported names are automatically available
func (g *GreetService) Greet(name string) string {
return g.prefix + name + "!"
}
func (g *GreetService) GetTime() time.Time {
return time.Now()
}
// Register the service
app := application.New(application.Options{
Services: []application.Service{
application.NewService(&GreetService{prefix: "Hello, "}),
},
})

Dienstentdeckung:

  • Wails scant Ihre Struktur beim Start
  • Exportierte Methoden werden vom Frontend aufrufbar
  • Typinformationen werden für TypeScript-Bindings extrahiert
  • Fehlerbehandlung ist automatisch (Go-Fehler → JS-Ausnahmen)

Generierte TypeScript-Bindung:

// Auto-generated in frontend/bindings/GreetService.ts
export function Greet(name: string): Promise<string>
export function GetTime(): Promise<Date>

Warum Dienste?

  • Typsicher: Vollständige TypeScript-Unterstützung
  • Automatische Entdeckung: Keine manuelle Registrierung von Methoden
  • Organisiert: Verwandte Funktionalität gruppieren
  • Testbar: Dienste sind einfache Go-Strukturen

Weitere Informationen zu Diensten →

Ereignisse ermöglichen Pub/Sub-Kommunikation zwischen Komponenten.

Diagram

Verwendungsfälle:

  • Fensterkommunikation: Ein Fenster benachrichtigt andere
  • Hintergrundaufgaben: Go-Dienst benachrichtigt UI über Fortschritt
  • Statussynchronisation: Mehrere Fenster synchron halten
  • Losere Kopplung: Komponenten benötigen keine direkten Referenzen

Beispiel:

// Go: Emit an event
app.Event.Emit("user-logged-in", user)
// JavaScript: Listen for event
import { Events } from '@wailsio/runtime'
Events.On('user-logged-in', (user) => {
console.log('User logged in:', user)
})

Weitere Informationen zu Ereignissen →

Das Verständnis des Lebenszyklus hilft Ihnen zu wissen, wann Sie Ressourcen initialisieren und bereinigen sollten.

Diagram

Lifecycle hooks:

app := application.New(application.Options{
Name: "My App",
// Called before windows are created
OnStartup: func(ctx context.Context) {
// Initialise database, load config, etc.
},
// Called when app is about to quit
OnShutdown: func() {
// Save state, close connections, etc.
},
})

Learn more about lifecycle →

Understanding how Wails builds your application:

Diagram

Build steps:

  1. Analyse Go code

    • Scan services for exported methods
    • Extract parameter and return types
    • Generate method signatures
  2. Generate TypeScript bindings

    • Create .ts files for each service
    • Include full type definitions
    • Add JSDoc comments
  3. Build frontend

    • Run your bundler (Vite, webpack, etc.)
    • Minify and optimise
    • Output to frontend/dist/
  4. Compile Go

    • Compile with optimisations (-ldflags="-s -w")
    • Include build metadata
    • Platform-specific compilation
  5. Embed assets

    • Embed frontend files into Go binary
    • Compress assets
    • Create single executable

Result: A single native executable with everything embedded.

Learn more about building →

Wails behaves differently in development and production:

Characteristics:

  • Hot reload: Frontend changes reload instantly
  • Source maps: Debug with original source
  • DevTools: Browser DevTools available
  • Logging: Verbose logging enabled
  • External frontend: Served from dev server (Vite)

How it works:

Diagram

Benefits:

  • Instant feedback on changes
  • Full debugging capabilities
  • Faster iteration

Understanding memory usage helps you build efficient applications.

Memory regions:

  1. Go Heap

    • Your services and application state
    • Managed by Go garbage collector
    • Typically 5-10MB for simple apps
  2. WebView Memory

    • DOM, JavaScript heap, CSS
    • Managed by WebView’s engine
    • Typically 10-20MB for simple apps
  3. Bridge Memory

    • Message buffers for communication
    • Minimal overhead (<1MB)
    • Zero-copy for large data where possible

Optimisation tips:

  • Avoid large data transfers: Pass IDs, fetch details on demand
  • Use events for updates: Don’t poll from frontend
  • Stream large files: Don’t load entirely into memory
  • Clean up listeners: Remove event listeners when done

Learn more about performance →

Wails provides a secure-by-default architecture:

Diagram

Security features:

  1. Method whitelisting

    • Only exported methods are callable
    • Private methods are inaccessible
    • Explicit service registration required
  2. Type validation

    • Arguments checked against Go types
    • Invalid types rejected
    • Prevents injection attacks
  3. No eval()

    • Frontend can’t execute arbitrary Go code
    • Only predefined methods callable
    • No dynamic code execution
  4. Context isolation

    • Each window has its own context
    • Services can check caller context
    • Permissions per window possible

Best practices:

  • Validate user input in Go (don’t trust frontend)
  • Use context for authentication/authorisation
  • Sanitise file paths before file operations
  • Rate limit expensive operations

Learn more about security →

Application Lifecycle - Understand startup, shutdown, and lifecycle hooks
Learn More →

Go-Frontend Bridge - Deep dive into how the bridge works
Learn More →

Build System - Understand how Wails builds your application
Learn More →

Start Building - Apply what you’ve learned in a tutorial Tutorials →


Fragen zur Architektur? Stellen Sie diese im Discord oder schauen Sie in die API-Referenz.