本文中的所有代码都可以在https://github.com/second-sta...在Web浏览器中从JavaScript应用程序访问WebAssembly函数。WebAssembly快速问答Rust的Helloworld|WebAssembly入门教程5分钟实现一个简单的WebAssembly应用|WebAssembly入门教程如何将字符串从JavaScript传递到Wasm/Rust|WebAssembly入门教程WebAssembly有很多很好的用例,尤其是在人工智能、区块链和大数据应用方向。在这个例子中,我将展示如何将用Rust编写的WebAssembly函数集成到服务器上的node.js应用程序中。我们将WebAssembly函数公开为微服务。演示应用程序的结构如下:主机应用程序是一个用JavaScript编写的调用WebAssembly函数的node.jsWeb应用程序WebAssembly字节码程序是用Rust编写的,由node.jsWeb应用程序调用。查看源代码和教程设置与之前的教程一样,我们使用wasm-pack工具编译Rust源代码并生成相应的JavaScript模块。这样的模块使得在JavaScript和Rust函数之间传递复杂的动态数据变得非常容易。想要了解更多的同学可以阅读《WebAssembly 中的字符串》。接下来,按照以下步骤安装Rust和wasm-pack工具。#安装Rust$sudoapt-getupdate$sudoapt-get-yupgrade$curl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|sh$来源$HOME/.cargo/env#安装wasm-pack工具$curlhttps://rustwasm.github.io/wasm-pack/installer/init.sh-sSf|shRust编写的WebAssembly程序在这个例子中,Rust程序在"hello"后面附加了输入字符串。创建一个新的货运项目。注意:由于此程序是从主机应用程序调用的,而不是作为独立的可执行文件运行的,因此我们将创建一个hello项目。···$cargonew--libhello$cdhello编辑Cargo.toml文件以添加一个[lib]部分。它告诉编译器在哪里可以找到库的源代码,以及如何生成字节码输出。同时,我们还需要在这里添加wasm-bindgen依赖。这就是使用wasm-pack生成绑定JavaScript的rustwebassembly程序的目的[lib]name="hello_lib"path="src/lib.rs"crate-type=["cdylib"][dependencies]wasm-bindgen="0.2.50"下面是Rust程序src/lib.rs的内容。事实上,我们可以在这个库文件中定义多个外部函数,所有这些函数都可以通过WebAssembly在宿主JavaScript应用程序中使用。使用wasm_bindgen::prelude::*;#[wasm_bindgen]pubfnsay(s:String)->String{letr=String::from("hello");returnr+&s;}接下来,您可以通过将Rust源代码编译为WebAssembly字节码并为node.js宿主环境生成相应的JavaScript模块。$wasm-packbuild--targetnodejs结果如下三个文件..wasm文件是WebAssembly字节码程序;.js文件用于JavaScript模块;Pkg/hellolibbg.wasmPkg/hellolibbg.jsPkg/hellolib.jsNode.Js主机应用程序接下来,让我们为我们的node.jsWeb应用程序创建一个节点文件夹,复制生成的JavaScript模块文件。$mkdirnode$cppkg/hellolibbg.wasmnode/$cppkg/hellolibbg.jsnode/$cppkg/hellolib.jsnode/使用生成的hello_lib.js,在JavaScript中调用WebAssembly函数非常容易.下面是节点应用程序app.js。它只是从生成的模块中导入say()函数。节点应用程序从传入的httpget请求中获取名称参数,并以“helloname”进行响应。const{say}=require('./hello_lib.js');consthttp=require('http');consturl=require('url');consthostname='127.0.0.1';constport=8080;constserver=http.createServer((req,res)=>{constqueryObject=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(`Serverrunningathttp://${hostname}:${端口}/`);});通过以下方式启动node.js应用程序服务器。$nodeapp.jsServerrunningathttp://127.0.0.1:8080/然后就可以测试了。$curlhttp://127.0.0.1:8080/?name=WasmhelloWasm的下一步是什么?现在,Web服务可以将计算密集型、不安全和新颖的硬件访问任务卸载到WebAssembly中。我相信还会出现更多的用例。敬请关注!
