为什么用了React.lazy和Suspense后首屏加载反而变慢了?
我在给React项目做代码分割优化时,把一个大组件用React.lazy包裹了,然后用Suspense包裹渲染。但实际测试发现首屏加载时间比之前还长,控制台显示初始包反而增加了。这是为什么呢?
import React, { Suspense } from 'react';
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
function App() {
return (
<Suspense fallback={Loading...}>
页面头部
{/* 这个组件其实首屏需要显示 */}
);
}
我原本以为懒加载能减少首屏加载内容,但发现HeavyComponent的内容还是被包含在初始包里了。用webpack-bundle-analyzer看发现这个组件被错误地打包到main chunk里,这是哪里配置错了?
React.lazy和看看你的代码,问题出在
HeavyComponent其实首屏就需要显示,这种情况下懒加载反而增加了额外的开销。动态加载是有成本的,比如需要解析JSONP、发起HTTP请求等,这些都会让首屏变慢。如果这个组件首屏必现,建议直接静态导入,别用懒加载。懒加载适合那些非首屏或者条件触发的组件,比如路由切换后的页面。
另外,确保Webpack的配置支持代码分割。你需要检查
optimization.splitChunks是否正确设置。下面是一个基础的配置示例:最后再提醒一句,懒加载不是万能药,要用对地方才能效率更高。首屏组件就老老实实静态导入吧,别折腾了。