Wails: ставка Golang на создание настольных приложений уровня Electron
BBetter Stack
Computing/SoftwareInternet Technology
Transcript
00:00:00Wails — это кроссплатформенная технология, позволяющая создавать настольные приложения на Go.
00:00:04Об этом очень много просили на канале после выхода нескольких видео
00:00:08со сравнением десктопных фреймворков. Поэтому сегодня я покажу, как использовать Wails для разработки полноценных приложений
00:00:13и сравню его с такими решениями, как Electron и Tauri. Мы пройдем весь путь создания
00:00:17приложения для записи экрана, которое уже делали в других роликах, и сравним размер файлов,
00:00:22производительность и удобство разработки. Для меня Wails — совершенно новый инструмент, так что
00:00:27будем разбираться вместе. Wails работает по схожему с Tauri принципу, но
00:00:36бэкенд пишется на Go, а не на Rust. Интерфейс вы по-прежнему верстаете в WebView с помощью веб-технологий,
00:00:41а затем вызываете нативные API, управляемые через Golang. В итоге можно скомпилировать приложение,
00:00:47совместимое и с Mac, и с Windows. Однако, в отличие от Electron, Wails не встраивает внутри себя браузер.
00:00:52Вместо этого он использует системный движок рендеринга каждой платформы, как это делает Tauri. По идее,
00:00:58теоретически должен быть намного меньше, но мы увидим это позже при сравнении.
00:01:03И если вам нравится такой контент, друзья, подписывайтесь на канал. Итак, вот рекордер экрана,
00:01:07который я разработал на Wails; то же самое я ранее собирал на Electron и Tauri.
00:01:12Выбираем экран для записи. Нажимаем «Запись». Можно двигать курсор. Само
00:01:16окно приложения в запись не попадет. Нажимаем «Стоп». Теперь виден записанный
00:01:21фрагмент. При желании его можно обрезать, а затем просто нажать «Экспорт в MP4», чтобы сохранить видео
00:01:27прямо на диск. Если заглянуть в структуру проекта, вы увидите привычную
00:01:32картину, как и в Electron-приложениях. Фронтенд-файлы находятся в папке frontend,
00:01:36а также есть входной файл. В данном случае это Go-файл main.go, и внутри него
00:01:41расположена функция main. Опять же, аналогичную логику вы увидели бы и в Electron. Здесь мы можем
00:01:47задать заголовок, ширину, высоту, цвет фона, а также настроить
00:01:52параметры специально для Mac. Так что если вам нужно различное поведение на Mac и Windows, это делаются без проблем.
00:01:57Теперь посмотрим в папку frontend/src: там находится весь
00:02:02код на React. Если открыть app.tsx, мы увидим обычный React-код, за исключением того,
00:02:09что мы вызываем API, объявленные на стороне Go. Поглядим на импорт API и его использование по всему
00:02:16файлу: вызваются API.onrecording finished, onrecording failed, start recording, и этот API
00:02:22генерируется сам фреймворком Wails. Если открыть сам API, можно заметить, что все базовые
00:02:27функции импортируются из файла wails.js/go/main/app. А если заглянуть
00:02:33внутрь, видно, что файл сформирован автоматически: наверху валлийский язык, а ниже — английский,
00:02:39потому что, как ни странно, создатель Wails — валлиец. Здесь объявлены все эти функции:
00:02:43export video, list sources, request screen access — всё, что нужно для
00:02:49приложения записи экрана. Если теперь перейти на сторону Go в файле app.go и закомментировать
00:02:54list sources, а затем сохранить файл, в API.ts моментально появится ошибка, так как
00:02:59list sources больше не существует. Это происходит благодаря запущенному режиму wails dev. При каждом изменении
00:03:05в Go-файле типы TypeScript пересоздаются автоматически. Если вернуть код обратно и
00:03:11раскомментировать строчку, ошибка исчезнет, а само десктопное приложение перезагрузится,
00:03:16поскольку любые правки на стороне Go (то есть бэкенда) автоматически пересобирают и обновляют
00:03:23интерфейс. Теперь давайте проведем тесты и сравним эти три фреймворка.
00:03:27Сначала оценим размер бандла. Wails занимает 52 МБ, Tauri — 57 МБ, а Electron,
00:03:34что не удивляет, — 324 МБ. Wails и Tauri заметно компактнее, так как они
00:03:41не упаковывают внутри Chromium, что вполне ожидаемо. При этом стоит отметить: используя нативный
00:03:47WebView каждой ОС, как делают Wails и Tauri, вы чаше столкнетесь с различиями между платформами.
00:03:51Сейчас это выражено значительно меньше, но иметь в виду стоит. В целом, Tauri и
00:03:57Wails выдают похожие результаты по размеру сборок, ведь архитектура обоих фреймворков
00:04:02построена одинаково, несмотря на различие используемых под капотом технологий.
00:04:07Теперь посмотрим на время запуска. Как и в прошлых обзорах, мы
00:04:12запустим каждое приложение по 10 раз и посчитаем среднее значение. У Wails это 395
00:04:18миллисекунд, у Tauri — 410 мс, а у Electron — 350 мс. При «холодном» запуске,
00:04:26когда мы каждый раз очищаем кэш, результат Wails — 2337 мс, Tauri — 2049 мс, а Electron внезапно быстрее —
00:04:341890 мс. Что касается производительности: как и у Tauri, скорость работы Wails при записи
00:04:40экрана намного выше, чем у Electron. Это обусловлено архитектурой: мы используем
00:04:45нативный ScreenCaptureKit в Mac, поэтому данные не гоняются через мост. В Electron же запись идет
00:04:51из самого WebView, после чего передается на бэкенд, что создает дополнительную нагрузку.
00:04:56Технически в Electron тоже можно задействовать нативный ScreenCaptureKit, написав кастомный C-код,
00:05:02но мы сравниваем стандартные подходы, принятые в экосистеме каждой платформы.
00:05:06Перейдем к удобству разработки (DX), и здесь различия видны отчетливее всего.
00:05:11Мне действительно понравилось писать на Wails, однако реализация захвата экрана
00:05:15оказалась сложнее, чем в Tauri. Пришлось писать код на Objective-C для взаимодействия с ScreenCaptureKit,
00:05:21тогда как в Tauri можно оставаться исключительно в рамках Rust. Всё благодаря развитой
00:05:28экосистеме крейтов Rust, обволакивающих нативные фреймворки Apple. В Tauri я просто подключил крейт screen capture kit,
00:05:33и всё API записи работало на чистом Rust. В Go же не нашлось готовых решений для ScreenCaptureKit,
00:05:39зато есть Cgo — встроенный механизм Go для компиляции кода на C.
00:05:44Это значит, что на Go можно написать нативный C-код в файле .m, экспортировать его в виде C-функций,
00:05:50а затем указать Go, с какими фреймворками Apple нужно связаться. В итоге вы пишете полноценный Objective-C,
00:05:56вызывая те же API Apple, что и крейт в Rust, но полностью контролируете исходный код.
00:06:02В итоге вышло порядка 450 строк на Objective-C, которых в версии для Rust просто не требовалось.
00:06:08Поэтому я слегка склоняюсь в сторону Tauri. Экосистема библиотек вокруг Rust пока кажется богаче,
00:06:14но в конечном счете всё сводится к личным предпочтениям. Если вам нравится писать на Go, Wails — отличный
00:06:18выбор, а если предпочитаете Rust — берите Tauri. Впрочем, выбирая Wails, будьте готовы
00:06:24иногда писать нативный код, пока экосистема развивается. Надеюсь, вам понравился этот разбор,
00:06:29подписывайтесь, чтобы не пропустить новые ролики. Если хотите посмотреть другие сравнения
00:06:33десктопных фреймворков (например, где мы сравнивали Deno Desktop и Electrobun), я прикрепил ссылку
00:06:39прямо здесь. В остальном — спасибо за просмотр! С вами был Уоррен из Betterstack,
00:06:43увидимся в следующем видео. К сожалению, Майло сказал, что на этой неделе видео больше не будет,
00:06:49так что до понедельника!
00:06:50*играет музыка*