Flutter Webでの{{flutter_service_worker_version}}
テンプレート適用方法
問題の概要
Flutter Webアプリの開発中に、index.html
内のサービスワーカー関連コードで以下の警告が発生:Local variable for "serviceWorkerVersion" is deprecated. Use "{{flutter_service_worker_version}}" template token instead
この警告は、古いプロジェクトを新しいFlutterバージョン(例:3.22以降)でビルドした際に発生します。非推奨になったserviceWorkerVersion
変数を、{{flutter_service_worker_version}}
テンプレートトークンで置き換える必要があります。
適切な解決方法
方法1: web
ディレクトリの再生成(推奨)
最も確実かつ最新の構成を得る方法:
# 手順
rm -rf web # 既存のwebディレクトリ削除
flutter create . --platforms=web # 新しいwebディレクトリを再生成
注意点:
- カスタマイズされた内容がある場合は事前にバックアップ
base_href
やマニフェスト設定は再設定が必要
方法2: index.html
の直接修正
web
ディレクトリの再作成が難しい場合の修正方法:
<!-- 修正前 -->
<script>
var serviceWorkerVersion = null; // 非推奨
</script>
<!-- 修正後 -->
<script>
var serviceWorkerVersion = '{{flutter_service_worker_version}}'; // テンプレートを使用
</script>
最新のindex.html構成例
Flutter 3.22+ の推奨構成:
<!DOCTYPE html>
<html>
<head>
<base href="$FLUTTER_BASE_HREF">
<meta charset="UTF-8">
<!-- メタデータやスタイル -->
<!-- サービスワーカー設定 -->
<script>
var serviceWorkerVersion = '{{flutter_service_worker_version}}';
</script>
</head>
<body>
<!-- アプリケーション本体 -->
<script src="flutter_bootstrap.js" async></script>
</body>
</html>
重要な補足情報
flutter_bootstrap.js
の役割
- フレームワークが生成するランタイムスクリプト
- サービスワーカーの登録と管理を自動化
- 手動で変更してはいけません
- ビルド時に自動生成され、
{{...}}
トークンはこの時点で解決
ベストプラクティス
- カスタム初期化が必要な場合は公式ドキュメントの初期化APIを使用
_flutter.loader.load()
メソッドで細かい制御が可能- ローディングインジケーターとの連携例:
_flutter.loader.load({
onEntrypointLoaded: async (engineInitializer) => {
const appRunner = await engineInitializer.initializeEngine();
await appRunner.runApp();
// ローディングインジケーターを非表示に
document.getElementById('loading').remove();
}
});
トラブルシューティング
flutter_bootstrap.js not found
エラー:bashflutter clean # キャッシュ削除 flutter pub get # 依存関係再取得
テンプレートトークンが解決されない:
flutter build web
で本番ビルドを実行- 開発モードではテンプレートが完全に解決されない場合あり
更新後も警告が出る場合:
bashflutter upgrade # Flutterの最新版に更新
根本原因と背景
この変更はFlutter 3.22での新しい初期化プロセスの導入が原因です:
古い流れ:
index.html → main.dart.js直接ロード
新しい流れ:
index.html → flutter_bootstrap.js → 最適化された初期化
flutter_bootstrap.js
がビルド時に自動生成され、サービスワーカーのバージョン管理やWASMのロードなど高度な最適化を担当します。