微前端预加载如何避免重复加载相同模块?
我在用qiankun搭建微前端时,尝试给两个子应用配置预加载,发现它们都引用了lodash,但每次预加载都会重复加载这个模块,导致打包体积增大。我尝试在主应用里用import('lodash')提前加载,但子应用还是重新请求了模块,控制台还报错:
// 主应用预加载代码
async function preload() {
await Promise.all([
import('@subapp1').then(app => app.preload()),
import('@subapp2').then(app => app.preload()),
import('lodash') // 尝试提前加载公共模块
])
}
这样操作后子应用启动时依然会再发lodash的请求,甚至出现Uncaught SyntaxError: The requested module 'lodash' already has been loaded via a different module ID错误,应该怎么处理这种公共模块的预加载问题?
给你个可行的方案:
1. 在主应用里用webpack的externals配置lodash,这样它就不会被打包进去
2. 在index.html里直接用script标签加载lodash的CDN版本
3. 子应用也配置externals,告诉它们直接使用全局的_变量
具体操作:
主应用webpack配置:
然后在index.html头部加上:
子应用同样配置externals,这样它们就会直接使用window._而不会重复加载。
报错那个SyntaxError就是因为模块系统发现同一个文件被不同ID加载了两次。用CDN+externals的方案最稳,我们项目也是这么干的,打包体积能减不少。
还有个备选方案是用webpack的splitChunks把lodash抽成公共chunk,但qiankun环境下externals方案更简单直接。
子应用也加同样的externals配置,打包时就不会重复打进去了。搞定,就这样。