在 Vue 中使用电子事件时如何修复未定义的 __dirname?

And*_*ers 15 vue.js electron vuex

我使用nklayman/vue-cli-plugin-electron-builder创建了一个使用 Vue/Vuex 准备的电子应用程序。它附带文件main.jsbackground.js包括 Vue 组件起点。但我无法让事件发挥作用。我在下面的尝试Uncaught ReferenceError: __dirname is not defined在渲染时产生(编译很好)。

组件:Splash.vue

<template>
    <div @click="open">open</div>      
</template>

<script>

const { ipcMain } = require('electron')

export default {
    methods: {
        open()
        {
            ipcMain.on('my-open-event', (event, arg) => {
                console.log(event, arg)
            })
        }
    }
}
</script>
Run Code Online (Sandbox Code Playgroud)

背景.js

import { app, protocol, BrowserWindow } from 'electron'

...

app.on('my-open-event', async () => {
    try {
        "Will call some executable here";
    } catch (e) {
        console.error(e)
    }
})
Run Code Online (Sandbox Code Playgroud)

主文件

import Vue from 'vue'
import App from './App.vue'
import store from './store'

Vue.config.productionTip = false

new Vue({
  store,
  render: h => h(App)
}).$mount('#app')
Run Code Online (Sandbox Code Playgroud)

完整错误:

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:1035)
    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/lib/index.js?!./src/components/Splash.vue?vue&type=script&lang=js&:6)
    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/lib/index.js?!./src/components/Splash.vue?vue&type=script&lang=js& (app.js:986)
    at __webpack_require__ (app.js:849)
    at fn (app.js:151)
    at eval (webpack-internal:///./src/components/Splash.vue?vue&type=script&lang=js&:2)
    at Module../src/components/Splash.vue?vue&type=script&lang=js& (app.js:1271)
Run Code Online (Sandbox Code Playgroud)

任何想法我做错了什么?

And*_*ers 27

为了解决这个问题,我vue.config.js在项目根目录中创建了一个包含内容的文件

module.exports = {
    pluginOptions: {
        electronBuilder: {
            nodeIntegration: true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我确认这个解决方案可以完美运行。但警告,因为此解决方案会打开 Electron 安全问题,请在此处解释:https://www.electronjs.org/docs/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content (5认同)
  • 如何在 vitejs 中实现此功能? (2认同)