js怎么调用wasm_从 node.js Web 应用中调用 WebAssembly 函数 | WebAssembly 入门教程

本教程展示了如何在 Node.js 服务器应用中集成 Rust 编写的 WebAssembly 函数,创建一个微服务,允许 JavaScript 调用 Rust 函数。通过 wasm-pack 工具编译 Rust 代码,生成可在 Node.js 环境中使用的 WebAssembly 模块。
摘要由CSDN通过智能技术生成

在之前的教程中,我们讨论了如何从 Web 浏览器中的 JavaScript 应用程序访问 WebAssembly 函数。

然而,或许你已经注意到,服务器端的 WebAssembly 有很多很好的用例,尤其是人工智能、区块链和大数据应用方向。

在这个例子中,将展示如何将 Rust 中编写的 WebAssembly 函数集成到服务器上的 node.js 应用程序中。

我们以微服务的方式提供 WebAssembly 函数。

演示应用程序的结构如下:

主机应用程序是一个用 JavaScript 编写的 node.js web 应用程序,调用 WebAssembly 函数

WebAssembly 字节码程序是用 Rust 编写的,由 node.js 的 web 应用程序调用。

设置

与前面的教程一样,我们使用 wasm-pack 工具编译 Rust 源代码并生成相应的 JavaScript 模块。这种模块使得在 JavaScript 和 Rust 函数之间传递复杂的动态数据变得非常容易。想要深入了解的同学,可以阅读《WebAssembly 中的字符串》。

接下来,按照下面的步骤安装Rust和wasm-pack 工具。

# 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 写的 WebAssembly 程序

在这个示例中,Rust 程序在“hello” 后面追加输入字符串。

创建一个新的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 主机应用程序

接下来,让我们为 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 中。 我相信,将有更多用例将会出现。 敬请期待!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值