【问题标题】: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,但我还没有深入到它的基础上发布完整的答案。

标签: javascript emscripten webassembly


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      相关资源
      最近更新 更多