【发布时间】:2018-02-14 08:38:42
【问题描述】:
我有一个由两个独立项目组成的环境,可以描述如下:
- 两个 webpack 包,由两个不同的项目生成:IDE 和 App。
- 它们都是基于 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.initIDE 和window.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