Почему preload.js возвращает «ОШИБКА: модуль не найден»? - PullRequest
0 голосов
/ 01 ноября 2019

Сборка электронного приложения и застрял с ошибкой. Я не понимаю, почему мой 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 Ответ

1 голос
/ 01 ноября 2019

Я почти уверен, что это потому, что вы помещаете в песочницу свое окно.

См. документы :

Если эта опция включена, средство визуализации должноустановить связь через IPC с основным процессом для доступа к API-интерфейсам узлов.

...

Средство рендеринга в песочнице не имеет работающей среды Node.js и не предоставляет Node.js. JavaScript API для клиентского кода. Единственным исключением является сценарий предварительной загрузки, который имеет доступ к подмножеству API рендерера Electron .

Если вам действительно нужно, чтобы ваш процесс рендеринга был изолированным, то вместо этого вы должныrequire ipcRenderer и используйте его функцию send для связи с основным процессом, который может затем потребовать от всех ваших модных узловых модулей и отправить некоторый ответ обратно через вашу предварительную загрузку.

...