Решение проблемы с require() в Electron: лучшие методы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для исправления ошибки require() не определён в Electron необходимо установить параметры nodeIntegration: true и contextIsolation: false в разделе webPreferences, когда вы создаёте экземпляр BrowserWindow:

JS
Скопировать код
new BrowserWindow({
  webPreferences: {
    nodeIntegration: true, // включаем GPS для туриста, заблудившегося в городе
    contextIsolation: false // сносим стену 😎
  }
});

Такое изменение позволяет активировать функциональность Node.js и использовать require() в рендер-процессе Electron.

Кинга Идем в IT: пошаговый план для смены профессии

Глубокое погружение: nodeIntegration и безопасность

Решение проблемы с require() важно, но понимание воздействия включения nodeIntegration — это отдельная тема. Начиная с пятой версии, Electron по умолчанию выставляет значение параметра nodeIntegration как false, тем самым улучшая безопасность при загрузке контента из внешних источников.

Для безопасного использования функциональности Node.js рекомендуется использовать preload script. Этот скрипт выполняется до начала рендеринга и имеет доступ ко всему API Node.js, вне зависимости от установок nodeIntegration. Вот пример:

JS
Скопировать код
new BrowserWindow({
  webPreferences: {
    preload: path.join(__dirname, 'preload.js') // безопасная загрузка начата...🔐👍
  }
});

В preload.js используйте contextBridge, чтобы безопасно передать нужные функции или API для рендеринг-процесса:

JS
Скопировать код
const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld(
  'api', {
    doSomething: () => ipcRenderer.send('do-something') // do-something: "Ты знаешь, я что-то делаю! 🎉"
  }
);

Это позволит, даже при включённой изоляции контекста contextIsolation, безопасно обеспечить взаимодействие рендеринг-процесса с главным процессом через IPC.

Визуализация

Для лучшего понимания проблемы и её решения рассмотрим следующую аналогию:

Вы хотите использовать электроинструмент (🛠️), нуждающийся в питании от сети (⚡), но обнаруживаете, что доступные розетки (🔌) не подходят под ваш штепсель. Это точно такая же ситуация, как и с попыткой использовать require() в Electron при несовместимой модульной системе.

Markdown
Скопировать код
Electron 🖥️ [🔌(🚫🛠️)] – require() отсутствует!

Если вы всё ещё хотите добиться успеха, вам потребуется адаптер (🔧):

JS
Скопировать код
window.require = require; // Адаптер (🔧) станет вашим верным помощником 👍

Теперь электроинструмент (🛠️) способен работать от сети успешно:

Markdown
Скопировать код
Electron 🖥️ [(🔌+🔧)⚡➡🛠️] – Ура! require() определён.

Хотите найти баланс между надёжностью и безопасностью? Тогда используйте автоматические выключатели (⚡️🔒) для электроинструментов. В мире Electron это равнозначно применению preload скриптов, которые позволяют безопасно использовать функции Node.js.

Как безопасно управлять nodeIntegration

Активация nodeIntegration может быть опасна. Любой контент, загружаемый рендерером, получит одинаковые привилегии, что и ваше приложение, что может создать уязвимости для безопасности.

Активация только тогда, когда это необходимо

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

Приспособление к обновлениям

Electron продолжает развиваться, и начиная с 10-ой версии, параметр nodeIntegration стал устаревшим. Во время приспособления к нововведениям следует учитывать уделить внимание новейшим рекомендациям по безопасности и, прежде всего, использовать preload скрипты.

Максимальная безопасность: включите режим "песочницы"!

Для обеспечения наилучшей безопасности включите параметр sandbox: true в webPreferences. Это обеспечит полную изоляцию среды, оставляя IPC единственным способом общения между процессами.

Полезные материалы