- Use nightly with
rustup
$ rustup update nightly
$ rustup target add wasm32-unknown-unknown --toolchain nightly
- Add the target
wasm32-unknown-unknown
- Install
wasm-gc
$ cargo install --git https://github.com/alexcrichton/wasm-gc
$ wasm-gc .\add.wasm small-add.wasm
- Compile as a
cdylib
$ rustc +nightly --target wasm32-unknown-unknown -O .\lib.rs --crate-type=cdylib
Or using cargo
and Cargo.toml
[lib]
path = "src/lib.rs"
crate-type = ["cdylib"]
- Run
wasm-gc
to compress the code size
$ wasm-gc TARGET.wasm small-TARGET.wasm
Rust Code:
// add.rs
#![feature(lang_items)]
#![no_std]
#[no_mangle]
pub fn add_one(x: i32) -> i32 {
x + 1
}
// needed for no_std if no_std is requirement
#[lang = "panic_fmt"]
#[no_mangle]
pub extern fn rust_begin_panic(_msg: core::fmt::Arguments,
_file: &'static str,
_line: u32,
_column: u32)
-> !
{
loop {}
}
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>wasm wasm wasm</title>
<script>
fetch('small-add.wasm').then(response =>
response.arrayBuffer()
).then(bytes =>
WebAssembly.instantiate(bytes, {})
).then(results => {
alert(results.instance.exports.add_one(41));
});
</script>
</head>
</html>
Run:
$ python -m SimpleHTTPServer
Open browser to http://localhost:8000/