【问题标题】:How to read WebAssembly file it JavaScript from the local file system with native tools如何使用本机工具从本地文件系统读取 WebAssembly 文件和 JavaScript
【发布时间】:2017-09-11 15:38:55
【问题描述】:

我正在寻找一种方法来构建我的 JavaScript 测试并从本地文件系统中读取一个简单的二进制 WebAssembly 文件,即不在浏览器应用程序中,而不使用 node.js 等第三方工具。到目前为止,我发现这可以通过节点 fs 对象来完成。但我不想加载这么大的工具来读取一个文件。 即

我正在寻找像这样替换节点调用的方法

var file = fs.readFileSync('myTestFile.wasm');
var buffer = new Uint8Array(file).buffer;

在没有节点和浏览器的 JavaScript 中会是什么样子?

【问题讨论】:

    标签: javascript webassembly


    【解决方案1】:

    如果您对 .wasm 文件进行 base64 编码,那么您可以将其直接包含在 JavaScript 中,如下所示:

    Module.wasmBinaryFile = "data:application/wasm;base64,AGFzbQEAAAAByQ/AAWACf38Bf2A...";
    

    【讨论】:

    • 这也适用于浏览器,不像其他答案!
    【解决方案2】:

    所有 JavaScript 引擎都有其源代码的非浏览器版本,可在命令行上运行。 JSC 有jsc,V8 有d8,SpiderMonkey js,ChakraCore ch

    这些被每个浏览器供应商用于测试,不可避免地我们有时需要读取 ASCII 或二进制文件。不幸的是,这种功能并没有真正的标准,但我发现这符合我的目的:

    const readAsBinary = filename => {
    if (typeof process === 'object' && typeof require === 'function') {
        const binary = require('fs').readFileSync(file);
        return !binary.buffer ? new Uint8Array(binary) : binary;
    } else
        return typeof readbuffer === 'function'
            ? new Uint8Array(readbuffer(file))
            : read(file, 'binary');
    };
    
    const instance = new WebAssembly.Instance(new WebAssembly.Module(readAsBinary(filename)), {});
    

    这将在 node.js 或引擎的 shell 中工作,而在浏览器中。

    【讨论】:

    • 你好 JS,但是如果我阅读正确并且我不想使用节点,这需要节点,即我想要简单的 java 脚本
    • @Tito 否,它会检测 node.js 并仅在可用时使用它。否则它会检测到暴露readbuffer 的shell,如果不是这样,它会使用read
    • @JFBastien 不是最后的手段(如果未检测到 node.js 和 readerbuffer())只是一个无限递归调用?这似乎是一个错误。
    • @PatrickRoberts 对!固定的。我更改了现有代码,并重命名了我没有遇到的情况:) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多