У меня есть электронное приложение, которое я упаковываю с помощью Vite, используя шаблон Forge . У меня возникли проблемы с добавлением ipcRenderer в файлы React, поскольку это приводит к сбою приложения с этой ошибкой:
Uncaught ReferenceError: __dirname is not defined
at node_modules/electron/index.js (electron.js?v=fee19837:36:30)
at __require (chunk-CEQRFMJQ.js?v=fee19837:11:50)
at electron.js?v=fee19837:54:16
Я пробовал разные подходы, чтобы исправить это, но все равно безуспешно:
import.meta.url:const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
vite.config.js:export default defineConfig({
plugins: [
commonjs(),
NodeGlobalsPolyfillPlugin({
process: true,
buffer: true,
}),
],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
},
define: {
'process.env': {},
'__dirname': '__dirname', // This is a simple way to inject __dirname
},
});
ipcRenderer в preload.ts:contextBridge.exposeInMainWorld('ipcRenderer', ipcRenderer)
browserify в конфигурации Vitealias: {
'@': path.resolve(__dirname, './src'),
path: 'path-browserify'
}
Ни один из них не работает, и я все еще получаю ту же ошибку.
Вот мой цконфиг:
{
"compilerOptions": {
"target": "ESNext",
"module": "commonjs",
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"noImplicitAny": true,
"sourceMap": true,
"baseUrl": ".",
"outDir": "dist",
"moduleResolution": "node",
"resolveJsonModule": true,
"jsx": "react-jsx",
"paths": {
"*": ["node_modules/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.tsx"],
}
Я использую Electron v30.0.9.





Когда вы получаете эту ошибку в приложении Electron, это обычно означает, что вы пытаетесь использовать electron API в своем процессе рендеринга (т. е. в вашем коде React). Переменная __dirname — это глобальная переменная Node.js, для использования которой требуется доступ к API Node.js . А из соображений безопасности доступ к Node.js из вашего рендерера по умолчанию отключен.
Чтобы решить эту проблему, вам совершенно не нужно менять какую-либо конфигурацию, а также не пытайтесь отключить безопасность. Удалите все вызовы electron (и API Node.js) из вашего средства рендеринга и используйте API только через файл предварительной загрузки и IPC.
Обязательно внимательно прочитайте руководство по IPC. Делая это:
contextBridge.exposeInMainWorld("ipcRenderer", ipcRenderer);
Это плохая практика и вообще небезопасно.
Кроме того, единственная причина, по которой вам может понадобиться использовать:
import { fileURLToPath } from "url";
import path from "path";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
Это когда ваше приложение ESM и вам нужно __dirname настроить BroswerWindow на основном процессе.
У меня была такая же проблема с использованием Electron-Vue-Vite, попробуйте удалить использование Electron из процесса рендеринга.