Node.js 将WASM文件导入主进程
我正在构建一个需要使用Web Assembly(WASM)的Electron应用程序,但是我遇到了一个问题,Fetch抛出了一个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
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')
})