IPC в электронном рендерере выдает ошибку из-за отсутствия функции __dirname

Я хотел использовать следующий код для отправки сообщения от рендерера в основной процесс, который затем записывает его в файл журнала, используя электронный журнал. Мой main.js выглядит так:

import { app, protocol, BrowserWindow } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
const { ipcMain } = require('electron');
const log = require('electron-log');
const isDevelopment = process.env.NODE_ENV !== 'production'

// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true } }
])

async function createWindow() {
  // Create the browser window.
  const win = new BrowserWindow({
    frame: true,
    width: 400,
    height: 800,
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: true,
      enableRemoteModule: false
    }
  })

  ipcMain.on('infoLog', (event, args) => {
    log.info(args)
   });
....

Теперь я попытался соответствующим образом обратиться к IPC в своем App.vue:

import Navbar from '@/components/Navbar'
const { ipcRenderer } = require('electron')

export default {
  name: 'App',
  components: {
    Navbar
  },
  created: function () {
    ipcRenderer.send('infoLog','A async message to main')
  }
}

Когда я запускаю его с помощью yarn electron:serve, я вижу эту ошибку в консоли окна:

Uncaught ReferenceError: __dirname is not defined
    at eval (webpack-internal:///./node_modules/electron/index.js:4)
    at Object../node_modules/electron/index.js (chunk-vendors.js:2778)
    at __webpack_require__ (app.js:849)
    at fn (app.js:151)
    at eval (webpack-internal:///./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader-v16/dist/index.js?!./src/App.vue?vue&type=script&lang=js:5)
    at Module../node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader-v16/dist/index.js?!./src/App.vue?vue&type=script&lang=js (app.js:938)
    at __webpack_require__ (app.js:849)
    at fn (app.js:151)
    at eval (webpack-internal:///./src/App.vue?vue&type=script&lang=js:2)
    at Module../src/App.vue?vue&type=script&lang=js (app.js:1099)

Чего я не понимаю, так это того, что я настроил его точно так же, как документ Электрона:

https://www.electronjs.org/docs/api/ipc-main

Сделайте свой nodeIntegration: true и он должен работать. Также прочитайте и поймите о nodeIntegration, изоляции контекста и проблемах безопасности при использовании nodeIntegration. electronjs.org/docs/tutorial/security github.com/electron/electron/issues/4362

Nayeem Jahan Rafi 27.12.2020 13:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
1 257
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть 2 разные проблемы:

  • правильная конфигурация веб-пакета для поддержки кода node.js
  • отсутствует интеграция узла для использования API узла, такого как require

Трассировка стека, которую вы здесь видите, вероятно, связана с неправильной конфигурацией веб-пакета. Если не указано иное, webpack пытается заменить __dirname чем-то другим. Здесь мы этого не хотим — узел предоставляет __dirname, и мы хотим его использовать, поэтому мы должны указать веб-пакету оставить __dirname в покое.

Вы найдете пример в документации по веб-пакету.

Для webpack 5 добавление раздела node должно помочь:

module.exports = {
  //...
  node: {
    global: false,
    __filename: false,
    __dirname: false,
  }
};

После того, как вы решили эту проблему, вы, вероятно, столкнетесь с проблемой, которую окно вашего браузера не знает require. Вы можете повторно ввести определенный API узла, такой как IPC, с помощью сценария предварительной загрузки. Не активируйте полную интеграцию узлов, не зная, что вы делаете.

Например, взгляните на этот ответ.

Другие вопросы по теме