React 项目中动态导入组件后样式丢失了怎么办?
我在用 React 做代码分割,用 React.lazy 动态加载一个组件,结果这个组件的 CSS 样式完全没生效,页面布局都乱了。
我试过把 import 放在组件内部,也试过用 Suspense 包裹,但样式还是不加载。本地开发没问题,一打包上线就出问题。是不是因为样式没和组件一起被分割?
我的写法大概是这样:
const LazyComponent = React.lazy(() => import('./LazyComponent'));
function App() {
return (
<Suspense fallback="Loading...">
<LazyComponent />
</Suspense>
);
}
而 LazyComponent 里是这么引入样式的:import './LazyComponent.css';
核心原因是你的 CSS 走了静态分析,Webpack 以为它属于主 chunk,结果动态组件被拆出去后,CSS 没跟着一起加载。
最简单的解决办法:把 CSS 也变成动态导入。
改一下你的写法:
这样 Webpack 会把 CSS 和组件打包到一起,动态加载时一起拉下来。
如果用的是 Webpack 4+,配置了 mini-css-extract-plugin 的话,检查一下你的 css chunk 有没有被正确分割。可以在 webpack 配置里加上这个:
另外,optimization.splitChunks 里的 cacheGroups 要包含 CSS:
如果不想折腾配置,直接用我上面说的 Promise.all 写法最省事,样式和组件打包在一起,不会有路径问题。