标准答案

  1. 路由懒加载通常用动态 import 拆分页面级 chunk,用户进入对应路由时再加载页面组件。
  2. defineAsyncComponent 适合延迟加载较重的局部组件,例如图表、富文本编辑器、复杂弹窗。
  3. 异步组件可以配置 loading、error、delay、timeout 等状态,提升加载失败和慢网络下的体验。
  4. Suspense 用来协调组件树里的异步 setup 或异步组件,让父级可以统一展示 fallback。
  5. 拆包不是越碎越好。要结合首屏体积、复用频率、网络并发和缓存命中率决定拆分粒度。

题目解析

这道题要把“加载边界”和“展示边界”分开讲:路由懒加载解决页面进入时的包加载,Suspense 解决等待期间怎么展示。

大型后台常见做法是路由级懒加载页面,再对低频重组件做组件级懒加载。

异步组件失败时要有错误态,不能让页面空白。涉及核心流程的组件也不能盲目延迟加载。

代码示例

下面展示了页面级路由懒加载和组件级异步组件。

TypeScript
const routes = [
  {
    path: '/report',
    component: () => import('./pages/ReportPage.vue')
  }
]
Vue
<script setup lang="ts">
const HeavyChart = defineAsyncComponent({
  loader: () => import('./HeavyChart.vue'),
  timeout: 10000
})
</script>

<template>
  <Suspense>
    <HeavyChart />
    <template #fallback>
      <div>图表加载中</div>
    </template>
  </Suspense>
</template>

常见误区

  • 把所有组件都异步化,导致请求数量过多和交互延迟变高。
  • 只做动态 import,没有处理 loading、error 或 timeout 状态。
  • 混淆路由懒加载和 Suspense,以为 Suspense 会自动减少首屏包体积。

作者信息