异步组件与懒加载

1. 定义

异步组件 只有在渲染时才会加载,有效减少首屏包体积。 使用 defineAsyncComponent 包装动态 import。

2. 示例

import { defineAsyncComponent } from 'vue'

const AsyncView = defineAsyncComponent({
  // 加载函数
  loader: () => import('./View.vue'),
  // 加载中组件
  loadingComponent: Loader,
  // 错误组件
  errorComponent: ErrorView,
  // 展示 loadingComponent 前的延迟 (默认 200ms)
  delay: 200,
  // 超时时间
  timeout: 10000,
  // 错误处理,支持重试
  onError(err, retry, fail, attempts) {
    if (attempts < 3) retry()
    else fail()
  }
})

3. 路由懒加载

最常用的场景是路由配置。

const routes = [
  {
    path: '/about',
    component: () => import('./About.vue') // Webpack/Vite 自动代码分割
  }
]

4. 配合 Suspense

在 Vue 3 中,<Suspense> 组件可以处理异步组件的加载状态,提供了一种声明式的 Loading 处理方式。

5. 注意事项

  • 用户体验:设置合理的 delay,避免 Loading 闪烁(如加载太快导致 Loading 一闪而过)。
  • SSR:服务端渲染时通常需要同步加载组件,需确保 build 流程兼容。