标准答案

  1. 代码分割的目标是降低首屏包体积,把低频页面、重组件和第三方依赖延后加载。
  2. React.lazy 可以配合动态 import 加载组件,Suspense 用来展示加载期间的 fallback。
  3. 路由懒加载适合页面级拆包,组件懒加载适合图表、编辑器、地图、复杂弹窗等低频重组件。
  4. 拆包不是越碎越好,过度拆分会增加请求数量、加载瀑布和交互等待。
  5. 要结合 bundle 分析、首屏指标、缓存命中和用户路径决定拆分粒度。

题目解析

这道题可以按“为什么拆、拆哪里、怎么兜底”回答。

路由懒加载通常收益较稳定,因为不同页面天然是加载边界。组件级懒加载要看组件是否足够重、是否首屏必要。

Suspense 只负责等待期间的 UI,不会自动让代码更小。真正的拆分来自动态 import 和构建工具。

代码示例

下面是路由页面懒加载的典型写法。

TSX
const ReportPage = lazy(() => import('./pages/ReportPage'))

function AppRoutes() {
  return (
    <Suspense fallback={<PageLoading />}>
      <Routes>
        <Route path="/reports" element={<ReportPage />} />
      </Routes>
    </Suspense>
  )
}

常见误区

  • 把所有组件都 lazy,导致用户操作时频繁等待小 chunk。
  • 只做动态 import,没有设计加载态、错误态和重试入口。
  • 没有用 bundle 分析验证拆分效果,凭感觉优化首屏包体积。

作者信息