Node.js 将WASM文件导入主进程

Node.js 将WASM文件导入主进程,node.js,electron,webassembly,Node.js,Electron,Webassembly,我正在构建一个需要使用Web Assembly(WASM)的Electron应用程序,但是我遇到了一个问题,Fetch抛出了一个TypeError:导入WASM文件时只支持绝对URL 此外,这可能会提出一个更广泛的问题,即是否应该使用Electron主进程或渲染器进程来运行WASM?它似乎在渲染过程中起作用 下面是完整的错误: TypeError: Only absolute URLs are supported at parseURL (/Users/devuser/developme

我正在构建一个需要使用Web Assembly(WASM)的Electron应用程序,但是我遇到了一个问题,Fetch抛出了一个
TypeError:导入WASM文件时只支持绝对URL

此外,这可能会提出一个更广泛的问题,即是否应该使用Electron主进程或渲染器进程来运行WASM?它似乎在渲染过程中起作用

下面是完整的错误:

TypeError: Only absolute URLs are supported
    at parseURL (/Users/devuser/development/electron-api-demos/node_modules/node-fetch/dist/index.cjs:897:8)
    at new Request (/Users/devuser/development/electron-api-demos/node_modules/node-fetch/dist/index.cjs:922:17)
    at /Users/devuser/development/electron-api-demos/node_modules/node-fetch/dist/index.cjs:1175:19
    at new Promise (<anonymous>)
    at fetch (/Users/devuser/development/electron-api-demos/node_modules/node-fetch/dist/index.cjs:1173:9)
    at IpcMainImpl.<anonymous> (/Users/cbourne/development/electron-api-demos/main-process/communication/async-msg.js:20:36)
    at IpcMainImpl.emit (events.js:223:5)
    at WebContents.<anonymous> (electron/js2c/browser_init.js:4093:15)
    at WebContents.emit (events.js:223:5)

您是否尝试过将
fetch(“test.wasm”)
更改为
fetch(“./test.wasm”)
,或者至少出于开发目的,对本地文件的直接路径进行硬编码?

问题根本不是wasm,而是应该获取二进制文件的请求。您的
获取
来自
节点获取
;主进程在Node.js中运行,因此不像普通页面那样具有基址。提供完整的
文件://
绝对URL以
获取
,或者更简单地使用
fs.readFileSync

const fs=require('fs');
实例化(fs.readFileSync(“text.wasm”);

我只能回答你的部分问题

WASM可能不应该在主进程中运行。即使WASM将在一个独立的线程中运行,您也应该尽可能减少主进程上的负载。当主进程被阻止时,即使像最小化应用程序这样的事情也不会发生,直到它被解锁


要了解更多信息,这是一篇好文章:

请避免在回答中提出(修辞)问题。它们有可能被误认为根本不是答案。此外,你的答案也没有解释它为什么起作用以及它应该如何起作用。这并不能回答这个问题。一旦你有足够的钱,你将能够;相反
const {ipcMain} = require('electron')
require('/Users/devuser/development/electron-api-demos/script/wasm_exec.js')

const fetch = require("node-fetch");

ipcMain.on('asynchronous-message', (event, arg) => {

  if (!WebAssembly.instantiateStreaming) { // polyfill
    WebAssembly.instantiateStreaming = async (resp, importObject) => {
      const source = await (await resp).arrayBuffer();
      return await WebAssembly.instantiate(source, importObject);
    };
  }

  const go = new Go();
  let mod, inst;
  WebAssembly.instantiateStreaming(fetch("test.wasm"), go.importObject).then((result) => {
    mod = result.module;
    inst = result.instance;
    document.getElementById("runButton").disabled = false;
  }).catch((err) => {
    console.error(err);
  });

  async function run() {
    console.clear();
    await go.run(inst);
    inst = await WebAssembly.instantiate(mod, go.importObject); // reset instance
  }

  event.sender.send('asynchronous-reply', 'pong')
})