Runtime frontend
Le package d’exécution JavaScript de Wails pour l’intégration au frontend
Le runtime frontend de Wails constitue la bibliothèque standard des applications Wails. Il fournit de nombreuses fonctionnalités utilisables dans vos applications, notamment :
- Gestion des fenêtres
- Boîtes de dialogue
- Intégration au navigateur
- Presse-papiers
- Menus
- Informations système
- Événements
- Menus contextuels
- Écrans
- WML (langage de balisage Wails)
Le runtime est nécessaire à l’intégration entre Go et le frontend. Il existe 2 façons d’intégrer le runtime :
- Utiliser le package
@wailsio/runtime - Utiliser un bundle précompilé
Utiliser le package npm
Le package @wailsio/runtime est un package JavaScript qui permet d’accéder au runtime Wails depuis le frontend. Tous les modèles standard l’utilisent et il s’agit de la méthode recommandée pour intégrer le runtime à votre application. Avec le package @wailsio/runtime, seules les parties du runtime que vous utilisez sont incluses.
Le package est disponible sur npm et peut être installé avec :
npm install --save @wailsio/runtime
Utiliser un bundle précompilé
Certains projets n’utilisent pas d’outil de regroupement JavaScript et peuvent préférer une version précompilée du runtime sous forme de bundle. Vous pouvez générer cette version localement à l’aide de la commande suivante :
wails3 generate runtime
La commande génère un fichier runtime.js (ainsi qu’un fichier runtime.debug.js) dans le répertoire courant. Ce fichier est un module ES que les scripts de votre application peuvent importer comme le package npm, mais l’API est également exportée dans l’objet global window ; les applications plus simples peuvent donc l’utiliser comme suit :
<html>
<head>
<script type="module" src="./runtime.js"></script>
<script>
window.onload = function () {
wails.Window.SetTitle("A new window title");
}
</script>
</head>
<!--- ... -->
</html>Initialisation
Outre les fonctions de l’API, le runtime prend en charge les menus contextuels et le déplacement des fenêtres. Ces fonctionnalités ne fonctionneront comme prévu qu’après l’initialisation du runtime. Même si vous n’utilisez pas l’API, veillez à inclure quelque part dans votre code frontend une instruction d’importation avec effet de bord :
import "@wailsio/runtime";Votre outil de regroupement devrait détecter la présence d’effets de bord et inclure dans le build tout le code d’initialisation requis.
Plugin Vite pour les événements typés
Le runtime comprend un plugin Vite qui active la prise en charge du HMR (remplacement de module à chaud) pour les événements typés pendant le développement.
Configuration
Ajoutez le plugin à votre fichier vite.config.ts :
import { defineConfig } from 'vite'
import wails from '@wailsio/runtime/plugins/vite'
export default defineConfig({
plugins: [wails()],
})Avantages
- Rechargement automatique : les liaisons d’événements sont automatiquement régénérées et rechargées lorsque vous exécutez
wails3 generate bindings - Mode développement : fonctionne de manière transparente avec
wails3 devpour appliquer les mises à jour instantanément - Sécurité des types : prise en charge complète de TypeScript avec autocomplétion et vérification des types
Utilisation avec l’enregistrement des événements
Enregistrez vos événements dans Go :
type UserData struct {
ID string
Name string
}
func init() {
application.RegisterEvent[UserData]("user-updated")
}Générez les liaisons :
wails3 generate bindings
# Or, to include TypeScript definitions
wails3 generate bindings -ts
# For more options, see:
wails3 generate bindings -help
Utilisez les événements typés dans votre frontend :
import { Events } from '@wailsio/runtime'
import { UserUpdated } from './bindings/events'
// Type-safe event with autocomplete
Events.Emit(UserUpdated({
ID: "123",
Name: "John Doe"
}))Référence de l’API
Le runtime est organisé en modules, chacun fournissant des fonctionnalités spécifiques. Importez uniquement ce dont vous avez besoin :
import { Events, Window, Clipboard } from '@wailsio/runtime'Événements
Système d’événements permettant la communication entre Go et JavaScript.
On()
Enregistre une fonction de rappel pour un événement.
function On(eventName: string, callback: (event: WailsEvent) => void): () => void
function On<T>(eventType: EventType<T>, callback: (event: WailsEvent<T>) => void): () => voidRenvoie : fonction de désabonnement
Exemple :
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()
Enregistre une fonction de rappel qui ne s’exécute qu’une seule fois.
function Once(eventName: string, callback: (event: WailsEvent) => void): () => void
function Once<T>(eventType: EventType<T>, callback: (event: WailsEvent<T>) => void): () => voidExemple :
import { Events } from '@wailsio/runtime'
Events.Once('app-ready', () => {
console.log('App initialized')
})Emit()
Émet un événement vers le backend Go ou d’autres fenêtres.
function Emit(name: string, data?: any): Promise<boolean>
function Emit<T>(event: Event<T>): Promise<boolean>Renvoie : une promesse résolue avec true si l’événement a été annulé, et avec false dans le cas contraire
Exemple :
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()
Supprime des écouteurs d’événements.
function Off(...eventNames: string[]): voidExemple :
import { Events } from '@wailsio/runtime'
Events.Off('user-logged-in', 'user-logged-out')OffAll()
Supprime tous les écouteurs d’événements.
function OffAll(): voidFenêtre
Méthodes de gestion des fenêtres. L’exportation par défaut correspond à la fenêtre actuelle.
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()Visibilité
Show() — Affiche la fenêtre
function Show(): Promise<void>Hide() — Masque la fenêtre
function Hide(): Promise<void>Close() - Ferme la fenêtre
function Close(): Promise<void>Taille et position
SetSize(width, height) - Définit la taille de la fenêtre
function SetSize(width: number, height: number): Promise<void>Size() - Récupère la taille de la fenêtre
function Size(): Promise<{ width: number, height: number }>SetPosition(x, y) - Définit la position absolue
function SetPosition(x: number, y: number): Promise<void>Position() - Récupère la position absolue
function Position(): Promise<{ x: number, y: number }>Center() - Centre la fenêtre
function Center(): Promise<void>Exemple :
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()État de la fenêtre
Minimise() - Réduit la fenêtre
function Minimise(): Promise<void>Maximise() - Agrandit la fenêtre
function Maximise(): Promise<void>Fullscreen() - Passe en plein écran
function Fullscreen(): Promise<void>Restore() - Restaure la fenêtre depuis l’état réduit, agrandi ou plein écran
function Restore(): Promise<void>IsMinimised() - Vérifie si la fenêtre est réduite
function IsMinimised(): Promise<boolean>IsMaximised() - Vérifie si la fenêtre est agrandie
function IsMaximised(): Promise<boolean>IsFullscreen() - Vérifie si la fenêtre est en plein écran
function IsFullscreen(): Promise<boolean>Propriétés de la fenêtre
SetTitle(title) - Définit le titre de la fenêtre
function SetTitle(title: string): Promise<void>Name() - Récupère le nom de la fenêtre
function Name(): Promise<string>SetBackgroundColour(r, g, b, a) - Définit la couleur d’arrière-plan
function SetBackgroundColour(r: number, g: number, b: number, a: number): Promise<void>SetAlwaysOnTop(alwaysOnTop) - Maintient la fenêtre au premier plan
function SetAlwaysOnTop(alwaysOnTop: boolean): Promise<void>SetResizable(resizable) - Rend la fenêtre redimensionnable
function SetResizable(resizable: boolean): Promise<void>Focus et écran
Focus() - Donne le focus à la fenêtre
function Focus(): Promise<void>IsFocused() - Vérifie si la fenêtre a le focus
function IsFocused(): Promise<boolean>GetScreen() - Récupère l’écran sur lequel se trouve la fenêtre
function GetScreen(): Promise<Screen>Contenu
Reload() - Recharge la page
function Reload(): Promise<void>ForceReload() - Force le rechargement de la page (vide le cache)
function ForceReload(): Promise<void>Zoom
SetZoom(level) - Définit le niveau de zoom
function SetZoom(level: number): Promise<void>GetZoom() - Récupère le niveau de zoom
function GetZoom(): Promise<number>ZoomIn() - Augmente le zoom
function ZoomIn(): Promise<void>ZoomOut() - Réduit le zoom
function ZoomOut(): Promise<void>ZoomReset() - Réinitialise le zoom à 100 %
function ZoomReset(): Promise<void>Impression
Print() - Ouvre la boîte de dialogue d’impression native
function Print(): Promise<void>Exemple :
import { Window } from '@wailsio/runtime'
// Open print dialog for current window
await Window.Print()Remarque : cette méthode ouvre la boîte de dialogue d’impression native du système d’exploitation, permettant à l’utilisateur de sélectionner les paramètres de l’imprimante et d’imprimer le contenu actuel de la fenêtre. Contrairement à window.print(), qui peut ne pas fonctionner dans les vues web, elle utilise l’API d’impression native de la plateforme.
Presse-papiers
Opérations sur le presse-papiers.
SetText()
Définit le texte du presse-papiers.
function SetText(text: string): Promise<void>Exemple :
import { Clipboard } from '@wailsio/runtime'
await Clipboard.SetText('Hello from Wails!')Text()
Récupère le texte du presse-papiers.
function Text(): Promise<string>Exemple :
import { Clipboard } from '@wailsio/runtime'
const clipboardText = await Clipboard.Text()
console.log('Clipboard:', clipboardText)Système
Méthodes système de bas niveau permettant de communiquer directement avec le backend.
invoke()
Envoie un message brut directement au backend. Cette méthode contourne le système de liaison standard et le message est traité par le RawMessageHandler défini dans les options de votre application.
function invoke(message: any): voidExemple :
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 }))Pour plus de détails, consultez le guide des messages bruts.
Application
Méthodes au niveau de l’application.
Show()
Affiche toutes les fenêtres de l’application.
function Show(): Promise<void>Hide()
Masque toutes les fenêtres de l’application.
function Hide(): Promise<void>Quit()
Quitte l’application.
function Quit(): Promise<void>Exemple :
import { Application } from '@wailsio/runtime'
// Add quit button
document.getElementById('quit-btn').addEventListener('click', async () => {
await Application.Quit()
})Navigateur
Ouvrez des URL dans le navigateur par défaut.
OpenURL()
Ouvre une URL dans le navigateur du système.
function OpenURL(url: string | URL): Promise<void>Exemple :
import { Browser } from '@wailsio/runtime'
await Browser.OpenURL('https://wails.io')Écrans
Informations sur les écrans et gestion de ceux-ci.
GetAll()
Récupère tous les écrans.
function GetAll(): Promise<Screen[]>GetPrimary()
Récupère l’écran principal.
function GetPrimary(): Promise<Screen>GetCurrent()
Récupère l’écran actif actuel.
function GetCurrent(): Promise<Screen>Interface Screen :
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
}Exemple :
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)Boîtes de dialogue
Boîtes de dialogue natives du système d’exploitation accessibles depuis JavaScript.
Info()
Affiche une boîte de dialogue d’information.
function Info(options: MessageDialogOptions): Promise<string>Exemple :
import { Dialogs } from '@wailsio/runtime'
await Dialogs.Info({
Title: 'Success',
Message: 'Operation completed successfully!'
})Error()
Affiche une boîte de dialogue d’erreur.
function Error(options: MessageDialogOptions): Promise<string>Warning()
Affiche une boîte de dialogue d’avertissement.
function Warning(options: MessageDialogOptions): Promise<string>Question()
Affiche une boîte de dialogue de question avec des boutons personnalisés.
function Question(options: MessageDialogOptions): Promise<string>Exemple :
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()
Affiche une boîte de dialogue d’ouverture de fichier.
function OpenFile(options: OpenFileDialogOptions): Promise<string | string[]>Exemple :
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()
Affiche une boîte de dialogue d’enregistrement de fichier.
function SaveFile(options: SaveFileDialogOptions): Promise<string>WML (langage de balisage Wails)
WML fournit des attributs déclaratifs pour les actions courantes. Ajoutez des attributs aux éléments HTML :
Attributs
wml-event – Émet un événement lors d’un clic
<button wml-event="save-clicked">Save</button>wml-window – Appelle une méthode de fenêtre
<button wml-window="Close">Close Window</button>
<button wml-window="Minimise">Minimize</button>wml-target-window – Spécifie la fenêtre cible pour wml-window
<button wml-window="Show" wml-target-window="settings">
Show Settings
</button>wml-openurl – Ouvre une URL dans le navigateur
<a href="#" wml-openurl="https://wails.io">Visit Wails</a>wml-confirm – Affiche une boîte de dialogue de confirmation avant l’action
<button wml-window="Close" wml-confirm="Are you sure you want to close?">
Close
</button>Exemple :
<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>Exemple complet
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}`)
})Bonnes pratiques
✅ À faire
- Effectuez des importations sélectives – Importez uniquement ce dont vous avez besoin
- Gérez les promesses – Toutes les méthodes renvoient des promesses
- Utilisez WML pour les actions simples – Le code est plus clair qu’en JavaScript
- Vérifiez les valeurs de retour – En particulier pour les boîtes de dialogue
- Désabonnez-vous des événements – Effectuez le nettoyage lorsque vous avez terminé
❌ À ne pas faire
- N’oubliez pas await – La plupart des méthodes sont asynchrones
- Ne bloquez pas l’interface utilisateur – Utilisez correctement async/await
- N’ignorez pas les erreurs – Gérez toujours les rejets de promesse
Prise en charge de TypeScript
Le runtime inclut des définitions TypeScript complètes :
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()