
今から2年余り前、シドニーを走る列車の中から Reddit で初めて Wails を発表したとき、それほど注目を集めるとは思っていませんでした。その数日後、多くのコンテンツを発信している技術系動画ブロガーがチュートリアル動画を公開し、好意的に評価してくれました。それを機に、このプロジェクトへの関心は急速に高まりました。
Go プロジェクトに Web フロントエンドを追加できることに人々が期待を寄せているのは明らかで、私が作成した概念実証の範囲をプロジェクトは瞬く間に超えていきました。当時、Wails はフロントエンドの処理にwebviewプロジェクトを使用しており、Windows で利用できるのは IE11 レンダラーだけでした。多くのバグ報告は、この制約に起因していました。JavaScript/CSS のサポートが不十分で、デバッグ用の開発者ツールもなかったのです。開発者にとって苛立たしい環境でしたが、改善のためにできることはほとんどありませんでした。
Microsoft はいずれブラウザーを取り巻く状況を整理せざるを得なくなると、私は長い間確信していました。世の中は先へ進み、フロントエンド開発が急成長する中、IE ではもはや通用しませんでした。Microsoft が新たなブラウザー戦略の基盤として Chromium を採用すると発表したとき、Wails でそれを利用できるようになり、Windows での開発体験を次のレベルへ引き上げられるのは時間の問題だと確信しました。
本日、喜んで発表します。Windows 向け Wails v2 Betaです!このリリースには紹介すべき内容が非常にたくさんあります。飲み物を用意して席に着いたら、始めましょう……
CGO への依存なし!
冗談ではありません。本当にCGOへの依存はありません 🤯!Windows は MacOS や Linux と異なり、標準のコンパイラーが付属していません。さらに、CGO には mingw コンパイラーが必要で、そのインストール方法も非常に多くあります。CGO の要件を取り除いたことで、セットアップが大幅に簡単になり、デバッグも格段に容易になりました。これを動作させるために私もかなり尽力しましたが、実現に必要な複数のプロジェクトを立ち上げただけでなく、他の人がそれらを引き継いで発展させることも快く受け入れてくれたJohn Chadwickに、最大の功績があります。また、この道を進むきっかけとなったwincプロジェクトの作者、Tad Vizbarasにも感謝します。
WebView2 Chromium レンダラー

ついに Windows 開発者も、アプリケーションで本格的なレンダリングエンジンを利用できるようになりました!Windows で動作させるためにフロントエンドコードを無理に作り替える時代は終わりです。さらに、本格的な開発者ツールも利用できます!
ただし、WebView2 コンポーネントでは、WebView2Loader.dllをバイナリと同じ場所に配置する必要があります。このため、私たち Gopher が慣れている配布方法よりも、ほんの少し手間がかかります。私の知る限り、WebView2 を使用するすべてのソリューションとライブラリに、この依存関係があります。
しかし、Wails アプリケーションにはそのような要件がないことを、心からうれしく思います!John Chadwickの見事な技術により、この dll をバイナリ内に同梱し、ディスク上に存在するかのように Windows に読み込ませることができます。
Gopher の皆さん、喜んでください!単一バイナリの夢は今も生きています!
新機能

ネイティブメニューのサポートを求める声が数多く寄せられていました。ついに Wails がその要望に応えます。アプリケーションメニューが利用できるようになり、ネイティブメニューの機能の大半をサポートしています。標準メニュー項目、チェックボックス、ラジオグループ、サブメニュー、区切り線などが含まれます。
v1 では、ウィンドウ自体をより細かく制御したいという要望が非常に多く寄せられました。そのための新しいランタイム API を提供できることをうれしく思います。豊富な機能を備え、マルチモニター構成にも対応しています。ダイアログ API も改善されました。あらゆるダイアログのニーズに応えられる詳細な設定を備えた、モダンなネイティブダイアログを利用できるようになりました。
プロジェクトと一緒に IDE 構成を生成するオプションが追加されました。対応 IDE でプロジェクトを開くと、アプリケーションをビルドおよびデバッグするための設定がすでに完了しています。現在は VSCode に対応しており、近いうちに Goland などの他の IDE にも対応したいと考えています。

アセットのバンドルは不要
v1 の大きな難点は、アプリケーション全体を単一の JS ファイルと CSS ファイルにまとめる必要があったことです。v2 では、どのような形であれアセットをバンドルする必要がなくなりました。ローカル画像を読み込みたい場合は、ローカルの src パスを指定した<img>タグを使用します。魅力的なフォントを使いたい場合は、そのフォントをコピーし、CSS にパスを追加するだけです。
まるで Web サーバーのようですね……
はい、Web サーバーではありませんが、Web サーバーとまったく同じように動作します。
では、アセットを組み込むにはどうすればよいのでしょうか?
すべてのアセットを含む単一のembed.FSをアプリケーション構成に渡すだけです。アセットを最上位ディレクトリに置く必要さえありません。Wails が自動的に処理します。
新しい開発体験

アセットをバンドルする必要がなくなったことで、まったく新しい開発体験が実現しました。新しいwails devコマンドはアプリケーションをビルドして実行しますが、embed.FS内のアセットを使用する代わりに、ディスクから直接読み込みます。
さらに、次の機能も提供します。
- ホットリロード — フロントエンドのアセットに変更を加えると、アプリケーションのフロントエンドが自動的に再読み込みされます
- 自動再ビルド — Go コードに変更を加えると、アプリケーションが再ビルドされ、再起動します
さらに、ポート34115で Web サーバーが起動します。このサーバーは、接続したすべてのブラウザーにアプリケーションを配信します。接続中のすべての Web ブラウザーは、アセット変更時のホットリロードなどのシステムイベントに応答します。
Go では、アプリケーション内で構造体を扱うことに慣れています。構造体をフロントエンドへ送り、アプリケーションの状態として使用すると便利な場合がよくあります。v1 では、この作業の大半を手動で行う必要があり、開発者にとって少し負担になっていました。v2 では、dev モードで実行されるすべてのアプリケーションが、バインドされたメソッドの入力パラメーターまたは出力パラメーターとして使用されるすべての構造体について、TypeScript モデルを自動生成します。これにより、両方の環境間でデータモデルをシームレスに交換できます。
さらに、バインドされたすべてのメソッドをラップする別の JS モジュールも動的に生成されます。このモジュールは各メソッドの JSDoc を提供し、IDE でコード補完とヒントを利用できるようにします。Go コードをラップする自動生成モジュールで Tab キーを押したとき、データモデルが自動的にインポートされるのは実に便利です!
リモートテンプレート

アプリケーションをすぐに起動して使えるようにすることは、Wailsプロジェクトにとって常に重要な目標でした。立ち上げ当初は、react、vue、angularなど、当時のモダンなフレームワークを幅広くカバーしようとしました。フロントエンド開発の世界では技術に対するこだわりが強く、変化も速いため、最新動向を追い続けるのは困難です。その結果、基本テンプレートはすぐに古くなり、メンテナンスの悩みの種となりました。また、最新鋭の技術スタックに対応した魅力的でモダンなテンプレートも提供できていませんでした。
v2では、Wailsプロジェクトに頼るのではなく、コミュニティの皆さんが自らテンプレートを作成してホストできるようにしたいと考えました。そのため、コミュニティがサポートするテンプレートを使ってプロジェクトを作成できるようになりました。これをきっかけに、開発者が活気あるプロジェクトテンプレートのエコシステムを築いてくれることを願っています。開発者コミュニティが何を生み出してくれるのか、本当に楽しみです。
おわりに
Wails v2は、このプロジェクトの新たな基盤となるものです。このリリースの目的は、新しいアプローチについてフィードバックを集め、正式リリースまでに不具合を解消することです。ぜひご意見をお寄せください。フィードバックはv2 Betaディスカッションボードまでお願いします。
ここに至るまでには、紆余曲折があり、方針転換や白紙撤回も何度もありました。その一因は、初期の技術的な決定を変更する必要があったことであり、もう一つの要因は、時間をかけて回避策を構築していた中核的な問題の一部がアップストリームで修正されたことです。Goのembed機能がその好例です。幸い、すべてが適切なタイミングでまとまり、現在は考え得る最良のソリューションが完成しています。待った甲斐はあったと思います。わずか2か月前でさえ、これは実現不可能でした。
また、次の方々には心から感謝しなければなりません :pray:。皆さんの協力がなければ、このリリースは実現しませんでした。
- Misite Bao — 中国語翻訳に精力的に取り組み、驚くほど多くのバグを発見してくれました。
- John Chadwick — go-webview2とgo-winloaderにおける素晴らしい成果のおかげで、現在のWindows版を実現できました。
- Tad Vizbaras — 同氏のwincプロジェクトを試したことが、純粋なGoによるWailsへの道を歩み始める第一歩となりました。
- Mat Ryer — 同氏の支援、励まし、フィードバックが、プロジェクトを前進させる大きな力となりました。
そして最後に、JetBrainsをはじめとするすべてのプロジェクトスポンサーにも、特別な感謝を申し上げます。皆さんの支援は、舞台裏でさまざまな形でプロジェクトを前進させています。
プロジェクトが迎えるこの刺激的な次の段階で、皆さんがWailsを使って何を作るのか、楽しみにしています。
Lea
追伸:MacOSおよびLinuxユーザーの皆さんも、取り残されたと感じる必要はありません。この新しい基盤への移植は現在積極的に進められており、難しい作業の大半はすでに完了しています。もうしばらくお待ちください。
追々伸:Wailsがご自身や会社にとって役立つと感じた場合は、プロジェクトのスポンサーになることをご検討ください。ありがとうございます。