当前位置: 首页 > 后端技术 > Node.js

Webassembly实践-rust转wasm

时间:2023-04-03 10:39:58 Node.js

目标是利用rust已有的lib-blake2b-simd生成js可调用的工具函数。避免用js翻译rust代码造成的资源消耗。环境rustcrustupcargo(rust-lang开发编译工具)nodejs(发布wasm-pack生成的包)installwasm-pack.toml[package]name="blake2b-wasm"version="0.1.0"authors=["foo"]edition="2018"#在https://doc.rust-lang.org/cargo/reference/manifest.html[lib]crate-查看更多键及其定义type=["cdylib"][dependencies]wasm-bindgen="0.2"blake2b_simd="0.5.8"编辑src目录下的lib.rsuseblake2b_simd::{blake2b,Params};usewasm_bindgen::prelude::*;#[wasm_bindgen]pubfnblake2b_encode(input:&[u8],length:usize)->String{iflength==0{returnblake2b(input).to_hex().to_string()}lethash=Params::new().hash_length(长度).hash(输入);hash.to_hex().to_string()}#[cfg(test)]modtests{使用super::*;#[test]fnit_works(){letexpected="ca002330e69d3e6b84a46a56a6533fd79d51d97a3bb7cad6c2ff43b354185d6d\c1e723fb3db4ae0737e120378424c714bb982d9dc5bbd7a0ab318240ddd18f8d";lethash=blake2b(b"foo");assert_eq!(expected,&hash.to_hex());}}执行单元测试cargotest如果看到如下结果,可以进行下一步编译webassemblyFinisheddev[unoptimized+debuginfo]target(s)in0.09sRunningtarget/debug/deps/blake2b_wasm-8c79ae2ec6adeb5brunning1testtesttests::it_works...oktestresult:ok.1passed;0failed;0ignored;0measured;0filteredoutusingwasm-pack将源文件打包成wasm格式wasm-packbuild--scopefoo--targetnodejs编译后会生成一个pkg目录,可以直接发布到npm中使用如果想在上面使用浏览器,编译时使用--目标浏览器也可以指定生成的目录,-dbrowser_pkg如果我们之前安装过nodejs,我们可以在这个目录下创建一个test.js文件来测试我们刚刚编译的wasm包test。jsconst{blake2b_encode}=require('./pkg')constassert=require('assert')constencodeString=blake2b_encode(Buffer.from("foo"))constexpectedString="ca002330e69d3e6b84a46a56a6533fd79d51d97a3bb7cad6c2ff43b354185d6dc1e723fb3db4ae0737e120378424c714bb982d9dc5bbd7a0ab318240ddd18f8d"assert.equal(encodeString,expectedString)