Frontend-Laufzeit
Das Wails-JavaScript-Laufzeitpaket für die Frontend-Integration
Die Wails-Frontend-Laufzeit ist die Standardbibliothek für Wails-Anwendungen. Sie bietet zahlreiche Funktionen, die Sie in Ihren Anwendungen verwenden können, darunter:
- Fensterverwaltung
- Dialoge
- Browser-Integration
- Zwischenablage
- Menüs
- Systeminformationen
- Ereignisse
- Kontextmenüs
- Bildschirme
- WML (Wails-Auszeichnungssprache)
Die Laufzeit ist für die Integration zwischen Go und dem Frontend erforderlich. Es gibt 2 Möglichkeiten, die Laufzeit zu integrieren:
- Das Paket
@wailsio/runtimeverwenden - Ein vorkompiliertes Bundle verwenden
Das npm-Paket verwenden
Das Paket @wailsio/runtime ist ein JavaScript-Paket, das vom Frontend aus Zugriff auf die Wails-Laufzeit bietet. Es wird von allen Standardvorlagen verwendet und ist die empfohlene Methode, die Laufzeit in Ihre Anwendung zu integrieren. Wenn Sie das Paket @wailsio/runtime verwenden, werden nur die von Ihnen genutzten Teile der Laufzeit eingebunden.
Das Paket ist auf npm verfügbar und kann wie folgt installiert werden:
npm install --save @wailsio/runtime
Ein vorkompiliertes Bundle verwenden
Einige Projekte verwenden keinen JavaScript-Bundler und bevorzugen möglicherweise eine vorkompilierte Bundle-Version der Laufzeit. Diese Version kann lokal mit folgendem Befehl erzeugt werden:
wails3 generate runtime
Der Befehl erzeugt im aktuellen Verzeichnis eine Datei runtime.js (und runtime.debug.js). Diese Datei ist ein ES-Modul, das von Ihren Anwendungsskripten wie das npm-Paket importiert werden kann. Die API wird jedoch auch in das globale Fensterobjekt exportiert, sodass Sie sie in einfacheren Anwendungen wie folgt verwenden können:
<html>
<head>
<script type="module" src="./runtime.js"></script>
<script>
window.onload = function () {
wails.Window.SetTitle("A new window title");
}
</script>
</head>
<!--- ... -->
</html>Initialisierung
Neben den API-Funktionen unterstützt die Laufzeit Kontextmenüs und das Ziehen von Fenstern. Diese Funktionen arbeiten erst nach der Initialisierung der Laufzeit wie erwartet. Auch wenn Sie die API nicht verwenden, müssen Sie irgendwo in Ihrem Frontend-Code eine Importanweisung einfügen, die ausschließlich wegen ihrer Seiteneffekte ausgeführt wird:
import "@wailsio/runtime";Ihr Bundler sollte die Seiteneffekte erkennen und den gesamten erforderlichen Initialisierungscode in den Build einbinden.
Vite-Plug-in für typisierte Ereignisse
Die Laufzeit enthält ein Vite-Plug-in, das während der Entwicklung HMR-Unterstützung (Hot Module Replacement) für typisierte Ereignisse aktiviert.
Einrichtung
Fügen Sie das Plug-in zu Ihrer vite.config.ts hinzu:
import { defineConfig } from 'vite'
import wails from '@wailsio/runtime/plugins/vite'
export default defineConfig({
plugins: [wails()],
})Vorteile
- Automatisches Neuladen: Ereignisbindungen werden automatisch neu generiert und geladen, wenn Sie
wails3 generate bindingsausführen - Entwicklungsmodus: Funktioniert nahtlos mit
wails3 devund ermöglicht sofortige Aktualisierungen - Typsicherheit: Vollständige TypeScript-Unterstützung mit automatischer Vervollständigung und Typprüfung
Verwendung mit der Ereignisregistrierung
Registrieren Sie Ihre Ereignisse in Go:
type UserData struct {
ID string
Name string
}
func init() {
application.RegisterEvent[UserData]("user-updated")
}Generieren Sie die Bindungen:
wails3 generate bindings
# Or, to include TypeScript definitions
wails3 generate bindings -ts
# For more options, see:
wails3 generate bindings -help
Verwenden Sie typisierte Ereignisse in Ihrem Frontend:
import { Events } from '@wailsio/runtime'
import { UserUpdated } from './bindings/events'
// Type-safe event with autocomplete
Events.Emit(UserUpdated({
ID: "123",
Name: "John Doe"
}))API-Referenz
Die Laufzeit ist in Module gegliedert, die jeweils bestimmte Funktionen bereitstellen. Importieren Sie nur, was Sie benötigen:
import { Events, Window, Clipboard } from '@wailsio/runtime'Ereignisse
Ereignissystem für die Kommunikation zwischen Go und JavaScript.
On()
Registriert eine Callback-Funktion für ein Ereignis.
function On(eventName: string, callback: (event: WailsEvent) => void): () => void
function On<T>(eventType: EventType<T>, callback: (event: WailsEvent<T>) => void): () => voidRückgabewert: Funktion zum Abbestellen
Beispiel:
import { Events } from '@wailsio/runtime'
// Basic event listening
const unsubscribe = Events.On('user-logged-in', (event) => {
console.log('User:', event.data.username)
})
// With typed events (TypeScript)
import { UserLogin } from './bindings/events'
Events.On(UserLogin, (event) => {
// event.data is typed as UserLoginData
console.log('User:', event.data.username)
})
// Later: unsubscribe()Once()
Registriert eine Callback-Funktion, die nur einmal ausgeführt wird.
function Once(eventName: string, callback: (event: WailsEvent) => void): () => void
function Once<T>(eventType: EventType<T>, callback: (event: WailsEvent<T>) => void): () => voidBeispiel:
import { Events } from '@wailsio/runtime'
Events.Once('app-ready', () => {
console.log('App initialized')
})Emit()
Sendet ein Ereignis an das Go-Backend oder andere Fenster.
function Emit(name: string, data?: any): Promise<boolean>
function Emit<T>(event: Event<T>): Promise<boolean>Rückgabewert: Promise, das zu true aufgelöst wird, wenn das Ereignis abgebrochen wurde, andernfalls zu false
Beispiel:
import { Events } from '@wailsio/runtime'
// Basic event emission
const wasCancelled = await Events.Emit('button-clicked', { buttonId: 'submit' })
// With typed events (TypeScript)
import { UserLogin } from './bindings/events'
const cancelled = await Events.Emit(UserLogin({
UserID: "123",
Username: "john_doe",
LoginTime: new Date().toISOString()
}))
if (cancelled) {
console.log('Login was cancelled by a hook')
}Off()
Entfernt Ereignis-Listener.
function Off(...eventNames: string[]): voidBeispiel:
import { Events } from '@wailsio/runtime'
Events.Off('user-logged-in', 'user-logged-out')OffAll()
Entfernt alle Ereignis-Listener.
function OffAll(): voidFenster
Methoden zur Fensterverwaltung. Der Standardexport ist das aktuelle Fenster.
import { Window } from '@wailsio/runtime'
// Current window
await Window.SetTitle('New Title')
await Window.Center()
// Get another window
const otherWindow = Window.Get('secondary')
await otherWindow.Show()Sichtbarkeit
Show() – Zeigt das Fenster an
function Show(): Promise<void>Hide() – Blendet das Fenster aus
function Hide(): Promise<void>Close() – Schließt das Fenster
function Close(): Promise<void>Größe und Position
SetSize(width, height) – Legt die Fenstergröße fest
function SetSize(width: number, height: number): Promise<void>Size() – Ruft die Fenstergröße ab
function Size(): Promise<{ width: number, height: number }>SetPosition(x, y) – Legt die absolute Position fest
function SetPosition(x: number, y: number): Promise<void>Position() – Ruft die absolute Position ab
function Position(): Promise<{ x: number, y: number }>Center() – Zentriert das Fenster
function Center(): Promise<void>Beispiel:
import { Window } from '@wailsio/runtime'
// Resize and center
await Window.SetSize(800, 600)
await Window.Center()
// Get current size
const { width, height } = await Window.Size()Fensterzustand
Minimise() – Minimiert das Fenster
function Minimise(): Promise<void>Maximise() – Maximiert das Fenster
function Maximise(): Promise<void>Fullscreen() – Wechselt in den Vollbildmodus
function Fullscreen(): Promise<void>Restore() – Stellt das Fenster aus dem minimierten, maximierten oder Vollbildzustand wieder her
function Restore(): Promise<void>IsMinimised() – Prüft, ob das Fenster minimiert ist
function IsMinimised(): Promise<boolean>IsMaximised() – Prüft, ob das Fenster maximiert ist
function IsMaximised(): Promise<boolean>IsFullscreen() – Prüft, ob sich das Fenster im Vollbildmodus befindet
function IsFullscreen(): Promise<boolean>Fenstereigenschaften
SetTitle(title) – Legt den Fenstertitel fest
function SetTitle(title: string): Promise<void>Name() – Ruft den Fensternamen ab
function Name(): Promise<string>SetBackgroundColour(r, g, b, a) – Legt die Hintergrundfarbe fest
function SetBackgroundColour(r: number, g: number, b: number, a: number): Promise<void>SetAlwaysOnTop(alwaysOnTop) – Hält das Fenster im Vordergrund
function SetAlwaysOnTop(alwaysOnTop: boolean): Promise<void>SetResizable(resizable) – Macht die Fenstergröße veränderbar
function SetResizable(resizable: boolean): Promise<void>Fokus und Bildschirm
Focus() – Fokussiert das Fenster
function Focus(): Promise<void>IsFocused() – Prüft, ob das Fenster fokussiert ist
function IsFocused(): Promise<boolean>GetScreen() – Ruft den Bildschirm ab, auf dem sich das Fenster befindet
function GetScreen(): Promise<Screen>Inhalt
Reload() – Lädt die Seite neu
function Reload(): Promise<void>ForceReload() – Erzwingt das Neuladen der Seite und leert den Cache
function ForceReload(): Promise<void>Zoom
SetZoom(level) – Legt die Zoomstufe fest
function SetZoom(level: number): Promise<void>GetZoom() – Ruft die Zoomstufe ab
function GetZoom(): Promise<number>ZoomIn() – Vergrößert die Ansicht
function ZoomIn(): Promise<void>ZoomOut() – Verkleinert die Ansicht
function ZoomOut(): Promise<void>ZoomReset() – Setzt den Zoom auf 100 % zurück
function ZoomReset(): Promise<void>Print() – Öffnet den nativen Druckdialog
function Print(): Promise<void>Beispiel:
import { Window } from '@wailsio/runtime'
// Open print dialog for current window
await Window.Print()Hinweis: Dies öffnet den nativen Druckdialog des Betriebssystems, in dem der Benutzer die Druckereinstellungen auswählen und den aktuellen Fensterinhalt drucken kann. Anders als window.print(), das in Webviews möglicherweise nicht funktioniert, verwendet diese Methode die native Druck-API der Plattform.
Zwischenablage
Operationen für die Zwischenablage.
SetText()
Legt den Text in der Zwischenablage fest.
function SetText(text: string): Promise<void>Beispiel:
import { Clipboard } from '@wailsio/runtime'
await Clipboard.SetText('Hello from Wails!')Text()
Ruft den Text aus der Zwischenablage ab.
function Text(): Promise<string>Beispiel:
import { Clipboard } from '@wailsio/runtime'
const clipboardText = await Clipboard.Text()
console.log('Clipboard:', clipboardText)System
Systemnahe Methoden für die direkte Kommunikation mit dem Backend.
invoke()
Sendet eine Rohdatennachricht direkt an das Backend. Dies umgeht das standardmäßige Bindungssystem und wird von RawMessageHandler in den Anwendungsoptionen verarbeitet.
function invoke(message: any): voidBeispiel:
import { System } from '@wailsio/runtime'
// Send a raw message to the backend
System.invoke('my-custom-message')
// Send structured data as JSON
System.invoke(JSON.stringify({ action: 'update', value: 42 }))Weitere Einzelheiten finden Sie im Leitfaden zu Rohdatennachrichten.
Anwendung
Methoden auf Anwendungsebene.
Show()
Zeigt alle Anwendungsfenster an.
function Show(): Promise<void>Hide()
Blendet alle Anwendungsfenster aus.
function Hide(): Promise<void>Quit()
Beendet die Anwendung.
function Quit(): Promise<void>Beispiel:
import { Application } from '@wailsio/runtime'
// Add quit button
document.getElementById('quit-btn').addEventListener('click', async () => {
await Application.Quit()
})Browser
Öffnet URLs im Standardbrowser.
OpenURL()
Öffnet eine URL im Systembrowser.
function OpenURL(url: string | URL): Promise<void>Beispiel:
import { Browser } from '@wailsio/runtime'
await Browser.OpenURL('https://wails.io')Bildschirme
Bildschirminformationen und -verwaltung.
GetAll()
Ruft alle Bildschirme ab.
function GetAll(): Promise<Screen[]>GetPrimary()
Ruft den primären Bildschirm ab.
function GetPrimary(): Promise<Screen>GetCurrent()
Ruft den derzeit aktiven Bildschirm ab.
function GetCurrent(): Promise<Screen>Bildschirmschnittstelle:
interface Screen {
ID: string
Name: string
ScaleFactor: number
X: number
Y: number
Size: { Width: number, Height: number }
Bounds: { X: number, Y: number, Width: number, Height: number }
WorkArea: { X: number, Y: number, Width: number, Height: number }
IsPrimary: boolean
Rotation: number
}Beispiel:
import { Screens } from '@wailsio/runtime'
// List all screens
const screens = await Screens.GetAll()
screens.forEach(screen => {
console.log(`${screen.Name}: ${screen.Size.Width}x${screen.Size.Height}`)
})
// Get primary screen
const primary = await Screens.GetPrimary()
console.log('Primary screen:', primary.Name)Dialoge
Native Betriebssystemdialoge aus JavaScript.
Info()
Zeigt einen Informationsdialog an.
function Info(options: MessageDialogOptions): Promise<string>Beispiel:
import { Dialogs } from '@wailsio/runtime'
await Dialogs.Info({
Title: 'Success',
Message: 'Operation completed successfully!'
})Error()
Zeigt einen Fehlerdialog an.
function Error(options: MessageDialogOptions): Promise<string>Warning()
Zeigt einen Warndialog an.
function Warning(options: MessageDialogOptions): Promise<string>Question()
Zeigt einen Fragedialog mit benutzerdefinierten Schaltflächen an.
function Question(options: MessageDialogOptions): Promise<string>Beispiel:
import { Dialogs } from '@wailsio/runtime'
const result = await Dialogs.Question({
Title: 'Confirm Delete',
Message: 'Are you sure you want to delete this file?',
Buttons: [
{ Label: 'Delete', IsDefault: false },
{ Label: 'Cancel', IsDefault: true }
]
})
if (result === 'Delete') {
// Delete the file
}OpenFile()
Zeigt einen Dialog zum Öffnen einer Datei an.
function OpenFile(options: OpenFileDialogOptions): Promise<string | string[]>Beispiel:
import { Dialogs } from '@wailsio/runtime'
const file = await Dialogs.OpenFile({
Title: 'Select Image',
Filters: [
{ DisplayName: 'Images', Pattern: '*.png;*.jpg;*.jpeg' },
{ DisplayName: 'All Files', Pattern: '*.*' }
]
})
if (file) {
console.log('Selected:', file)
}SaveFile()
Zeigt einen Dialog zum Speichern einer Datei an.
function SaveFile(options: SaveFileDialogOptions): Promise<string>WML (Wails Markup Language)
WML stellt deklarative Attribute für gängige Aktionen bereit. Fügen Sie HTML-Elementen Attribute hinzu:
Attribute
wml-event – Löst beim Anklicken ein Ereignis aus
<button wml-event="save-clicked">Save</button>wml-window – Ruft eine Fenstermethode auf
<button wml-window="Close">Close Window</button>
<button wml-window="Minimise">Minimize</button>wml-target-window – Gibt das Zielfenster für wml-window an
<button wml-window="Show" wml-target-window="settings">
Show Settings
</button>wml-openurl – Öffnet eine URL im Browser
<a href="#" wml-openurl="https://wails.io">Visit Wails</a>wml-confirm – Zeigt vor der Aktion einen Bestätigungsdialog an
<button wml-window="Close" wml-confirm="Are you sure you want to close?">
Close
</button>Beispiel:
<div>
<button wml-event="save-clicked">Save</button>
<button wml-window="Minimise">Minimize</button>
<button wml-window="Close" wml-confirm="Close window?">Close</button>
<a href="#" wml-openurl="https://github.com/wailsapp/wails">GitHub</a>
</div>Vollständiges Beispiel
import { Events, Window, Clipboard, Dialogs, Screens } from '@wailsio/runtime'
// Listen for events from Go
Events.On('data-updated', (event) => {
console.log('Data:', event.data)
updateUI(event.data)
})
// Window management
document.getElementById('center-btn').addEventListener('click', async () => {
await Window.Center()
})
document.getElementById('fullscreen-btn').addEventListener('click', async () => {
const isFullscreen = await Window.IsFullscreen()
if (isFullscreen) {
await Window.UnFullscreen()
} else {
await Window.Fullscreen()
}
})
// Clipboard operations
document.getElementById('copy-btn').addEventListener('click', async () => {
await Clipboard.SetText('Copied from Wails!')
})
// Dialog with confirmation
document.getElementById('delete-btn').addEventListener('click', async () => {
const result = await Dialogs.Question({
Title: 'Confirm',
Message: 'Delete this item?',
Buttons: [
{ Label: 'Delete' },
{ Label: 'Cancel', IsDefault: true }
]
})
if (result === 'Delete') {
await Events.Emit('delete-item', { id: currentItemId })
}
})
// Screen information
const screens = await Screens.GetAll()
console.log(`Detected ${screens.length} screen(s)`)
screens.forEach(screen => {
console.log(`- ${screen.Name}: ${screen.Size.Width}x${screen.Size.Height}`)
})Bewährte Verfahren
✅ Empfohlen
- Selektiv importieren – Importieren Sie nur, was Sie benötigen
- Promises verarbeiten – Alle Methoden geben Promises zurück
- WML für einfache Aktionen verwenden – Übersichtlichere Lösung als JavaScript
- Rückgabewerte prüfen – Insbesondere bei Dialogen
- Ereignisse abbestellen – Bereinigen Sie sie, sobald sie nicht mehr benötigt werden
❌ Nicht empfohlen
- await nicht vergessen – Die meisten Methoden sind asynchron
- Benutzeroberfläche nicht blockieren – Verwenden Sie async/await korrekt
- Fehler nicht ignorieren – Behandeln Sie Promise-Ablehnungen immer
TypeScript-Unterstützung
Die Runtime enthält vollständige TypeScript-Definitionen:
import { Events, Window } from '@wailsio/runtime'
Events.On('custom-event', (event) => {
// TypeScript knows event.data, event.name, event.sender
console.log(event.data)
})
// All methods are fully typed
const size: { width: number, height: number } = await Window.Size()