wasmer-js

Wasmer is the most popular
WebAssembly runtime for Rust (...and also
the fastest). This runtime is an adapted version of the Wasmer API that compiles to
WebAssembly via wasm-bindgen.
wasmer-js uses the same WebAssembly runtime of your environment (browser or Node.js).
Usage
use wasmer_js::{Store, Module, Instance, Value, imports};
fn main() -> anyhow::Result<()> {
let module_wat = r#"
(module
(type $t0 (func (param i32) (result i32)))
(func $add_one (export "add_one") (type $t0) (param $p0 i32) (result i32)
get_local $p0
i32.const 1
i32.add))
"#;
let store = Store::default();
let module = Module::new(&store, &module_wat)?;
// The module doesn't import anything, so we create an empty import object.
let import_object = imports! {};
let instance = Instance::new(&module, &import_object)?;
let add_one = instance.exports.get_function("add_one")?;
let result = add_one.call(&[Value::I32(42)])?;
assert_eq!(result[0], Value::I32(43));
Ok(())
}
Config flags
Wasmer has the following configuration flags:
-
wasm-types-polyfill(enabled by default): it parses the Wasm file to introspect the inner types. It adds 100Kb to the Wasm bundle (28Kb gzipped). You can disable it and useModule::set_type_hintsmanually instead if you want a lightweight alternative. This is needed until the Wasm JS introspection API proposal is adopted by browsers -
wat: It allows to read WebAssembly files in their text format. This feature is normally used only in development environments, it will add around 650Kb to the Wasm bundle (120Kb gzipped).
Build
You can use wasm-pack to build wasmer-js:
wasm-pack build --release
The provided
wasmer_js.wasmfile should weight around 60kB (27Kb gzipped) when optmized viawasm-optand stripped viawasm-strip, so it's quite slim.
Test
wasm-pack test --node
Made with ❤️ by the Wasmer team, for the community