Web 渲染器
Flutter Web 提供两种 构建模式 和两种 渲染器 。 两种构建模式分别是 默认模式 和WebAssembly 模式,两种渲染器分别是canvaskit 和 skwasm。
Flutter 在构建应用时选择构建模式,并在运行时确定可用的渲染器。
对于默认构建,Flutter 在运行时选择 canvaskit
渲染器。 对于 WebAssembly 构建,Flutter 在运行时选择 skwasm
渲染器,如果浏览器不支持 skwasm
,则回退到 canvaskit
。
构建模式
#默认构建模式
#当使用 flutter run
或 flutter build web
命令不带 --wasm
参数,或者带 --no-wasm
参数时,Flutter 会选择默认模式。
此构建模式仅使用 canvaskit
渲染器。
要在 Chrome 中使用默认构建模式运行:
flutter run -d chrome
要使用默认构建模式构建应用以供发布:
flutter build web
WebAssembly 构建模式
#此模式通过向 flutter run
和 flutter build web
命令传递 --wasm
参数来启用。
此模式使 skwasm
和 canvaskit
都可用。skwasm
需要 WasmGC,而并非所有现代浏览器都支持它。 因此,在运行时,如果支持垃圾回收,Flutter 会选择 skwasm
;如果不支持,则回退到 canvaskit
。这允许在 WebAssembly 模式下编译的应用仍然可以在所有现代浏览器中运行。
--wasm
标志不受非 Web 平台支持。
要在 Chrome 中使用 WebAssembly 模式运行:
flutter run -d chrome --wasm
要使用 WebAssembly 模式构建应用以供发布:
flutter build web --wasm
渲染器
#Flutter 具有两个渲染器(canvaskit
和 skwasm
),它们重新实现了 Flutter 引擎以在浏览器中运行。渲染器将 UI 原语(存储为 Scene
对象)转换为像素。
canvaskit
#canvaskit
渲染器与所有现代浏览器兼容,并且是在 默认 构建模式中使用的渲染器。
它包含一个编译到 WebAssembly 的 Skia 副本,这增加了大约 1.5MB 的下载大小。
skwasm
#skwasm
渲染器是 Skia 的更紧凑版本,它编译到 WebAssembly 并支持在单独的线程上渲染。
此渲染器必须与_WebAssembly_构建模式一起使用,该模式将 Dart 代码编译到 WebAssembly。
要利用多线程,Web 服务器必须满足SharedArrayBuffer 安全要求。 在此模式下,Flutter 使用专用的Web Worker 将部分渲染工作负载卸载到单独的线程,从而利用多个 CPU 内核。如果浏览器不满足这些要求,则 skwasm
渲染器将在单线程配置中运行。
此渲染器包含一个更紧凑的 Skia 版本,该版本编译到 WebAssembly,增加了大约 1.1MB 的下载大小。
运行时选择渲染器
#默认情况下,在 WebAssembly 模式下构建时,Flutter 将决定何时使用 skwasm
,何时回退到 canvaskit
。这可以通过向加载器传递配置对象来覆盖,如下所示:
- 使用
--wasm
标志构建应用程序,使应用程序可以使用skwasm
和canvaskit
渲染器。 - 如编写自定义
flutter_bootstrap.js
中所述,设置自定义 Web 应用初始化。 - 使用设置为
"canvaskit"
或"skwasm"
的renderer
属性准备一个配置对象。 - 将准备好的 config 对象作为新对象的
config
属性传递给前面注入的代码提供的_flutter.loader.load
方法。
示例:
<body>
<script>
{{flutter_js}}
{{flutter_build_config}}
// TODO: 用您自己的代码替换此代码以确定要使用的渲染器。
const useCanvasKit = true;
const config = {
renderer: useCanvasKit ? "canvaskit" : "skwasm",
};
_flutter.loader.load({
config: config,
});
</script>
</body>
调用 load
方法后无法更改 Web 渲染器。因此,必须在调用 _flutter.loader.load
之前做出有关使用哪个渲染器的任何决定。
选择要使用的构建模式
#要将 Dart 编译为 WebAssembly,您的应用程序及其插件/包必须满足以下要求:
- 使用新的 JS 交互操作 - 代码必须仅使用新的 JS 交互操作库
dart:js_interop
。旧式的dart:js
、dart:js_util
和package:js
已不再支持。 - 使用新的 Web API - 使用 Web API 的代码必须使用新的
package:web
而不是dart:html
。 - 数字兼容性 - WebAssembly 完全按照 Dart VM 的方式实现 Dart 的数值类型
int
和double
。在 JavaScript 中,这些类型使用 JSNumber
类型进行模拟。您的代码可能会意外地或故意地依赖于 JS 的数字行为。如果是这样,则需要更新此类代码以使其与 Dart VM 行为正确。
使用以下提示来决定使用哪种模式:
- 包支持 - 如果您的应用依赖于尚不支持 WebAssembly 的插件和包,请选择默认模式。
- 性能 - 如果您的应用代码和包与 WebAssembly 兼容且应用性能很重要,请选择 WebAssembly 模式。与
canvaskit
相比,skwasm
的应用程序启动时间和帧性能明显更好。skwasm
在多线程模式下特别有效,因此请考虑配置服务器以满足SharedArrayBuffer 安全要求。
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。