Я хотел использовать следующий код для отправки сообщения от рендерера в основной процесс, который затем записывает его в файл журнала, используя электронный журнал. Мой 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)
Чего я не понимаю, так это того, что я настроил его точно так же, как документ Электрона:



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


У вас есть 2 разные проблемы:
requireТрассировка стека, которую вы здесь видите, вероятно, связана с неправильной конфигурацией веб-пакета. Если не указано иное, webpack пытается заменить __dirname чем-то другим. Здесь мы этого не хотим — узел предоставляет __dirname, и мы хотим его использовать, поэтому мы должны указать веб-пакету оставить __dirname в покое.
Вы найдете пример в документации по веб-пакету.
Для webpack 5 добавление раздела node должно помочь:
module.exports = {
//...
node: {
global: false,
__filename: false,
__dirname: false,
}
};
После того, как вы решили эту проблему, вы, вероятно, столкнетесь с проблемой, которую окно вашего браузера не знает require. Вы можете повторно ввести определенный API узла, такой как IPC, с помощью сценария предварительной загрузки. Не активируйте полную интеграцию узлов, не зная, что вы делаете.
Например, взгляните на этот ответ.
Сделайте свой
nodeIntegration: trueи он должен работать. Также прочитайте и поймите оnodeIntegration, изоляции контекста и проблемах безопасности при использовании nodeIntegration. electronjs.org/docs/tutorial/security github.com/electron/electron/issues/4362