问题描述
构建电子应用程序时遇到错误。 我不明白为什么我的preload.js找不到‘dnode’或‘Path’模块,但它找到了‘url’模块。
preload.js:
const { ipcRenderer } = require('electron');
const url = require('url');
const dnode = require('dnode'); // It breaks here with 'Error: module not found: dnode'
process.once('loaded', () => {
window.addEventListener('message', event => {
const message = event.data;
if (message.myTypeField === 'handler') {
// TO-DO
}
});
});
main.js
const url = require('url');
const path = require('path');
const {app, ipcMain, BrowserWindow} = require('electron');
let mainWindow;
app.on('ready', () => {
mainWindow = new BrowserWindow({
backgroundColor: '#fff',
webPreferences: {
preload: path.join(__dirname, './preload.js'),
nodeIntegration: false,
enableRemoteModule: false,
contextIsolation: true,
sandbox: true
}
});
mainWindow.loadURL(url.format({
pathname: path.join(__dirname, 'index.html'),
protocol:'file:',
slashes: true
}));
});
My main.js找到‘Path’和‘dnode’模块,但我尝试将preload.js更改为位于node_MODULES文件夹下的项目根目录,但不起作用。
推荐答案
我非常确定这是因为您正在沙盒窗口。
参见docs:
启用此选项后,呈现器必须通过IPC与主进程通信才能访问节点API。
...
沙盒呈现器没有运行Node.js环境,也不会向客户端代码公开Node.js JavaScript API。唯一的例外是预加载脚本,它可以访问电子呈现器API的子集。如果您确实需要将呈现器进程放在沙箱中,则必须改为require
ipcRenderer
并使用其send
函数与主进程通信,然后主进程将需要所有花哨的节点模块并通过预加载发回一些响应。