
Когда чуть более 2 лет назад я впервые объявил о Wails на Reddit, находясь в поезде в Сиднее, я не ожидал, что проект привлечёт много внимания. Через несколько дней автор технического видеоблога, выпускающий много материалов, выпустил обучающее видео и положительно отозвался о проекте — с этого момента интерес к нему стремительно рос.
Было очевидно, что возможность добавлять веб-интерфейсы к проектам на Go вызвала у людей энтузиазм, и почти сразу благодаря им проект вышел за рамки созданного мной прототипа для проверки концепции. В то время для работы с веб-интерфейсом Wails использовал проект webview, а в Windows единственным вариантом был механизм отрисовки IE11. Причиной многих сообщений об ошибках было именно это ограничение: слабая поддержка JavaScript и CSS и отсутствие инструментов разработчика для отладки. Разрабатывать в таких условиях было неудобно, но исправить ситуацию практически не представлялось возможным.
Долгое время я был твёрдо убеждён, что Microsoft в конце концов придётся разобраться со своими браузерами. Мир двигался вперёд, фронтенд-разработка бурно развивалась, а IE уже не отвечал требованиям времени. Когда Microsoft объявила о переходе на Chromium как основу нового направления развития браузеров, я понял: возможность использовать его в Wails — лишь вопрос времени, и это выведет разработку для Windows на новый уровень.
Сегодня я рад объявить: бета-версия Wails v2 для Windows! В этом выпуске невероятно много нового, так что возьмите что-нибудь выпить, устраивайтесь поудобнее, и начнём…
Никакой зависимости от CGO!
Нет, я не шучу: никакой зависимости от CGO 🤯! В отличие от MacOS и Linux, Windows не поставляется с компилятором по умолчанию. Кроме того, для CGO требуется компилятор mingw, а вариантов его установки очень много. Отказ от требования использовать CGO значительно упростил настройку и существенно облегчил отладку. Хотя я приложил немало усилий, чтобы всё заработало, основная заслуга принадлежит John Chadwick: он не только начал несколько проектов, благодаря которым это стало возможным, но и позволил другим взять эти проекты за основу и развивать их дальше. Также благодарю Tad Vizbaras, чей проект winc направил меня по этому пути.
Механизм отрисовки Chromium в WebView2

Наконец-то разработчики под Windows получили первоклассный механизм отрисовки для своих приложений! Больше не нужно изощряться с кодом frontend, чтобы он работал в Windows. Вдобавок вы получаете первоклассные инструменты разработчика!
Однако компонент WebView2 требует, чтобы WebView2Loader.dll находился рядом с исполняемым файлом. Из-за этого распространять приложение немного сложнее, чем мы, разработчики Go, привыкли. Такая зависимость есть у всех известных мне решений и библиотек, использующих WebView2.
Но я невероятно рад сообщить, что у приложений Wails такого требования нет! Благодаря магии John Chadwick мы можем встроить эту DLL в исполняемый файл и заставить Windows загрузить её так, будто она находится на диске.
Разработчики Go, ликуйте! Мечта об одном исполняемом файле жива!
Новые возможности

Многие просили добавить поддержку нативных меню. Наконец Wails предоставляет такую возможность. Теперь доступны меню приложений с поддержкой большинства возможностей нативных меню, включая стандартные пункты, флажки, группы переключателей, подменю и разделители.
В v1 поступило огромное количество просьб предоставить больше возможностей управления самим окном. Я рад сообщить, что для этого появились новые API среды выполнения. Они обладают широкими возможностями и поддерживают конфигурации с несколькими мониторами. Также улучшен API диалоговых окон: теперь можно создавать современные нативные диалоговые окна с гибкой настройкой для любых задач.
Теперь вместе с проектом можно сгенерировать конфигурацию IDE. Это означает, что при открытии проекта в поддерживаемой IDE она уже будет настроена для сборки и отладки приложения. В настоящее время поддерживается VSCode, но вскоре мы надеемся добавить поддержку других IDE, например Goland.

Ресурсы больше не нужно объединять в пакеты
Одним из главных неудобств v1 была необходимость сводить всё приложение к единственным файлам JS и CSS. Я рад сообщить, что в v2 объединять ресурсы в пакеты каким бы то ни было образом больше не требуется. Хотите загрузить локальное изображение? Используйте тег <img> с локальным путём в атрибуте src. Хотите использовать интересный шрифт? Скопируйте его и добавьте путь к нему в CSS.
Ого, звучит как веб-сервер…
Да, это работает в точности как веб-сервер, но веб-сервером не является.
Так как же включить ресурсы в приложение?
Просто передайте в конфигурацию приложения единственный embed.FS, содержащий все ваши ресурсы. Им даже не обязательно находиться в корневом каталоге — Wails сам во всём разберётся.
Новый процесс разработки

Поскольку ресурсы больше не нужно объединять в пакеты, процесс разработки стал совершенно иным. Новая команда wails dev соберёт и запустит приложение, но вместо ресурсов из embed.FS загрузит их непосредственно с диска.
Кроме того, она предоставляет следующие возможности:
- Горячая перезагрузка — любое изменение ресурсов frontend автоматически перезагружает frontend приложения
- Автоматическая пересборка — любое изменение кода Go приводит к пересборке и перезапуску приложения
Кроме того, на порту 34115 запускается веб-сервер. Он предоставляет ваше приложение любому подключившемуся к нему браузеру. Все подключённые браузеры будут реагировать на системные события, например выполнять горячую перезагрузку при изменении ресурсов.
В приложениях на Go мы привыкли работать со структурами. Часто бывает полезно отправлять структуры во frontend и использовать их как состояние приложения. В v1 многое приходилось делать вручную, что создавало дополнительную нагрузку на разработчика. Я рад сообщить, что в v2 для любого приложения, запущенного в режиме разработки, автоматически создаются модели TypeScript для всех структур, используемых как входные или выходные параметры привязанных методов. Это обеспечивает беспрепятственный обмен моделями данных между двумя средами.
Кроме того, динамически создаётся ещё один модуль JS, предоставляющий обёртки для всех привязанных методов. Он добавляет JSDoc для ваших методов, благодаря чему IDE может дополнять код и показывать подсказки. Особенно здорово, когда при нажатии Tab в автоматически созданном модуле-обёртке для кода Go модели данных импортируются автоматически!
Удалённые шаблоны

Одной из ключевых целей проекта Wails всегда была возможность быстро запустить приложение. На момент запуска мы старались охватить многие популярные тогда современные фреймворки: React, Vue и Angular. Мир фронтенд-разработки полон категоричных мнений, стремительно меняется, и уследить за ним непросто! В результате наши базовые шаблоны довольно быстро устаревали, а их сопровождение доставляло немало хлопот. Кроме того, у нас не было передовых современных шаблонов для новейших технологических стеков.
В v2 я хотел расширить возможности сообщества, позволив вам самостоятельно создавать и размещать шаблоны, а не полагаться на проект Wails. Поэтому теперь вы можете создавать проекты на основе шаблонов, поддерживаемых сообществом! Надеюсь, это вдохновит разработчиков на создание развитой экосистемы шаблонов проектов. Мне действительно не терпится увидеть, что сможет создать наше сообщество разработчиков!
Заключение
Wails v2 закладывает новую основу проекта. Цель этого выпуска — получить отзывы о новом подходе и устранить все ошибки до полноценного релиза. Мы будем очень рады вашим откликам. Оставляйте их на форуме обсуждения бета-версии v2.
На пути к этому этапу было множество неожиданных поворотов, смен курса и возвратов к прежним решениям. Отчасти это было связано с необходимостью пересмотреть ранние технические решения, а отчасти — с тем, что некоторые ключевые проблемы, для которых мы долго создавали обходные решения, были устранены в вышестоящих проектах. Хороший пример — механизм встраивания в Go. К счастью, всё сложилось в нужный момент, и сегодня у нас есть лучшее из возможных решений. Я считаю, что ожидание того стоило: даже 2 месяцев назад это было бы невозможно.
Я также хочу выразить огромную благодарность :pray: следующим людям, ведь без них этого выпуска просто не было бы:
- Misite Bao — за неустанную работу над переводом на китайский язык и невероятный талант находить ошибки.
- John Chadwick — его потрясающая работа над go-webview2 и go-winloader сделала возможной нынешнюю версию для Windows.
- Tad Vizbaras — эксперименты с его проектом winc стали первым шагом на пути к реализации Wails исключительно на Go.
- Mat Ryer — его поддержка, ободрение и отзывы очень помогли развитию проекта.
И наконец, я хотел бы выразить особую благодарность всем спонсорам проекта, включая JetBrains: их поддержка незаметно помогает развивать проект самыми разными способами.
С нетерпением жду возможности увидеть, что люди создадут с помощью Wails на этом новом захватывающем этапе развития проекта!
Lea.
P. S. Пользователям MacOS и Linux не стоит чувствовать себя обделёнными: перенос на эту новую основу активно продолжается, и большая часть сложной работы уже выполнена. Наберитесь терпения!
P. P. S. Если Wails приносит пользу вам или вашей компании, пожалуйста, рассмотрите возможность стать спонсором проекта. Спасибо!