使用Electron和Webpack的node require函数

5

我正在使用Electron构建一项项目,并使用Webpack构建(Angular 2)渲染过程应用程序。

在此应用程序中,我需要在运行时动态require一些不存在于构建时的文件。代码看起来像这样:

require("fs").readdirSync(this.path).forEach(file => {
  let myModule = require(path.join(this.path, file));
  // do stuff with myModule
});

问题在于Webpack编译器会将require()调用转换为其自己的__webpack_require__(),并且在运行时,它将在自己的内部模块注册表中查找动态加载的“myModule”文件,显然找不到。
我尝试使用“externals”配置选项,但由于这是一个动态的require,所以似乎没有被“externals”处理。
有人成功解决了这个问题吗?

1
不是很确定 - 你尝试过 global.require 吗? - jantimon
@jantimon 是的,就是这样做!谢谢。 - Michael Bromley
2个回答

6

正如@jantimon在我的问题的评论中建议的那样,解决方案是使用global.require

require("fs").readdirSync(this.path).forEach(file => {
  let myModule = global.require(path.join(this.path, file));
  // do stuff with myModule
});

我尝试在一个 electron vue 应用程序中使用它。但是它说 global.require 不是一个函数。这里可能出了什么问题? - Pascal Lamers
global.require 是 Electron 提供的功能。当您使用 Node.js 本身时,它不起作用。 - Kevin Ghadyani

-1
我看到了this篇文章,作者因为某些原因需要使用未被webpack转译的node模块。他建议使用


new webpack.IgnorePlugin(new RegExp("^(fs|ipc)$"))

在webpack.config.js文件中加入以下内容,可以防止fs和ipc模块进行编译,以便在代码中使用(需要)。
我不确定这是否也适用于您的问题,但可能会有所帮助。
更多相关信息可以在这里找到原始文章:https://medium.com/@Agro/developing-desktop-applications-with-electron-and-react-40d117d97564#.927tyjq0y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接