将 node require 与 Electron 和 Webpack 一起使用

Posted

技术标签:

【中文标题】将 node require 与 Electron 和 Webpack 一起使用【英文标题】:Using node require with Electron and Webpack 【发布时间】:2016-09-17 07:35:24 【问题描述】:

我正在使用 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”配置选项,但由于这是一个动态要求,它似乎没有被“externals”处理。

还有其他人成功解决了这个问题吗?

【问题讨论】:

不是 100% 确定 - 你试过 global.require 吗? @jantimon 是的,这就行了!谢谢。 【参考方案1】:

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

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

【讨论】:

我尝试在电子 vue 应用程序中使用它。但它说global.require 不是函数。知道这里可能出了什么问题吗? global.require 是 Electron 提供的东西。当您使用 Node.js 本身时,它不起作用。【参考方案2】:

我遇到了this 文章,由于某些其他原因,作者需要不被 webpack 转译的节点模块。他建议使用

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

【讨论】:

以上是关于将 node require 与 Electron 和 Webpack 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Electron 中使用 node_modules?

如何在 Electron 中使用 node_modules?

如何在 Electron 上使用带有 TypeScript 类型支持的 require 内部函数或条件?

有没有办法取消 node.js 对 require 模块的缓存

有没有办法取消 node.js 对 require 模块的缓存

有没有办法取消 node.js 对 require 模块的缓存