Basic setup
✅ Create a new Rust project.
cargo new --lib image-filter
cd image-filter
✅ Set the crate type to cdylib in Cargo.toml
[lib]
crate-type = ["cdylib"]
✅ To simplify the build later on you can use make to build the Rust crate and call wasm-bindgen to generate the JavaScript shim. Create a Makefile and add this:
.PHONY: build
build:
cargo build --release --target=wasm32-unknown-unknown
wasm-bindgen target/wasm32-unknown-unknown/release/image_filter.wasm \
--out-dir app \
--target web \
--no-typescript
You can also use a shell script to do the same or simply run these commands manually.
✅ Add wasm-bindgen and rustagram2 dependencies to Cargo.toml:
`
[dependencies]
rustagram2 = "2"
wasm-bindgen = "0.2.83"
✅ To help with debugging and logging add these 3 dependencies to Cargo.toml
[dependencies]
console_error_panic_hook = "0.1.7"
console_log = "0.2.0"
log = "0.4.17"
console_error_panic_hook ensures that you get Rust's panic message & stack trace in your browser's console.
console_log ensures you can use Rust's log crate for logging as you are used to.
✅ It's time to set up the above mentioned crates in the module's start function.
Annotate your main function with wasm_bindgen(start).
use std::panic;
use wasm_bindgen::prelude::*;
#[wasm_bindgen(start)]
pub fn main() {
panic::set_hook(Box::new(console_error_panic_hook::hook));
console_log::init_with_level(log::Level::Debug).unwrap();
}
Note: The name of this function actually doesn't matter.
The annotation is what tells wasm-bindgen that this becomes the setup function.
✅ You should now be able to compile the Rust code to WebAssembly and use wasm-bindgen to generate the JavaScript shim.
If you are using the Makefile as above you can now run
make
Otherwise run the commands directly:
cargo build --release --target=wasm32-unknown-unknown
wasm-bindgen target/wasm32-unknown-unknown/release/image_filter.wasm --out-dir app --target web --no-typescript
You should find 2 new files in the app directory:
image_filter.js and image_filter_bg.wasm.
In the next chapter you will write the few Rust pieces necessary for the image filter application. After that you build the web frontend to load and run the WebAssembly module.