Frontend Runtime
Runtime frontend Wails adalah pustaka standar untuk aplikasi Wails. Runtime menyediakan beberapa fitur yang dapat digunakan dalam aplikasi Anda, termasuk:
- Pengelolaan window
- Dialog
- Integrasi browser
- Clipboard
- Menu
- Informasi sistem
- Events
- Context Menus
- Screens
- WML (Wails Markup Language)
Runtime diperlukan untuk integrasi antara Go dan frontend. Ada 2 cara untuk mengintegrasikan runtime:
- Menggunakan paket
@wailsio/runtime - Menggunakan bundle yang sudah di-build
Menggunakan paket npm
Section titled “Menggunakan paket npm”Paket @wailsio/runtime adalah paket JavaScript yang menyediakan akses ke
runtime Wails dari frontend. Paket ini digunakan oleh semua template standar
dan merupakan cara yang direkomendasikan untuk mengintegrasikan runtime ke aplikasi Anda.
Dengan menggunakan paket @wailsio/runtime, Anda hanya akan menyertakan bagian runtime yang Anda gunakan.
Paket tersedia di npm dan dapat diinstal menggunakan:
npm install --save @wailsio/runtimeMenggunakan bundle yang sudah di-build
Section titled “Menggunakan bundle yang sudah di-build”Beberapa proyek tidak akan menggunakan bundler Javascript dan mungkin lebih memilih menggunakan versi bundle runtime yang sudah di-build. Versi ini dapat dibuat secara lokal menggunakan perintah berikut:
wails3 generate runtimePerintah akan mengeluarkan file runtime.js (dan runtime.debug.js) di direktori saat ini.
File ini adalah modul ES yang dapat diimpor oleh skrip aplikasi Anda
sama seperti paket npm, tetapi API juga diekspor ke objek window global,
jadi untuk aplikasi yang lebih sederhana Anda dapat menggunakannya sebagai berikut:
<html> <head> <script type="module" src="./runtime.js"></script> <script> window.onload = function () { wails.Window.SetTitle("A new window title"); } </script> </head> <!--- ... --></html>Inisialisasi
Section titled “Inisialisasi”Selain fungsi API, runtime menyediakan dukungan untuk menu konteks dan window dragging. Fitur ini hanya akan berfungsi seperti yang diharapkan setelah runtime diinisialisasi. Meskipun Anda tidak menggunakan API, pastikan untuk menyertakan pernyataan impor side-effect di suatu tempat dalam kode frontend Anda:
import "@wailsio/runtime";Bundler Anda harus mendeteksi keberadaan side-effect dan menyertakan semua kode inisialisasi yang diperlukan dalam build.
Plugin Vite untuk Event Bertipe
Section titled “Plugin Vite untuk Event Bertipe”Runtime menyertakan plugin Vite yang mengaktifkan dukungan HMR (Hot Module Replacement) untuk event bertipe selama pengembangan.
Tambahkan plugin ke vite.config.ts Anda:
import { defineConfig } from 'vite'import wails from '@wailsio/runtime/plugins/vite'
export default defineConfig({ plugins: [wails()],})Manfaat
Section titled “Manfaat”- Pemuatan Ulang Otomatis: Binding event dibuat ulang dan dimuat ulang secara otomatis saat Anda menjalankan
wails3 generate bindings - Mode Pengembangan: Bekerja mulus dengan
wails3 devuntuk pembaruan instan - Type Safety: Dukungan TypeScript penuh dengan autocomplete dan pengecekan tipe
Penggunaan dengan Registrasi Event
Section titled “Penggunaan dengan Registrasi Event”Daftarkan event Anda di Go:
type UserData struct { ID string Name string}
func init() { application.RegisterEvent[UserData]("user-updated")}Buat binding:
wails3 generate bindings
# Atau, untuk menyertakan definisi TypeScriptwails3 generate bindings -ts
# Untuk opsi lainnya, lihat:wails3 generate bindings -helpGunakan event bertipe di frontend Anda:
import { Events } from '@wailsio/runtime'import { UserUpdated } from './bindings/events'
// Event type-safe dengan autocompleteEvents.Emit(UserUpdated({ ID: "123", Name: "John Doe"}))Referensi API
Section titled “Referensi API”Runtime diorganisir ke dalam modul, masing-masing menyediakan fungsionalitas tertentu. Impor hanya yang Anda butuhkan:
import { Events, Window, Clipboard } from '@wailsio/runtime'Events
Section titled “Events”Sistem event untuk komunikasi antara Go dan JavaScript.
Mendaftarkan callback untuk event.
function On(eventName: string, callback: (event: WailsEvent) => void): () => voidfunction On<T>(eventType: EventType<T>, callback: (event: WailsEvent<T>) => void): () => voidMengembalikan: Fungsi unsubscribe
Contoh:
import { Events } from '@wailsio/runtime'
// Mendengarkan event dasarconst unsubscribe = Events.On('user-logged-in', (event) => { console.log('User:', event.data.username)})
// Dengan event bertipe (TypeScript)import { UserLogin } from './bindings/events'
Events.On(UserLogin, (event) => { // event.data bertipe sebagai UserLoginData console.log('User:', event.data.username)})
// Nanti: unsubscribe()Once()
Section titled “Once()”Mendaftarkan callback yang hanya berjalan sekali.
function Once(eventName: string, callback: (event: WailsEvent) => void): () => voidfunction Once<T>(eventType: EventType<T>, callback: (event: WailsEvent<T>) => void): () => voidContoh:
import { Events } from '@wailsio/runtime'
Events.Once('app-ready', () => { console.log('App initialized')})Emit()
Section titled “Emit()”Mengirim event ke backend Go atau window lain.
function Emit(name: string, data?: any): Promise<boolean>function Emit<T>(event: Event<T>): Promise<boolean>Mengembalikan: Promise yang resolve ke true jika event dibatalkan, false jika tidak
Contoh:
import { Events } from '@wailsio/runtime'
// Pengiriman event dasarconst wasCancelled = await Events.Emit('button-clicked', { buttonId: 'submit' })
// Dengan event bertipe (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')}Menghapus event listener.
function Off(...eventNames: string[]): voidContoh:
import { Events } from '@wailsio/runtime'
Events.Off('user-logged-in', 'user-logged-out')OffAll()
Section titled “OffAll()”Menghapus semua event listener.
function OffAll(): voidWindow
Section titled “Window”Metode pengelolaan window. Ekspor default adalah window saat ini.
import { Window } from '@wailsio/runtime'
// Window saat iniawait Window.SetTitle('New Title')await Window.Center()
// Dapatkan window lainconst otherWindow = Window.Get('secondary')await otherWindow.Show()Visibilitas
Section titled “Visibilitas”Show() - Menampilkan window
function Show(): Promise<void>Hide() - Menyembunyikan window
function Hide(): Promise<void>Close() - Menutup window
function Close(): Promise<void>Ukuran dan Posisi
Section titled “Ukuran dan Posisi”SetSize(width, height) - Mengatur ukuran window
function SetSize(width: number, height: number): Promise<void>Size() - Mendapatkan ukuran window
function Size(): Promise<{ width: number, height: number }>SetPosition(x, y) - Mengatur posisi absolut
function SetPosition(x: number, y: number): Promise<void>Position() - Mendapatkan posisi absolut
function Position(): Promise<{ x: number, y: number }>Center() - Memusatkan window
function Center(): Promise<void>Contoh:
import { Window } from '@wailsio/runtime'
// Ubah ukuran dan pusatkanawait Window.SetSize(800, 600)await Window.Center()
// Dapatkan ukuran saat iniconst { width, height } = await Window.Size()Status Window
Section titled “Status Window”Minimise() - Meminimalkan window
function Minimise(): Promise<void>Maximise() - Memaksimalkan window
function Maximise(): Promise<void>Fullscreen() - Memasuki fullscreen
function Fullscreen(): Promise<void>Restore() - Memulihkan dari minimized/maximized/fullscreen
function Restore(): Promise<void>IsMinimised() - Memeriksa apakah diminimalkan
function IsMinimised(): Promise<boolean>IsMaximised() - Memeriksa apakah dimaksimalkan
function IsMaximised(): Promise<boolean>IsFullscreen() - Memeriksa apakah fullscreen
function IsFullscreen(): Promise<boolean>Properti Window
Section titled “Properti Window”SetTitle(title) - Mengatur judul window
function SetTitle(title: string): Promise<void>Name() - Mendapatkan nama window
function Name(): Promise<string>SetBackgroundColour(r, g, b, a) - Mengatur warna latar belakang
function SetBackgroundColour(r: number, g: number, b: number, a: number): Promise<void>SetAlwaysOnTop(alwaysOnTop) - Menjaga window tetap di atas
function SetAlwaysOnTop(alwaysOnTop: boolean): Promise<void>SetResizable(resizable) - Membuat window dapat diubah ukurannya
function SetResizable(resizable: boolean): Promise<void>Fokus dan Layar
Section titled “Fokus dan Layar”Focus() - Memfokuskan window
function Focus(): Promise<void>IsFocused() - Memeriksa apakah terfokus
function IsFocused(): Promise<boolean>GetScreen() - Mendapatkan layar tempat window berada
function GetScreen(): Promise<Screen>Konten
Section titled “Konten”Reload() - Memuat ulang halaman
function Reload(): Promise<void>ForceReload() - Memaksa muat ulang halaman (membersihkan cache)
function ForceReload(): Promise<void>SetZoom(level) - Mengatur level zoom
function SetZoom(level: number): Promise<void>GetZoom() - Mendapatkan level zoom
function GetZoom(): Promise<number>ZoomIn() - Meningkatkan zoom
function ZoomIn(): Promise<void>ZoomOut() - Mengurangi zoom
function ZoomOut(): Promise<void>ZoomReset() - Mereset zoom ke 100%
function ZoomReset(): Promise<void>Pencetakan
Section titled “Pencetakan”Print() - Membuka dialog cetak native
function Print(): Promise<void>Contoh:
import { Window } from '@wailsio/runtime'
// Buka dialog cetak untuk window saat iniawait Window.Print()Catatan: Ini membuka dialog cetak OS native, memungkinkan pengguna memilih pengaturan printer dan mencetak konten window saat ini. Berbeda dengan window.print() yang mungkin tidak berfungsi di webview, ini menggunakan API pencetakan platform native.
Clipboard
Section titled “Clipboard”Operasi clipboard.
SetText()
Section titled “SetText()”Mengatur teks clipboard.
function SetText(text: string): Promise<void>Contoh:
import { Clipboard } from '@wailsio/runtime'
await Clipboard.SetText('Hello from Wails!')Text()
Section titled “Text()”Mendapatkan teks clipboard.
function Text(): Promise<string>Contoh:
import { Clipboard } from '@wailsio/runtime'
const clipboardText = await Clipboard.Text()console.log('Clipboard:', clipboardText)System
Section titled “System”Metode sistem tingkat rendah untuk komunikasi langsung dengan backend.
invoke()
Section titled “invoke()”Mengirim pesan mentah langsung ke backend. Ini melewati sistem binding standar dan ditangani oleh RawMessageHandler dalam opsi aplikasi Anda.
function invoke(message: any): voidContoh:
import { System } from '@wailsio/runtime'
// Kirim pesan mentah ke backendSystem.invoke('my-custom-message')
// Kirim data terstruktur sebagai JSONSystem.invoke(JSON.stringify({ action: 'update', value: 42 }))Untuk detail lebih lanjut, lihat Panduan Raw Messages.
Application
Section titled “Application”Metode tingkat aplikasi.
Show()
Section titled “Show()”Menampilkan semua window aplikasi.
function Show(): Promise<void>Hide()
Section titled “Hide()”Menyembunyikan semua window aplikasi.
function Hide(): Promise<void>Quit()
Section titled “Quit()”Keluar dari aplikasi.
function Quit(): Promise<void>Contoh:
import { Application } from '@wailsio/runtime'
// Tambahkan tombol quitdocument.getElementById('quit-btn').addEventListener('click', async () => { await Application.Quit()})Browser
Section titled “Browser”Membuka URL di browser default.
OpenURL()
Section titled “OpenURL()”Membuka URL di browser sistem.
function OpenURL(url: string | URL): Promise<void>Contoh:
import { Browser } from '@wailsio/runtime'
await Browser.OpenURL('https://wails.io')Screens
Section titled “Screens”Informasi dan pengelolaan layar.
GetAll()
Section titled “GetAll()”Mendapatkan semua layar.
function GetAll(): Promise<Screen[]>GetPrimary()
Section titled “GetPrimary()”Mendapatkan layar utama.
function GetPrimary(): Promise<Screen>GetCurrent()
Section titled “GetCurrent()”Mendapatkan layar aktif saat ini.
function GetCurrent(): Promise<Screen>Antarmuka 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}Contoh:
import { Screens } from '@wailsio/runtime'
// Daftar semua layarconst screens = await Screens.GetAll()screens.forEach(screen => { console.log(`${screen.Name}: ${screen.Size.Width}x${screen.Size.Height}`)})
// Dapatkan layar utamaconst primary = await Screens.GetPrimary()console.log('Primary screen:', primary.Name)Dialogs
Section titled “Dialogs”Dialog OS native dari JavaScript.
Info()
Section titled “Info()”Menampilkan dialog informasi.
function Info(options: MessageDialogOptions): Promise<string>Contoh:
import { Dialogs } from '@wailsio/runtime'
await Dialogs.Info({ Title: 'Success', Message: 'Operation completed successfully!'})Error()
Section titled “Error()”Menampilkan dialog error.
function Error(options: MessageDialogOptions): Promise<string>Warning()
Section titled “Warning()”Menampilkan dialog peringatan.
function Warning(options: MessageDialogOptions): Promise<string>Question()
Section titled “Question()”Menampilkan dialog pertanyaan dengan tombol kustom.
function Question(options: MessageDialogOptions): Promise<string>Contoh:
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') { // Hapus file}OpenFile()
Section titled “OpenFile()”Menampilkan dialog buka file.
function OpenFile(options: OpenFileDialogOptions): Promise<string | string[]>Contoh:
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()
Section titled “SaveFile()”Menampilkan dialog simpan file.
function SaveFile(options: SaveFileDialogOptions): Promise<string>WML (Wails Markup Language)
Section titled “WML (Wails Markup Language)”WML menyediakan atribut deklaratif untuk aksi umum. Tambahkan atribut ke elemen HTML:
Atribut
Section titled “Atribut”wml-event - Mengirim event saat diklik
<button wml-event="save-clicked">Save</button>wml-window - Memanggil metode window
<button wml-window="Close">Close Window</button><button wml-window="Minimise">Minimize</button>wml-target-window - Menentukan window target untuk wml-window
<button wml-window="Show" wml-target-window="settings"> Show Settings</button>wml-openurl - Membuka URL di browser
<a href="#" wml-openurl="https://wails.io">Visit Wails</a>wml-confirm - Menampilkan dialog konfirmasi sebelum aksi
<button wml-window="Close" wml-confirm="Are you sure you want to close?"> Close</button>Contoh:
<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>Contoh Lengkap
Section titled “Contoh Lengkap”import { Events, Window, Clipboard, Dialogs, Screens } from '@wailsio/runtime'
// Dengarkan event dari GoEvents.On('data-updated', (event) => { console.log('Data:', event.data) updateUI(event.data)})
// Pengelolaan windowdocument.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() }})
// Operasi clipboarddocument.getElementById('copy-btn').addEventListener('click', async () => { await Clipboard.SetText('Copied from Wails!')})
// Dialog dengan konfirmasidocument.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 }) }})
// Informasi layarconst 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}`)})Praktik Terbaik
Section titled “Praktik Terbaik”✅ Lakukan
Section titled “✅ Lakukan”- Impor secara selektif - Hanya impor yang Anda butuhkan
- Tangani promise - Semua metode mengembalikan promise
- Gunakan WML untuk aksi sederhana - Lebih bersih daripada JavaScript
- Periksa nilai kembalian - Terutama untuk dialog
- Berhenti berlangganan event - Bersihkan saat selesai
❌ Jangan
Section titled “❌ Jangan”- Jangan lupa await - Sebagian besar metode bersifat async
- Jangan blokir UI - Gunakan async/await dengan benar
- Jangan abaikan error - Selalu tangani rejection
Dukungan TypeScript
Section titled “Dukungan TypeScript”Runtime menyertakan definisi TypeScript lengkap:
import { Events, Window } from '@wailsio/runtime'
Events.On('custom-event', (event) => { // TypeScript mengetahui event.data, event.name, event.sender console.log(event.data)})
// Semua metode sepenuhnya bertipeconst size: { width: number, height: number } = await Window.Size()