在javascript中导入webassembly模块的正确方法是啥
Posted
技术标签:
【中文标题】在javascript中导入webassembly模块的正确方法是啥【英文标题】:What is the proper way to import webassembly module in javascript在javascript中导入webassembly模块的正确方法是什么 【发布时间】:2019-09-22 12:26:10 【问题描述】:在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 的 Cargo 使用 wasm-pack 时,javascript 文件只执行 import * as wasm from './example.wasm'
这两者有什么区别?直接导入是新支持的功能吗?当使用直接导入时,我将如何从 javascript 访问 WebAssembly 的内存,因为我没有像使用第一种方法那样将它们传递给 WebAssembly 模块?
【问题讨论】:
我相信您的各种问题都已得到解答here,但我还没有深入到它的基础上发布完整的答案。 【参考方案1】:WebAssembly 模块的声明式导入尚未标准化。我假设 wasm-pack 的目标是 Node.js 的实验性导入功能:https://www.joyent.com/blog/improved-wasm-support-coming-to-node#importing-webassembly-modules
如何访问内存取决于模块:如果它导出它,你可以作为一个成员访问它,如果它导入它,它必须作为一个 ES6 模块的成员在你将使用的名称下可用导入对象。
【讨论】:
【参考方案2】:根据平台,如果 wasm 模块在 Web 浏览器中运行,请获取并实例化相关提及的内容。在 nodejs 中运行 WASM 时,WASI 甚至可以提供文件系统沙盒。它可以在使用 WASI 实例化时使用节点 Fs 从磁盘读取文件
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
【讨论】:
以上是关于在javascript中导入webassembly模块的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
在 Javascript 中导入 xlsx 文件时如何手动强制 javascript 事件?