Compilação WebAssembly (Wasm)
Aprenda a compilar sua aplicação web Dart para WebAssembly.
Você pode compilar aplicações web do Dart e do Flutter para
WebAssembly (dart2wasm) como alternativa ao JavaScript
em builds de produção.
Suporte a WebAssembly
#Ao compilar Dart para WebAssembly, tenha em mente os seguintes requisitos e comportamentos da plataforma:
-
O
dart2wasmtem como alvo três propostas padronizadas de WebAssembly: WasmGC (coleta de lixo), JS String Builtins (wasm:js-string) e Exception Handling da Fase 4 (try_tableeexnref). Para executar os módulos compilados em um navegador, é necessário pelo menos:- Chrome ou Edge 137+
- Safari 26.2+ (macOS e iOS)
- Firefox 134+ (ou 147+ para Flutter web)
Para mais detalhes de compatibilidade entre navegadores, veja a documentação do Flutter Wasm.
-
Por padrão, a saída Wasm compilada tem como alvo ambientes JavaScript (como navegadores) e gera um arquivo de runtime complementar
<name>.mjs. Para compilar um módulo WebAssembly independente para runtimes que não são web, como o Wasmtime 39+ (usando-W gc,exceptions,function-references=y), passe--standalonepara odart compile wasm. Quando--standaloneestá definido, odart:js_interopnão é permitido. -
Apenas o mecanismo de interoperabilidade JS de próxima geração do Dart é suportado ao compilar para Wasm.
-
A ferramenta
webdevnão oferece suporte atualmente à compilação Wasm (webdev serveouwebdev build). Em vez disso, siga os passos em Compilando sua aplicação web para Wasm.
Deferred loading
#
Por padrão, as aplicações compiladas não usam deferred loading.
O deferred loading em Wasm é experimental.
Para habilitá-lo, passe a flag --enable-deferred-loading:
dart compile wasm --enable-deferred-loading ...
Para habilitar o deferred loading, o carregador da sua aplicação precisa fornecer um callback que carregue os bytes dos módulos deferidos:
import { compileStreaming } from './main.mjs';
const app = await compileStreaming(fetch('main.wasm')); // or compile(...)
const instantiatedApp = await app.instantiate({}, {
loadDeferredModules: (modules, handleModuleByteSource) => {
return Promise.all(
modules.map((m) => fetch(m).then((r) => handleModuleByteSource(m, r)))
);
},
});
instantiatedApp.invokeMain();
Imports condicionais e suporte a SIMD
#-
Imports condicionais (
dart.library.isolate): Ao compilar comdart2wasm,dart.library.isolateé avaliado comofalsenos imports condicionais (if (dart.library.isolate)), igual ao comportamento dodart2jse doddc. -
SIMD de 128 bits em Wasm (
v128): Nodart2wasm, os tipos SIMD dedart:typed_data(Int32x4,Float32x4,Float64x2,Int32x4List,Float32x4ListeFloat64x2List) são implementados com as instruções SIMD nativas de 128 bitsv128do WebAssembly.
Pacotes suportados
#
Para encontrar pacotes compatíveis com Wasm,
use o filtro wasm-ready
no pub.dev.
Um pacote é "wasm-ready" se não importa bibliotecas não compatíveis com Wasm,
como dart:html ou dart:js. Você encontra a lista completa de bibliotecas
não permitidas na página de interoperabilidade JS.
Compilando sua aplicação web para Wasm
#
Use o comando dart compile wasm na CLI dart para invocar o
compilador Wasm do Dart e do Flutter:
dart help compile wasm -v
Compile Dart to a WebAssembly/WasmGC module.
Usage: dart compile wasm [arguments] <dart entry point>
-h, --help Print this usage information.
-o, --output Write the output to <file name>.
This can be an absolute or relative path.
-v, --verbose Print debug output during compilation
--enable-asserts Enable assert statements.
-O, --optimization-level=<level> Controls optimizations that can help reduce
code-size and improve performance of the
generated code.
[0, 1 (default), 2, 3, 4]
--[no-]minify Minify names that are needed at runtime (such
as class names). Affects e.g.
`<obj>.runtimeType.toString()`). If passed,
this takes precedence over the
optimization-level option.
--[no-]strip-wasm Whether to strip the resulting wasm file of
static symbol names.
(defaults to on)
--[no-]source-maps Generate a source map file.
(defaults to on)
--[no-]enable-deferred-loading Emit multiple modules based on the Dart
program's deferred import graph.
--standalone Compile to a WebAssembly module without
JavaScript interop. Dart-specific host
imports are necessary to load these modules.
-D, --define=<key=value> Define an environment declaration. To specify
multiple declarations, use multiple options
or use commas to separate key-value pairs.
For example: dart compile wasm -Da=1,b=2
main.dart
Para compilar e executar uma aplicação web Dart com Wasm, siga estes passos:
-
Crie uma aplicação web e entre no diretório dela:
dart create -t web mywebapp cd mywebappO template cria uma pequena aplicação web usando o
package:web, que é necessário para executar Wasm. Certifique-se de que suas aplicações web foram migradas dedart:htmlparapackage:web. -
Compile a aplicação para Wasm em um diretório de saída
site:dart compile wasm -O2 web/main.dart -o site/main.wasmIsso gera
site/main.wasm, o runtime JavaScript complementarsite/main.mjsesite/main.wasm.map. -
Copie os arquivos web estáticos:
cp web/index.html web/styles.css site/ -
Como o
index.htmlcarrega omain.dart.js, crie osite/main.dart.jspara importar o runtimesite/main.mjsgerado e instanciar osite/main.wasm:site/main.dart.jsjs(async function () { const { compileStreaming } = await import('./main.mjs'); const app = await compileStreaming(fetch('main.wasm')); const instantiatedApp = await app.instantiate({}); instantiatedApp.invokeMain(); })(); -
Sirva o diretório
siteusando odhttpd:dart run dhttpd@ --path site
Você também pode testar este pequeno exemplo de sandbox.
Salvo indicação em contrário, a documentação neste site reflete Dart 3.13.7. Página atualizada pela última vez em 2026-11-12. Ver código-fonte ou relatar um problema.
Encontrou essa página sem tradução ou que precisa de correção? Abra uma issue e nos ajude a manter esse site em PT-BR para ajudar pessoas como você.