关于 flutter-wasm-web
flutter-wasm-web 是一份关于使用 WebAssembly(Wasm-GC)构建和调试 Flutter Web 应用的技能指南,面向 Flutter 开发者。内容涵盖编译部署、JavaScript 互操作以及 Wasm 的限制与处理方法。
主要功能
- 01通过 Flutter CLI 编译 Wasm
- 02说明服务器 MIME 与隔离响应头
- 03介绍现代 JavaScript 互操作
- 04列出 Wasm 平台限制及处理方法
- 05指导使用 Chrome 调试 Wasm
适用场景
- 01将 Flutter Web 应用编译为 Wasm
- 02配置 Wasm 文件的托管响应头
- 03排查依赖 dart:io 的编译问题
- 04在 Chrome 中检查 Wasm 源码
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dhruvanbhalara/ skills --skill flutter-wasm-web安装后在 Claude Code 中输入/flutter-wasm-web确认已加载。
详细介绍
Flutter Web 与 WebAssembly(Wasm-GC)
Flutter Web 支持编译为 WebAssembly(Wasm-GC),带来接近原生的 UI 渲染性能、更流畅的动画和更快的加载速度。
目录
编译与部署
使用 Flutter CLI 将应用编译为 WebAssembly:
flutter build web --wasm
服务端配置
Wasm-GC 要求通过正确的 HTTP 标头提供特定文件。请确保 Web 主机(Firebase Hosting、Cloudflare、Vercel、Nginx)包含:
- 为生成的
.wasm文件设置Content-Type: application/wasm。 - COOP 和 COEP 标头(建议启用,以提升性能并确保多线程安全):
Cross-Origin-Opener-Policy: same-originCross-Origin-Embedder-Policy: require-corp
现代 JS 互操作(dart:js_interop 和 package:web)
Wasm-GC 编译严格禁止使用旧版 dart:html、dart:js 或 package:js 库。必须使用标准的 dart:js_interop 和 package:web 包。
JS 互操作核心原则
- 不要导入
dart:html。导入package:web/web.dart以访问 DOM。 - 使用
@JS()注解声明外部 JavaScript 函数。 - 始终使用 Dart JS 类型(例如
JSString、JSNumber、JSBool、JSAny、JSObject)。
示例:调用 JS API
import 'dart:js_interop';
import 'package:web/web.dart';
// Declare external JS API
@JS('console.log')
external void jsConsoleLog(JSAny message);
@JS('localStorage.setItem')
external void jsSetLocalStorage(JSString key, JSString value);
void main() {
// Convert Dart types to JS types
jsConsoleLog('Hello from Wasm-GC!'.toJS);
jsSetLocalStorage('app_mode'.toJS, 'dark'.toJS);
// Accessing the DOM via package:web
final windowEl = window;
jsConsoleLog(windowEl.location.href.toJS);
}
Wasm 特有限制与解决方案
1. 不支持 dart:io
- 影响:文件系统、Socket 和标准 HTTP 客户端无法编译。
- 解决方案:使用
package:http(会解析为浏览器原生 Fetch API),并使用 IndexedDB 或本地存储进行缓存。
2. Isolate/线程限制
- 影响:标准 Dart VM isolate 无法在 WebAssembly 中运行。在 Web 上调用
Isolate.spawn或compute()会引发运行时错误。 - 解决方案:如需进行繁重处理,可通过 JS 互操作使用 Web Worker 线程;或者将计算拆分成小块,在主线程上执行。
3. 字体和资源加载
- 影响:Wasm 编译使用 CanvasKit 渲染 Widget。必须在
pubspec.yaml中显式声明自定义字体,以防回退到其他字体进行渲染。
调试 WebAssembly
- Chrome 开发者工具:Chrome 支持调试 Wasm-GC 源映射。你可以直接在 Chrome 的 Sources 面板中检查 Dart 源代码。
- 检查兼容性:使用
flutter run -d chrome --wasm,在本地以 Wasm 模式运行和调试。
评论
支持 Markdown