blob: c81268b44a7276c5f234d41d6dd3ab16ef5d5857 [file] [view] [edit]
# Standalone mode
By default, dart2wasm generates WebAssembly modules meant to run on platforms
with JavaScript support (mainly, browsers).
Both the SDK and application code can rely on `dart:js_interop` libraries to
access external JavaScript APIs.
For WebAssembly targets without a JavaScript engine (like wasmtime or similar
runtimes), dart2wasm supports a standalone target too. This target is enabled
with the `--standalone` compiler flag, and makes `dart:js_interop` unavailable.
Even in standalone mode, the SDK needs host imports for functionality like
timers, stack traces, regular expressions, `dart:math` or number formatting.
These imports are referenced in [this file](https://github.com/dart-lang/sdk/blob/main/sdk/lib/_internal/wasm/standalone/embedder.dart).
Note that these imports are not stable, and might change in future Dart
versions.
Additional definitions can be imported via [imports and exports](./imports_and_exports.md).
## Running standalone modules
There are two plausible ways to run standalone modules:
1. By using APIs from a WebAssembly engine to define definitions for imports in
native code. There is no example for this in the SDK, but test definitions
for browser tests (`dart2WasmStandaloneHtml` in `pkg/test_runner/lib/src/browser.dart`)
might help as a starting point.
2. By re-implementing a subset of imports in WebAssembly, and then using tools
like `wasm-merge` from Binaryen to link two modules into a module with fewer
or no dependencies. Implementing Dart imports by delegating to WASI
definitions would allow running these modules without custom native imports,
for example.
Examples for both options are discussed in the [tracking issue](https://github.com/dart-lang/sdk/issues/53884).