Hello, World!

View full source code or view the compiled example online

This is the "Hello, world!" example of #[wasm_bindgen] showing how to set up a project, export a function to JS, call it from JS, and then call the alert function in Rust.

Cargo.toml

The Cargo.toml lists the wasm-bindgen crate as a dependency.

Also of note is the crate-type = ["cdylib"] which is largely used for wasm final artifacts today.

[package] name = "hello_world" version = "0.1.0" authors = ["The wasm-bindgen Developers"] edition = "2018" [lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen = "0.2.83"

src/lib.rs

Here we define our Rust entry point along with calling the alert function.

use wasm_bindgen::prelude::*; #[wasm_bindgen] extern "C" { fn alert(s: &str); } #[wasm_bindgen] pub fn greet(name: &str) { alert(&format!("Hello, {}!", name)); }

index.js

Our JS entry point is quite small!

// Note that a dynamic `import` statement here is required due to // webpack/webpack#6615, but in theory `import { greet } from './pkg';` // will work here one day as well! const rust = import('./pkg'); rust .then(m => m.greet('World!')) .catch(console.error);

Webpack-specific files

Note: Webpack is required for this example, and if you're interested in options that don't use a JS bundler see other examples.

And finally here's the Webpack configuration and package.json for this project:

webpack.config.js

const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin"); module.exports = { entry: './index.js', output: { path: path.resolve(__dirname, 'dist'), filename: 'index.js', }, plugins: [ new HtmlWebpackPlugin(), new WasmPackPlugin({ crateDirectory: path.resolve(__dirname, ".") }), // Have this example work in Edge which doesn't ship `TextEncoder` or // `TextDecoder` at this time. new webpack.ProvidePlugin({ TextDecoder: ['text-encoding', 'TextDecoder'], TextEncoder: ['text-encoding', 'TextEncoder'] }) ], mode: 'development', experiments: { asyncWebAssembly: true } };

package.json

{ "scripts": { "build": "webpack", "serve" : "webpack serve" }, "devDependencies": { "@wasm-tool/wasm-pack-plugin": "1.5.0", "text-encoding": "^0.7.0", "html-webpack-plugin": "^5.3.2", "webpack": "^5.49.0", "webpack-cli": "^4.7.2", "webpack-dev-server": "^3.11.2" } }