在javascript中导入Webassembly模块的正确方法是什么



在 webassembly.org 的 JS API 页面中,在 javascript 中导入 WebAssembly 的方式是

fetch('example.wasm').then(response => response.arrayBuffer())
.then(bytes => instantiate(bytes, importObject))
.then(instance => instance.exports.e());

emcc 发出的 js 文件似乎就是这样做的。

但是当我在 Rust's Cargo 中使用 wasm-pack 时,javascript 文件只是import * as wasm from './example.wasm'

这两者有什么区别?直接导入是新支持的功能吗?当使用直接导入时,我将如何从javascript访问WebAssembly的内存,因为我没有像使用第一种方法那样将它们传递给WebAssembly模块?

WebAssembly 模块的声明式导入尚未标准化。我假设wasm-pack的目标是Node的实验性导入功能.js:https://www.joyent.com/blog/improved-wasm-support-coming-to-node#importing-webassembly-modules

如何访问内存取决于模块:如果它导出它,您可以作为成员访问它,如果它导入它,它必须作为 ES6 模块的成员在您将在导入对象中使用的名称下可用。

根据平台的不同,如果 wasm 模块在 Web 浏览器中运行,则获取并实例化为有问题的提及。WASI 在 nodejs 中运行 WASM 时也能够提供均匀的文件系统沙盒。可以使用节点 Fs 从磁盘读取文件,并使用 WASI 进行实例化

const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
const wasm = await WebAssembly.compile(fs.readFileSync('./demo.wasm'));
const instance = await WebAssembly.instantiate(wasm, importObject);
wasi.start(instance);

链接: https://nodejs.org/api/wasi.html

相关内容

  • 没有找到相关文章

最新更新