Flutter Webで作ったアプリを既存のWebサービスへ組み込みたい——そんなとき、flutter build web の成果物を配置するだけでは本番運用はできません。
私たちは脳トレサービス「脳タイム」で、ナンプレ・将棋・ソリティアなど20以上のゲームをすべてFlutterで開発し、「npmパッケージとして配布されるWeb SDK」としてNext.js製サービスへ組み込み、本番運用しています。
その過程では、
・Flutter Engineを安全に破棄できない
・ホストSPAとブラウザ履歴が競合する
・Dart↔JavaScript間の初期化タイミングでクラッシュする
・CanvasKitのロードが初回表示を圧迫する
・20以上のタイトルを少人数で保守し続けるとビルド・検証が破綻する
など、「Flutterアプリ」ではなく「SDK」として配布・運用するからこそ直面する課題が数多くありました。
このセッションでは、20以上のゲームを運用してたどり着いたFlutter Web Embedding Architectureを、実運用で得た知見とともに紹介します。
【想定視聴者】
・Flutter Webを既存のWebサービスへ組み込みたい方
・Flutter Webを実サービスで運用・配布する設計に興味がある方
・Flutter WebとJavaScriptの連携、ライフサイクル設計に悩んでいる方
・Flutter Webの採用可否を技術的な観点から判断したい方
【このセッションで持ち帰れること】
・Flutter WebをSDKとして設計・配布するための考え方
・Flutter Webをホストアプリケーションと安全に共存させる方法
・JavaScriptとの境界(API契約)の設計方法
・Flutter Webを複数タイトル・長期運用するための実践的なノウハウ
【お話しする内容】
1. Flutter WebをSDKとして配るとは
・なぜゲームエンジンではなくFlutterを選び、SDKとして配布する構成にしたのか
・なぜiframe構成を採用したのか
・FlutterアプリではなくSDKとして設計する考え方
2. Embeddingのライフサイクル設計
・same-origin iframeによる安全なmount / dispose
・Android ChromeのWebGLコンテキストリーク
・iOS Safariの長押しルーペなど実機依存の落とし穴
3. ホストとの契約設計
・setUrlStrategyによる履歴管理
・js_interopによるイベント通知
・callback契約とLateInitializationError対策
・ready Promiseによる初期化同期
4. SDKの配布とパフォーマンス設計
・npmレジストリでの配布
・バージョン付き配信パスによるキャッシュ戦略
・CanvasKit(WASM)のCDN配信
・dart2wasm + skwasmビルドの本番運用と、埋め込み構成ならではの制約
・prefetchによる初回ロード改善
5. 20以上のゲームを運用するための仕組み
・ゲーム単独起動エントリポイント
・スクリーンショットE2Eによる品質保証
・SDK化によって得られた保守性
最後に、このSDK契約をFlutter Add-to-Appやモバイル向けFlutter SDKへ展開する構想についても紹介します。
Flutter Webを既存Webサービスへ組み込む際には、アプリを配布するのではなく、「SDK」として設計するという視点が重要になります。
本セッションでは、20以上のゲームを継続運用して得た知見をもとに、Flutter Webを既存Webサービスへ安全に組み込むための設計パターンを共有します。