将 webpack 用于 Electron 应用程序的捆绑错误`无法解析module'电子'`

IT技术 node.js reactjs webpack electron
2021-04-15 18:27:45

我正在尝试使用React创建一个Electron应用程序我使用Webpack来编译React JSX语法,但是当我尝试使用命令编译时,出现此错误:webpack

未找到 ./app.jsx module中的错误:错误:无法解析 /Users/masterT/Downloads/gist 中的module“电子”

@ ./app.jsx 6:18-37

这是应用程序代码

我做错了什么?

谢谢!

5个回答

一个非常简单的解决方案:

const remote = window.require('electron').remote;

webpack 会忽略这个要求

好东西 !我不需要接触 webpack 配置,它对我来说是完美的,因为我的环境可以是 web 或电子
2021-05-23 18:27:45
它在开发时有效,但打包电子应用程序后它不再起作用,有什么建议吗?
2021-06-07 18:27:45
当这个简单的解决方案有效时,为什么每个人都使用复杂的 webpack 配置?有什么缺点吗?
2021-06-13 18:27:45
不适用于 ESM 源。externals下面解决方案更好。
2021-06-21 18:27:45

Webpack 尝试electron使用已安装的 node_modules解析module。但是该electronmodule在运行时在 Electron 本身中解析。因此,您必须像这样从 webpack 捆绑中排除特定module:

webpack.config.js:

module.exports = {
  entry: './app.jsx',
  output: {
    path: './built',
    filename: 'app.js'
  },
  target: 'atom',
  module: {
    loaders: [
      {
        loader: 'babel',
        test: /\.jsx$/,
        query: {
          presets: ['es2015', 'react']
        }
      }
    ]
  },
  externals: [
    (function () {
      var IGNORES = [
        'electron'
      ];
      return function (context, request, callback) {
        if (IGNORES.indexOf(request) >= 0) {
          return callback(null, "require('" + request + "')");
        }
        return callback();
      };
    })()
  ]
};
高超!!我遇到了错误Can't resolve 'fs' in '.....node_modules\electron'并添加了排除项修复了它!谢谢!
2021-05-22 18:27:45
这很有用,虽然它有效,但与下面康拉德的回答不同,它不是特定于问题的
2021-05-24 18:27:45
很好的答案!非常感谢!
2021-05-27 18:27:45

您可以target: 'electron'在 webpack 配置中进行设置,然后您不必在外部排除电子。

来自webpack 文档

"electron"编译在Electron中使用- 支持require-ing Electron 特定module。

似乎这并不能阻止 webpack 将电子需求编译到 bundle.js 中。它不会抛出错误 - 是的 - 但是如果您尝试在 jsx 中需要任何仅节点module(例如“路径”),则会有一个损坏的 js 包,其中复制了节点module。至少我在使用“电子主”和/或“电子渲染器”目标时所经历的(“电子”目标最近已贬值)。似乎对电子使用 window.require 需要工作并允许更多控制。
2021-05-24 18:27:45
请注意,在较新的 Webpack 版本中,正确的目标名称是electron-main.
2021-06-02 18:27:45
这应该是公认的答案:它是唯一解决特定问题的答案。
2021-06-06 18:27:45

另外,webpack.config.js

const nodeExternals = require('webpack-node-externals')

module.exports = {
    ...
    externals: [ nodeExternals(), 'react', 'electron' ],
    ...
}

您的 package.json 有“电子预建”,但您的代码中需要“电子”。您是否尝试过要求“电子预构建”?

它返回└── (empty)但是在我的代码中,electron不是对这个modulenpmjs.com/package/electron的引用,而是github.com/atom/electron的引用
2021-05-27 18:27:45
如果你看一下快速启动电子文档,它们require('electron')我认为问题与 webpack 有关。
2021-06-01 18:27:45
我明白了,所以它必须是一个 webpack 配置;我确实target在这里进行了一些相当不同的 webpack 配置github.com/chentsulin/electron-react-boilerplate/blob/master/...虽然target: 'atom'是 webpack 文档中的内容,正如您可能已经发现的那样。似乎正在使用github.com/chentsulin/webpack-target-electron-renderer来完成 webpack 的配置。
2021-06-04 18:27:45
好吧,它使用modulegithub.com/chentsulin/webpack-target-electron-renderer 工作,但为什么使用 option 不起作用target: 'atom'webpack 中应该有内置解决方案时,使用module感觉是错误的你不觉得吗?
2021-06-06 18:27:45
如果您在终端中执行 > "npm ls electron",它是否列出了任何内容?
2021-06-10 18:27:45