文中全部的代碼均可以在 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 中。 我相信,將有更多用例將會出現。 敬請期待!