Go хорошо показывает себя на бэкенде, но как только нужен графический интерфейс, выбор обычно невелик. Можно поднять локальный веб сервер и открыть его в браузере, можно взять Electron, который тащит за собой целый Chromium.
Wails позволяет писать бэкенд на обычном Go, а интерфейс на любом знакомом стеке, будь то React, Vue, Svelte, Angular или чистый JavaScript. Методы Go доступны из JavaScript напрямую, без ручного описания протокола. Для структур и методов автоматически генерируются типы TypeScript, поэтому фронтенд видит сигнатуры функций. В комплекте идут нативные диалоги и меню, поддержка тёмной и светлой темы, эффекты прозрачности окна.
Главное отличие от Electron в рендеринге.
Wails использует системный движок WebView вместо вкомпиленного Chromium. За счёт этого бинарник весит единицы мегабайт, а не сотни.Как это работает
Проверить окружение и зависимости помогает встроенная команда. Она подскажет, чего не хватает в системе:
wails doctor
Создаём проект из шаблона. Флаг
-t задаёт фронтенд, флаг -n имя проекта:wails init -n myapp -t svelte
Дальше работаем в режиме разработки с горячей перезагрузкой фронтенда:
wails dev
Финальная сборка под текущую платформу собирает один бинарник:
wails build
Теперь про связку Go и JavaScript. Любой метод структуры, привязанной к приложению, становится доступен фронтенду.
Вот пример на Go:
type App struct {
ctx context.Context
}
func (a *App) Greet(name string) string {
return fmt.Sprintf("Привет, %s!", name)
}На стороне фронтенда
Wails сам сгенерирует обёртку, и вызов выглядит как обычная асинхронная функция:import {Greet} from '../wailsjs/go/main/App'
Greet("мир").then((result) => {
console.log(result)
})Метод возвращает строку из Go, а JavaScript получает её через промис. Никакого ручного REST или WebSocket слоя писать не нужно.
Если вы знакомы с веб фронтендом, порог входа низкий. Вы остаётесь в привычном стеке, а на выходе получаете лёгкое нативное приложение одним файлом.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max
🐸 Библиотека Go-разработчика
#GoToProduction
