CSS代码分割后样式丢失是怎么回事?
我用Webpack做了代码分割,把不同页面的CSS拆成了单独的chunk,但加载新页面时样式有时候不生效,刷新一下又好了。是不是动态加载CSS的时候顺序乱了?
我试过用mini-css-extract-plugin配合SplitChunksPlugin,配置大概是这样:
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
styles: {
name: 'styles',
type: 'css/mini-extract',
chunks: 'all',
enforce: true
}
}
}
}
但还是偶尔出现样式没加载的情况,特别是在路由切换快的时候。这到底该怎么解决?
你用 mini-css-extract-plugin 时,默认是异步注入 CSS 的,特别是路由切得快,新 chunk 的 CSS 还没加载完,DOM 就渲染完了,自然就乱套。
解决方案是:直接用 mini-css-extract-plugin 的
injectType: 'style'配置,或者升级到 Webpack 5 + css-loader 的injectionMode: 'styleTag',让每个 chunk 的 CSS 都同步插入到 里,而且保证顺序。不过更稳妥的做法是别用 splitChunks 拆 CSS,直接用
SplitChunksPlugin只拆 JS,CSS 全部走一个入口,或者用css-minimizer-webpack-plugin+optimization.minimize: true来压缩合并,避免动态注入带来的时序问题。如果一定要拆,那得手动控制插入顺序,比如给每个 chunk 的 CSS link 加
data-chunk属性,然后用 JS 保证按顺序插入——但真没必要,我见过太多人在这上面踩坑,最后都回退到单 CSS bundle 了。附一个能用的配置例子:
别折腾 splitChunks 拆 CSS 了,除非你清楚自己在干啥。