Electron - приложение React __dirname не определено

У меня есть электронное приложение, которое я упаковываю с помощью 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 в конфигурации Vite
alias: {
  '@': 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.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
203
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Когда вы получаете эту ошибку в приложении 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 из процесса рендеринга.

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