Code Splitting 后 CSS 重复加载怎么解决?
我用 Webpack 做了路由级别的 Code Splitting,但发现每个 chunk 都打包了一份相同的全局样式,导致页面切换时样式重复加载甚至闪烁。
比如下面这段全局重置样式,在多个入口里都被重复引入了:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
我已经试过 MiniCssExtractPlugin,但没效果。是不是配置哪里漏了?
关键点:
1. 确保你的全局CSS文件是被单独import的,而不是在每个路由组件里都引入
2. 上面配置里那个cacheGroups.styles会把所有CSS抽成一个单独的styles.css文件
3. 注意安全:如果用了contenthash,记得在部署时要处理好缓存问题
另外补充个小技巧:如果你用CSS modules,记得把全局样式文件和模块样式文件分开处理,不然会被一起打包。可以这样配置loader:
这样命名全局CSS文件时加个
?global参数就行,比如import './reset.css?global'具体操作:
1. 在webpack配置里加个entry专门放全局样式:
2. 配置MiniCssExtractPlugin时加个filename参数确保全局样式单独打包:
3. 记得在HTML里手动引入这个单独的样式文件,别用动态加载
这样做的好处是全局样式只会加载一次,不会随着路由切换重复加载。文档里其实有提到这种模式,但藏得比较深...
还有个常见误区是用了style-loader然后又想抽离CSS,这俩是冲突的。生产环境记得确认用的是MiniCssExtractPlugin.loader而不是style-loader。
我上次搞这个调试到凌晨三点,咖啡都喝了两杯。你试试看,应该能解决重复加载的问题。