故事发生在微前端的场景下,基于 single-spa 定制,在路由切换进行子应用交替时发生的情况。
举例说明, 有子应用 A 和子应用 B , A 使用 Vue3 相关技术栈, B 使用 Vue2 相关技术栈。
默认情况下,第一次进入 A 或者第一次进入 B ,相应的内容都可以正常的载入,并且不会报错。
但是如果说是先进入 A ,再进入 B ,或者反之操作,会引起后者无法正常载入,并且可以从控制台查看到报错信息。
定位到的问题也非常诡异,检查 A 和 B 本身并没有什么问题会造成这样的情况。
尝试从 Webpack 的编译产物入手排查发现, Webpack Runtime 的代码中,有一个 modules
的对象,用于在加载模块时进行查询使用。
仔细来回切换发现, A 和 B 的 modules
在第一次进入时都很正常,但是进行切换后会发现 modules
出现了污染。
简单点来说就是 A 和 B 的 modules
意外的合并了……
仔细检查 Runtime 代码和翻阅 Webpack 文档发现,是因为 async chunk 引起此问题。
并且发现 A 和 B 的代码中的 jsonpFunction
同名了,所以导致了此问题。
只在 target 是 web 时使用,用于按需加载(load on-demand) chunk 的 JSONP 函数。
JSONP 函数用于异步加载(async load) chunk,或者拼接多个初始 chunk(CommonsChunkPlugin, AggressiveSplittingPlugin)。
如果在同一网页中使用了多个(来自不同编译过程(compilation)的)webpack runtime,则需要修改此选项。
如果使用了 output.library 选项,library 名称时自动追加的。
比较奇怪的是,明明 A 和 B 的构建配置已经设置了独立的 library
选项,但是还是造成了这么多困惑。
总之,问题得以解决,记录一下。
- 本文链接: https://zongzi531.com/2022/07/15/%E5%BE%AE%E5%89%8D%E7%AB%AF%E4%B8%8Bwebpack-runtime%E9%81%87%E5%9D%91%E8%AE%B0%E5%BD%95/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!