即使将nodeIntegration设置为true,电子window.require也不起作用

时间:2020-04-03 23:28:58

标签: node.js reactjs webpack electron

我正在制作的Electron + Create React App应用程序遇到一些问题。这是一个用于成本计算的离线应用程序,我需要保留几个用户设置,为此我使用了https://github.com/sindresorhus/electron-store。像大多数电子模块一样,我必须将其导入为:

const Store = window.require("electron-store");

为了避免webpack的冲突。通过搜索,我发现对于大多数人来说,在创建电子的BrowserWindow时将nodeIntegration:true设置可以避免该问题,但不是我的情况,我总是遇到相同的错误。

我已经尝试过的:

  1. 使用普通要求:导致TypeError:fs.​​existsSync不是函数,并且在控制台中:无法解析'... \ node_modules \ write-file-atomic'中的'worker_threads'

  2. 使用模块覆盖Webpack配置:我使用craco将目标设置为电子渲染器。当我启动应用程序时,它会导致空白页,并且devtools中的错误告诉ReferenceError:require未定义

其他信息是,我不是使用打字稿而是使用普通的js,所以使用“声明全局”这样就行不通了

我的public / electron.js文件:

const electron = require("electron");
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;

const path = require("path");
const isDev = require("electron-is-dev");

let mainWindow;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 900,
    height: 680,
    webPreferences: {
      nodeIntegration: true
    }
  });
  mainWindow.loadURL(
    isDev
      ? "http://localhost:3000"
      : `file://${path.join(__dirname, "../build/index.html")}`
  );
  mainWindow.on("closed", () => (mainWindow = null));
  if (!isDev) mainWindow.setMenu(null);
}

app.on("ready", createWindow);

app.on("window-all-closed", () => {
  if (process.platform !== "darwin") {
    app.quit();
  }
});

electron.app.allowRendererProcessReuse = true;

app.on("activate", () => {
  if (mainWindow === null) {
    createWindow();
  }
});

1 个答案:

答案 0 :(得分:1)

您已经在电子上创建了预加载脚本。

  1. 在您具有电子主脚本的目录上创建一个名为preload.js的文件,并在其中添加以下代码:

    window.require = require;

  2. 转到电子主脚本,并在创建窗口的代码中键入以下内容:

    win =新的BrowserWindow({ 宽度:1280, 高度:720, webPreferences:{ nodeIntegration:否, 预加载:__dirname +'/preload.js' }

    }) 有了这个,您将首先预加载脚本,这对我来说已经解决了问题,希望对您也是如此。