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

Pit*_*aty 10 node.js node-modules electron

构建一个电子应用程序并遇到错误。我不明白为什么我的 preload.js 找不到“dnode”或“path”模块,但它确实找到了“url”模块。

预加载.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
    }

  });
});
Run Code Online (Sandbox Code Playgroud)

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
    }));

});
Run Code Online (Sandbox Code Playgroud)

我的 main.js 找到了“path”和“dnode”模块,我尝试将 preload.js 更改为 node_modules 文件夹旁边的项目的根目录,但它不起作用。

pus*_*kin 12

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

请参阅文档(原始位于 web.archive.org 上,当前):

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

...

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

如果您确实需要对渲染器进程进行沙箱处理,那么您必须require ipcRenderer使用其send函数与主进程进行通信,然后主进程可以需要所有精美的节点模块并通过预加载发回一些响应。


eon*_*ons 8

如果设置 contextIsolation:true 后问题仍然存在,则在BrowserWindow上设置sandbox: false选项以访问预加载中的 Node API。