【问题标题】:Multiple independent webpack bundles: chunks load not working correctly多个独立的 webpack 包:块加载无法正常工作
【发布时间】:2018-02-14 08:38:42
【问题描述】:

我有一个由两个独立项目组成的环境,可以描述如下:

  • 两个 webpack 包,由两个不同的项目生成:IDEApp
  • 它们都是基于 ReactJS 的(尽管我认为这并不重要)。
  • IDE 基于 webpack 2.x,而应用程序较旧(仍然是 webpack 1.x)
  • 从一个捆绑包到另一个捆绑包没有显式依赖关系(没有“导入”)
  • 两个包都公开了一个要初始化的全局函数。
  • IDE 正在使用 webpack CommonsChunkPlugin,但删除它并不能解决问题(如 Webpack config for Code splitting not working for production build 所报告的那样)。

IDE 和应用程序都必须在第 3 方 JavaScript 环境中使用。它会在需要时调用window.initIDEwindow.initApp。 没有显式依赖,因为如果缺少另一个,IDE 和 App 仍然可以工作,因此页面中包含的 JS 类似于:

<script src=".../app.js" />
<script src=".../ide.js" />

这个环境正常工作了很长时间。 IDE 基于react-boilerplate,所以它从一开始就使用了块和代码拆分。

最近我们也在 App 中添加了 JS 块,使用react-loadable

虽然 IDE 和 App 在页面上仅使用其中一个时按预期工作,但如果我们同时激活 App 和 IDE,则不会加载块:使用的 last 库是这不会加载块,而第一个按预期工作。

检查浏览器的网络选项卡,我们发现 在加载第二个名为 lib 的块时没有任何活动

显然我们得到了错误:IDE 和 App 的 Tracebacks 相似:

Uncaught (in promise) TypeError: Cannot read property 'call' of undefined
    at __webpack_require__

检查__webpack_require__:

modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));

虽然modules 是一个包含所有可用模块的数组,但没有modules[moduleId],因为moduleId 引用了一个无效索引(可能是因为它尚未加载...但为什么?)

我一直认为 webpack 内部实现不会全局暴露在 bundle 构建之外,但不知何故这似乎不是真的。

一个捆绑包如何干扰另一个捆绑包?为什么没有加载块? 有关如何解决此问题的任何建议?

【问题讨论】:

  • 为什么不将它们合并到一个项目中呢?这样您就可以删除冗余代码并进行更好的优化。
  • 正如我所说,必须保持良好的独立性。尤其是 App,这是一个包含在不同 3rd 方页面上的小项目(根本没有 IDE)。
  • 1.你能分享你的配置吗? 2. 您是否尝试过关闭 dedupePlugin 以防万一? 3. 您是否尝试过在两种设置中将 webpack 更新到最新的次要版本,以确保这不是 webpack 问题,这已经得到修复? 4.您是否尝试过逐步关闭插件和加载程序以找出问题的原因?

标签: javascript reactjs webpack


【解决方案1】:

您应该为每个包配置output.jsonpFunction 属性。

【讨论】:

  • 非常感谢,您解决了我的问题。我真的很惊讶,但这种默认行为......就像世界上每个 webpack 构建的包都可以破坏其他包......我不明白这不是以某种方式自动处理(或更清楚地记录)。跨度>
  • @LucaFabbri 我真的不知道,也许有一些方法可以跨包使用公共块,这就是它的原因。但我同意,捆绑的干扰对于默认行为来说很奇怪。
猜你喜欢
  • 2018-12-31
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多