【问题标题】:Bundle error using webpack for Electron application `Cannot resolve module 'electron'`使用 webpack 为 Electron 应用程序捆绑错误`无法解析模块'电子'`
【发布时间】:2016-03-29 09:39:42
【问题描述】:

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

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

@./app.jsx 6:18-37

这里是application code

我做错了什么?

谢谢!

【问题讨论】:

  • 请注意,您不需要 webpack 即可将 JSX 与 Electron 一起使用。只需在应用程序的早期入口点中使用Babel require hookMy boilerplate 展示了如何使用 Babel 版本 5 而不是 6 来做到这一点。
  • ^ 这不再是一个好的解决方案,因为 contextIsolation=true 和 nodeIntegration=false 是首选。所以渲染器进程无法访问 Node.js 环境。

标签: node.js reactjs webpack electron


【解决方案1】:

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

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

webpack 会忽略这个需求

【讨论】:

  • 不错的一个!我不需要接触 webpack 配置,它对我来说非常完美,因为我的环境可以是 web 或 electron
  • 当这个简单的解决方案有效时,为什么每个人都使用复杂的 webpack 配置?有什么缺点吗?
  • 开发的时候可以,但是打包electron后就不行了,有什么建议吗?
  • 不适用于 ESM 源。下面的externals解决方案更好。
【解决方案2】:

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

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' 并添加了排除修复它!谢谢!
【解决方案3】:

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

来自webpack documentation

"electron" 编译用于Electron - 支持require-ing Electron 特定模块。

【讨论】:

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

另外,webpack.config.js:

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

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2022-12-30
    • 2020-05-28
    • 2018-04-11
    相关资源
    最近更新 更多