在 Rust 中建立一个简单的 WebAssembly 应用程序,而后从 JavaScript 调用这个程序本文所涉及的全部代码能够在 https://github.com/second-sta... 中找到。html
系列教程:git
在本教程中,咱们将建立一个很是简单但很完整的 WebAssembly 应用程序。 github
Webassembly 应用程序一般由两部分组成。web
在本教程中,主机应用程序是用 JavaScript 编写的,并在 web 浏览器中运行。 Webassembly 字节码程序是用 Rust 编写的。 数据库
如今,先让咱们看看 Rust 程序是如何编写的。浏览器
在这个例子中,Rust 程序将输入数字简单地增长了三倍并返回结果。 首先将 WebAssembly 工具安装到 Rust 编译器。服务器
# Install Rust $ sudo apt-get update $ sudo apt-get -y upgrade $ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh $ source $HOME/.cargo/env
# Install WebAssembly tools $ rustup target add wasm32-wasi $ rustup override set nightly $ rustup target add wasm32-wasi --toolchain nightly
接下来,建立一个新的 cargo
项目。
因为这个程序是从主机应用程序调用的,而不是做为独立的可执行文件运行,所以咱们将建立一个 lib
项目。curl
$ cargo new --lib triple $ cd triple
编辑 Cargo.toml
文件以添加[lib]
节。 它会告诉编译器在哪里能够找到库的源代码,以及如何生成字节码输出。async
[lib] name = "triple_lib" path = "src/lib.rs" crate-type =["cdylib"]
下面是 Rust 程序 src/lib.rs
的内容. 实际上,你能够在这个库文件中定义多个外部函数,而且全部这些函数均可以经过 WebAssembly 在 JaveScript 主机上使用。ide
#[no_mangle] pub extern fn triple(x: i32) -> i32 { return 3 * x; }
接下来你能够用下面的命令行编译 Rust 的源代码到WebAssembly的字节码中。
$ cargo +nightly build --target wasm32-wasi --release
WebAssembly 字节码文件是 target/wasm32-wasi/release/triple_lib.wasm
咱们使用 JavaScript 加载 WebAssembly 字节码程序并调用它的函数。 因为大多数浏览器已经支持 WebAssembly, JavaScript 实际上能够做为一个网页运行。
无须赘述,下面是 JavaScript 模块的相关部分,用于加载、导出和调用 WebAssembly 函数。 完整的网页源文件在这里。
<script> if (!('WebAssembly' in window)) { alert('you need a browser with wasm support enabled :('); } (async () => { const response = await fetch('triple_lib.wasm'); const buffer = await response.arrayBuffer(); const module = await WebAssembly.compile(buffer); const instance = await WebAssembly.instantiate(module); const exports = instance.exports; const triple = exports.triple; var buttonOne = document.getElementById('buttonOne'); buttonOne.value = 'Triple the number'; buttonOne.addEventListener('click', function() { var input = $("#numberInput").val(); alert(input + ' tripled equals ' + triple(input)); }, false); })(); </script>
能够看到 JavaScript 代码加载了 WebAssembly 虚拟机的 triple_lib.wasm
文件, 导出其外部函数,而后根据须要调用这些函数。
将这个 HTML 文件和 triple_lib.wasm
文件放在web 服务器上,你就能够访问网页,在网页上输入的任何数字会自动乘以三。
如今你注意到了,这个例子并非一个 hello world。 WebAssembly函数计算数字,但不会像 hello world 那样操做字符串。
这是为何呢? 咱们将在下一个教程中回答这个问题,并给出一个真实的 hello world 示例。