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

acruukt9  于 2022-12-16  发布在  Electron
关注(0)|答案(2)|浏览(930)

构建一个电子应用程序时遇到了一个错误,我不明白为什么我的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'模块tho,我尝试将preload.js更改为node_modules文件夹旁边的项目根目录,但没有成功。

vawmfj5a

vawmfj5a1#

我很确定那是因为你在用沙盒封住Windows。
参见文档(original on web.archive.org,当前):
启用此选项后,渲染器必须通过IPC与主进程通信,以便访问节点API。
...
沙盒渲染器不运行Node.js环境,也不向客户端代码公开Node.js JavaScript API。唯一的例外是预加载脚本,它可以访问Electron渲染器API**的 * 子集。
如果你真的需要你的渲染器进程被沙盒化,那么你必须使用requireipcRenderer,并使用它的send函数与主进程通信,然后主进程需要你所有的花哨节点模块,并通过你的预加载发送一些响应。

1tuwyuhd

1tuwyuhd2#

如果设置contextIsolation:true后,问题仍然存在,则设置沙箱:BrowserWindow上的false选项来访问预加载中的节点API。

相关问题