Flutter Webとは?CanvasKitとWasmの描画差・SEO制約・採用条件【2026年8月時点】
Flutter WebはFlutterのコードをブラウザで動かすための出力先です。ただしiOSやAndroid向けのビルドと同じ感覚で使うと、初期表示の重さと検索エンジンからの見え方で必ずつまずきます。原因は機能不足ではなく、画面をブラウザにどう描いているかという土台の違いです。この記事では2026年8月時点の一次情報と実測値だけを並べ、Flutter Webがどんな画面に向き、どこで見送るべきかを切り分けます。
まとめ:Flutter Webは画面種別を絞れば実務で使える
先に示す結論は次の通りです。Flutter Webは、ログイン後の業務画面やダッシュボードのような「検索から直接入ってこない画面」であれば、2026年8月時点で実務投入できる状態にあります。同じコードでモバイルとWebの両方を出せる利点は、社内向けの管理画面や既存アプリのブラウザ版で確実に効きます。
一方で、公開ページの集客を担う画面には向きません。これは調整で埋められる差ではなく、公式ドキュメント自身が「テキスト中心の静的サイトは対象外」と書いている設計上の線引きです。描かれた結果がHTMLの文章構造として残らないため、検索エンジンが読む形になりません。
初期ダウンロード量も判断を分けます。公式デモを実測すると、既定のCanvasKit経路では圧縮転送で約4.2MB、WebAssembly経路でも約2.9MBを最初に取りに行きます。社内ネットワークや業務端末なら許容できても、モバイル回線から初回訪問する不特定多数向けの入口には重すぎる水準です。以下、それぞれの根拠を順に確認します。
Flutter Webの仕組みはコードの変換先と描画先で決まる
Flutter Webを理解するとき、押さえる層は二つだけです。Dartで書いたコードが何に変換されるかという「変換先」と、変換された結果が画面をどう描くかという「描画先」。この二層を分けて見ると、後述する制約のほとんどが説明できます。
ブラウザではDOMではなくcanvasに描画される画面構造の違い
一般的なWebフレームワークは、見出しや段落をHTML要素として組み立て、ブラウザがそれを解釈して画面を作ります。Flutter Webはこの流れを取りません。ウィジェットツリーの描画命令をFlutter自身のエンジンが処理し、結果を画面上のcanvasへ直接描き出します。ボタンに見えているものはbutton要素ではなく、canvasに描かれた図形とテキストです。
この方式の利点は、モバイル版と表示が一致することにあります。ブラウザごとのCSS解釈の差に振り回されず、アニメーションや細かい描画も同じ結果になります。Flutterがモバイルで得ている表示の一貫性を、そのままブラウザへ持ち込む設計です。
代償として、Webの標準的な仕組みから外れた部分が生じます。検索エンジンのクローラや一部の支援技術が読むのはHTMLの構造であり、canvasに描かれた絵の中身ではありません。ここが後段のSEO制約の出発点になります。
canvaskitとskwasmという二つのレンダラーの選ばれ方
描画を担う実装は2026年8月時点でcanvaskitとskwasmの2種類です。canvaskitはグラフィックスライブラリSkiaをWebAssembly化したもので、JavaScriptから呼び出して描画します。skwasmはDartコード自体をWebAssemblyへ変換する構成に対応した新しい描画実装で、JavaScriptを経由しない分だけ処理経路が短くなります。
選択は開発者が指定するのではなく、ビルド方法と実行環境で自動的に決まります。flutter build web で作った既定のビルドが実行時に選ぶのはcanvaskitです。--wasm を付けたビルドは実行時にskwasmを選び、ブラウザがWebAssemblyのガベージコレクション拡張(WasmGC)に対応していなければcanvaskitへ落ちます。
flutter build web
flutter build web --wasm
flutter run -d chrome --wasm
ここで見落とされがちなのは、--wasm を付けてもJavaScript版の出力が消えない点です。公式ドキュメントは、WasmGCが実行時に検出されなければJavaScript出力が使われると明記しています。つまりWasmビルドは「Wasmで動く環境だけを対象にする」という選択ではなく、両方を配って実行時に振り分ける構成になります。
HTMLレンダラー廃止後のバージョンで固定されたレンダラー選択条件
日本語の解説記事で今でも見かける「HTMLレンダラーを選べばSEOに有利」という説明は、現在のFlutterには当てはまりません。DOMベースのHTMLレンダラーは廃止済みで、レンダラーを切り替えるオプション自体がFlutterのツールから取り除かれました。撤去は3.29系のリリースノートに変更履歴として残っています。
この経緯を知らずに古い記事どおり進めると、存在しないオプションを前提に見積もりを立てることになります。検証記事を読むときは、レンダラー選択の話が出てきた時点で対象バージョンを確認してください。版ごとの差分そのものはFlutter 3.44とは?SPM既定化とHCPPで変わる移行判断で整理しています。
公式デモの実測値でCanvasKit経路とWasm経路の初期ダウンロード量を比べる
初期表示の重さは、体感ではなく配信物のバイト数で確かめられます。Flutter公式がWebAssembly版の確認用に案内しているデモアプリ(Wonderous)に対し、2026年8月18日時点で各ファイルのHTTP転送量を実測しました。圧縮転送は圧縮を受け付けるリクエストでの転送量、実体は圧縮を受け付けない場合のサイズです。
| 配信物 | 圧縮転送 | 実体 |
|---|---|---|
| main.dart.js | 約1.33MB | 約4.50MB |
| canvaskit.wasm | 約2.84MB | 約7.16MB |
| canvaskit.wasm(Chromium版) | 約2.11MB | 約5.69MB |
| main.dart.wasm | 約1.33MB | 約3.85MB |
| skwasm.wasm | 約1.52MB | 約3.55MB |
| skwasm_heavy.wasm | 約2.25MB | 約5.14MB |
読み方を補足します。CanvasKit経路ではアプリ本体のJavaScriptに加えて描画エンジン本体を取りに行くため、合計は圧縮転送で約4.2MB、Chromium向けの軽い版が使われる場合で約3.5MBになります。Wasm経路はアプリ本体と描画実装の双方が小さく、合計で約2.9MB、大きいほうのバイナリが使われても約3.6MBに収まりました。
圧縮転送でも約3MBを要する初期表示データ量の経路別実測下限
この数値が意味するのは、実装をどれだけ整理してもアプリ固有のコード量とは別に数MBの土台が先に必要になるということです。画像を減らしても文字を削っても、描画エンジンの取得は省けません。遅延読み込みで分割できるのはアプリ側のコードであり、しかもWasmビルドでの遅延読み込みは既定で無効です。有効化するフラグは現時点でmainブランチの実験的機能で、公式ドキュメントは3.50安定版での一般提供を予定と記しています。
実務では、この土台をどこに置くかで判断が変わります。社内利用の管理画面なら初回だけキャッシュに載せれば済み、二回目以降の体感は軽くなる設計です。対して、広告から流入してすぐ離脱される可能性のある画面では、最初の数MBが直接損失になります。同じ技術でも設置場所で評価が反転する典型例です。
WasmGCの対応状況とブラウザ側の不具合による現在の動作制限
Wasm経路のほうが軽いなら常にそちらを選べばよい、とはなりません。実際にskwasmで動く環境は2026年8月時点でかなり限られます。
ChromiumだけでWasmGCが動く2026年8月時点の対応状況
公式ドキュメントの記述は明快です。ChromiumとV8はバージョン119以降でWasmGCに対応しています。Firefoxは120で安定サポートを表明したものの、FlutterのWasmレンダラーとの互換性を妨げる不具合が報告されており、現時点では動作しません。SafariもWasmGC自体には対応済みですが、同種の不具合で止まっています。
| 環境 | WasmGCでの動作 |
|---|---|
| Chrome・Edge(119以降) | 動作する |
| Firefox(120以降) | 不具合により不可 |
| Safari | 不具合により不可 |
| iOS上の全ブラウザ | 不可(WebKit固定) |
iOSは事情が別です。iOS上のブラウザはChromeを含めて描画エンジンにWebKitを使う決まりで、そのWebKitがWasmGCに未対応のため、ブラウザの銘柄を変えても結果は変わりません。iPhoneからの利用が主体のサービスでは、Wasmビルドを指定しても実際にはJavaScript経路で動き続けると考えてください。
したがって現実的な設計は、Wasm経路を前提にするのではなく、JavaScript経路でも成立する要件に落とすことです。Flutter 3.47の告知ではWebAssemblyの既定化に向けて作業中と述べられており、ブラウザ側の不具合が解消されれば状況は変わります。今の見積もりに未来の改善を織り込まない、という姿勢が要ります。
複数スレッド描画に必要なCOOPとCOEPの配信ヘッダー設定条件
Wasm経路でカクつきを抑える複数スレッド描画には、配信サーバー側の設定が前提になります。公式ドキュメントは、指定のHTTPレスポンスヘッダを返さないと複数スレッドでは動かないと明記しています。
| ヘッダ名 | 設定値 |
|---|---|
| COOPヘッダー | same-origin |
| COEPヘッダー | credentialless/CORP要件 |
COOPはCross-Origin-Opener-Policy、COEPはCross-Origin-Embedder-Policyを指し、COEPにはcredentiallessかrequire-corpを設定します。
この条件は配信先の選定に直結します。ヘッダを自由に足せないホスティングでは複数スレッド描画が使えません。さらにこれらのヘッダは他サイトの埋め込みリソースにも制約をかけるため、外部の解析タグや決済ウィジェットを同一ページに載せている場合、そちらが動かなくなる可能性があります。着手前に、配信基盤と外部連携の一覧を突き合わせておく作業が必要です。
公式情報から判断するFlutter WebのSEOと初期表示の適用制約
Flutter WebのSEOは、工夫で改善できる範囲と、そもそも設計が想定していない範囲を分けて考えます。公式のWeb向けFAQは後者について踏み込んだ説明です。向く用途としてプログレッシブWebアプリ、単一ページアプリ、既存Flutterアプリのブラウザ展開を挙げる一方、向かない用途としてテキスト中心の静的サイトを明示し、出力が検索エンジンの必要とする形と一致しないと述べています。
推奨される回避策も同じFAQに書かれています。ひとつはDart製でDOMベースのサイトを構築できるJasprを使う方法、もうひとつは集客を担う画面をHTMLで作り、そこにFlutterの部分を埋め込む方法です。どちらも「Flutter Webのまま検索対応する」のではなく、担当範囲を分ける発想に立っています。
検索流入を取る画面はFlutter側に置かないという切り分け
実務での切り分けは単純です。検索結果からの流入を期待する画面、つまりサービス紹介・料金・導入事例・記事の類は、通常のHTMLとして配信します。ログイン後の操作画面、集計ダッシュボード、入力フォームの多い業務機能はFlutter Webに載せます。両者を同一ドメインの別パスに置き、リンクでつなぐ構成です。
この構成なら、集客側は既存のWeb実装のまま検索に対応でき、アプリ側はモバイルとコードを共有できます。逆に、集客ページまで含めて一枚のFlutterアプリにすると、公開後に検索経由の流入が伸びない理由の切り分けに時間を取られます。設計時点で決めておくべき分岐です。
なお、アクセシビリティの支援技術についても同じ構造の注意が要ります。Flutterは支援技術向けの情報を別途出力する仕組みを持ちますが、DOM上の見出し階層をそのまま辿る前提の運用とは挙動が異なります。公共調達などで対応水準が要件化されている場合は、実機の読み上げで確認する工程を見積もりに含めてください。
実装で先に効く制約はJS相互運用とdart:ioの不在にある
既存のFlutterアプリにWeb対応を足す場合、作業量の大半はUIではなく依存パッケージの側に出ます。着手前に確認しておくと見積もりの精度が上がる項目を挙げます。
dart:htmlのままではWasmビルドが通らないという移行作業
WebAssembly対応のビルドでは、従来のWeb向けAPIがそのままでは使えません。dart:html、package:js、dart:js はコンパイルが通らず、それぞれ package:web と dart:js_interop への移行が要ります。自社コードだけでなく、依存パッケージの内部で参照されている場合も同じです。
確認は先回りできます。--wasm を付けない通常のビルドを実行すると、Wasm互換性の事前診断が警告として出力される仕組みです。失敗したときはスタックトレースではなく、上部に出る依存関係のツリーを読むと、どのパッケージ経由で非対応ライブラリが引き込まれているかが分かります。移行の可否は、この依存元が自社管理か外部パッケージかで難易度が変わります。手元にビルドを試せる環境がまだ無い場合は、Flutterの環境構築|Windows・macOS別のSDK導入とflutter doctor診断から先に整えてください。
ファイル操作とIsolateが使えないブラウザ環境で必要な設計変更
ブラウザという実行環境そのものに由来する制約もあります。dart:io は使えず、ファイルシステムへ直接触る処理は成り立ちません。Platform.is 系の判定は例外を投げます。並行処理のIsolateも非対応で、重い処理はWeb Workerを使う形へ置き換えます。
モバイル向けに書いたコードをそのまま持ち込むと、これらは実行時ではなくビルド時や初回動作時にまとめて表面化します。プラットフォーム依存の処理を条件付きインポートで分離しておく設計が前提です。分離の作法はFlutterにおけるアーキテクチャ設計の基本と重要性で扱っている層分けの考え方がそのまま使えます。
開発体験の側は改善しています。Web上のホットリロードは3.35から既定で有効になり、モバイル開発と同じ速度で画面を確認できます。制約が残るのは実行環境に起因する部分であって、日々の開発効率ではありません。
業務系Webでの採用を決める三条件と見送るべき二つの利用場面
ここまでの事実をもとに、判断を言い切ります。曖昧なまま「用途による」で終わらせると、公開後に作り直しが発生します。
配布先と画面種別と保守体制の三点で判断する実務上の具体的な採用条件
採用してよいのは次の三条件がそろう場合です。第一に、対象がログイン後の画面であり、検索流入を担当しないこと。第二に、同じ機能をモバイルアプリでも提供する予定があるか、既にFlutterで作られていること。第三に、SDKの更新に追随する保守体制があること。三つ目は軽視されがちですが、ブラウザ側の対応状況が動く領域である以上、放置すると数年で更新が滞ります。
見送るべき場面は二つです。ひとつは、検索とSNSからの流入で成り立つ公開サイト。もうひとつは、モバイル回線からの初回訪問が中心で、離脱率が売上に直結する画面です。どちらも初期ダウンロード量と検索対応の制約が直撃するため、Flutterの生産性では取り返せません。この二つに当たるなら、Web側は通常のフロントエンド実装で作り、Flutterはモバイルに専念させる分担が結果的に安く済みます。
フレームワークそのものを継続採用してよいかという上位の判断は、案件数やリリース間隔などの別指標で見ます。その観点はFlutterの将来性を数値で判断するで整理しており、他フレームワークとの機能比較はFlutterとReact Nativeの違いと選び方にまとめています。
外注時に見積書と合わせて確認する配信・検索・対応環境の四項目
受託で開発を依頼するときは、次の四点を提案段階で明文化しておくと後の食い違いが減ります。ひとつ、Web出力を既定ビルドとWasmビルドのどちらで配信するか。ふたつ、複数スレッド描画に必要なヘッダを配信基盤で設定できるか。みっつ、検索対応が要る画面をFlutterの外に置く前提になっているか。よっつ、対応ブラウザの下限と、iOS上での挙動を検証環境に含めているか。
この四点は仕様書に書かれないまま進みやすく、公開直前に判明すると配信基盤の変更や画面構成の作り直しにつながります。一創ではFlutter / React Nativeによるクロスプラットフォーム開発として、モバイルとWebのどこまでをコード共有するかの線引きから設計する方針です。既存アプリのWeb展開可否を判断したい段階でも相談を受け付けています。
よくある質問
Flutter WebはSEOに対応できますか?
検索流入を主目的とする画面には向きません。公式のFAQが、出力は検索エンジンが必要とする形と一致しないと明記しています。メタタグやサイトマップの調整で改善するのは検索結果の見出し部分にとどまり、本文が読み取られない構造そのものは変わりません。集客ページはHTMLで作り、Flutterの画面をその内側や別パスに置く分担が現実的な解になります。
CanvasKitとskwasmはどちらを選べばよいですか?
2026年8月時点では選択の余地が実質ありません。既定ビルドはcanvaskit、--wasm 付きビルドはskwasmが実行時に選ばれる仕組みで、開発者がレンダラー名で指定する方法はなくなっています。加えてskwasmが実際に動くのはChromium系のみで、FirefoxとSafariは不具合で止まっているため、どちらのビルドでも大半の環境はcanvaskitで動きます。
初期表示を軽くする方法はありますか?
アプリ側のコード分割とキャッシュ設定で改善できますが、描画エンジンの取得分は残ります。公式デモの実測では圧縮転送で約2.9MBから4.2MBが初期に必要でした。効果が大きいのは、資産へ長めのキャッシュ設定を入れて再訪問時の転送を減らすことと、初回に読み込む画面を絞ることです。土台の数MBを前提に置ける画面かどうかを先に判断してください。
既存のFlutterアプリをそのままWeb化できますか?
UIの大部分は動きますが、依存パッケージの側では作業が必要です。dart:io やプラットフォーム判定、Isolateを使っている箇所は書き換えが要り、Wasmビルドを狙う場合は dart:html 系から package:web への移行も加わります。通常のWebビルドを一度流せば非対応の依存が警告として出るため、見積もり前にその出力を取っておくと精度が上がります。
業務システムの管理画面をFlutter Webで作るのは妥当ですか?
妥当な選択肢です。ログイン後の画面で検索対応が不要、利用端末と回線が想定できる、モバイルアプリともコードを共有したい、という条件がそろえば利点が制約を上回ります。逆に、社外の不特定多数が初回訪問する画面や、他システムの画面を同一ページへ埋め込む要件がある場合は、ヘッダ設定の制約もあるため通常のWeb実装を検討してください。