文中全部的代码均可以在 https://github.com/second-sta... 中找到
在以前的教程中,咱们讨论了如何从 Web 浏览器中的 JavaScript 应用程序访问 WebAssembly 函数。node
然而,或许你已经注意到,服务器端的 WebAssembly 有不少很好的用例,尤为是人工智能、区块链和大数据应用方向。git
在这个例子中,将展现如何将 Rust 中编写的 WebAssembly 函数集成到服务器上的 node.js 应用程序中。github
咱们以微服务的方式提供 WebAssembly 函数。web
演示应用程序的结构以下:浏览器
查看源代码和教程安全
与前面的教程同样,咱们使用 wasm-pack
工具编译 Rust 源代码并生成相应的 JavaScript 模块。这种模块使得在 JavaScript 和 Rust 函数之间传递复杂的动态数据变得很是容易。想要深刻了解的同窗,能够阅读《WebAssembly 中的字符串》。服务器
接下来,按照下面的步骤安装Rust和wasm-pack 工具。app
# 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 wasm-pack tools $ curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
在这个示例中,Rust 程序在“hello” 后面追加输入字符串。 curl
建立一个新的cargo
项目。函数
注意:因为这个程序是从主机应用程序调用的,而不是做为独立的可执行文件运行,所以咱们将建立一个 hello
项目。
··· $ cargo new --lib hello $ cd hello
编辑 Cargo.toml
文件添加 [lib]
部分. 它告诉编译器在哪能找到库的源代码,以及如何生成字节码输出。同时,咱们也须要在这添加 wasm-bindgen
的依赖项。这是使用 wasm-pack
的用途,生成绑定 JavaScript 的 rust webassembly程序
[lib] name = "hello_lib" path = "src/lib.rs" crate-type =["cdylib"] [dependencies] wasm-bindgen = "0.2.50"
下面是Rust 程序 src/lib.rs
的内容。实际上,咱们能够在这个库文件中定义多个外部函数,而且全部这些函数均可以经过 WebAssembly 在主机 JavaScript 应用程序中使用。
use wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn say(s: String) -> String { let r = String::from("hello "); return r + &s; }
接下来,您能够将 Rust 源代码编译成 WebAssembly 字节码,并为 node.js 主机环境生成相应的 JavaScript 模块。
$ wasm-pack build --target nodejs
结果是如下三个文件..wasm
文件是 WebAssembly 字节码程序;.js
文件用于 JavaScript 模块;
Pkg / hello lib bg. wasm Pkg / hello lib bg. js Pkg / hello lib.js
接下来,让咱们为 node.js web 应用程序建立一个节点文件夹,复制生成的 JavaScript 模块文件。
$mkdir node $cp pkg / hello lib bg. wasm node / $cp pkg / hello lib bg. js node / $cp pkg / hello lib.js node /
使用生成的 hello_lib.js
, 在 JavaScript 中调用 WebAssembly 函数是很是容易的。
下面是节点应用程序 app.js
。 它只是从生成的模块中导入 say ()
函数。 节点应用程序从传入的 httpget 请求中获取 name
参数,并用“ hello name
”进行响应。
const { say } = require('./hello_lib.js'); const http = require('http'); const url = require('url'); const hostname = '127.0.0.1'; const port = 8080; const server = http.createServer((req, res) => { const queryObject = url.parse(req.url,true).query; res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end(say(queryObject['name'])); }); server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });
按照如下方式启动 node.js 应用服务器。
$ node app.js Server running at http://127.0.0.1:8080/
而后,就能够测试了。
$ curl http://127.0.0.1:8080/?name=Wasm hello Wasm
如今 Web 服务能够将计算量大、不安全和新颖的硬件访问任务转移到 WebAssembly 中。 我相信,将有更多用例将会出现。 敬请期待!