为什么preload.js返回“错误:找不到模块”?

时间:2019-11-01 01:54:01

标签: node.js electron node-modules

建立一个电子应用程序,并陷入错误。 我不明白为什么我的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
    }));

});

我的main.js找到了'path'和'dnode'模块,我试图将preload.js更改为node_modules文件夹旁边的项目的根目录,但没有用。

1 个答案:

答案 0 :(得分:1)

我很确定那是因为您正在对窗口进行沙箱处理。

请参见docs

  

启用此选项后,渲染器必须通过IPC与主进程通信才能访问节点API。

     

...

     

沙盒渲染器没有运行Node.js环境,也没有向客户端代码公开Node.js JavaScript API。唯一的例外是预加载脚本,该脚本可以访问 Electron渲染器API的子集

如果您确实需要对渲染器进程进行沙箱处理,则必须改为require ipcRenderer并使用其send函数与可能需要您花哨的主进程进行通信节点模块,并通过您的预加载发回一些响应。