vue2的异步组件

在vue2中我常用的导入异步组件的方式

  1. new Vue({
  2. // ...
  3. components: {
  4. 'my-component': () => import('./my-async-component')
  5. }
  6. })

vue3的异步组件

在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块。为了简化,Vue 有一个 defineAsyncComponent 方法:

defineAsyncComponent

创建一个只有在需要时才会加载的异步组件。
官方的解释

参数

对于基本用法,defineAsyncComponent 可以接受一个返回 Promise 的工厂函数。Promise 的 resolve 回调应该在服务端返回组件定义后被调用。你也可以调用 reject(reason) 来表示加载失败。

  1. import { defineAsyncComponent } from 'vue'
  2. const AsyncComp = defineAsyncComponent(() =>
  3. import('./components/AsyncComponent.vue')
  4. )
  5. app.component('async-component', AsyncComp)

当使用局部注册时,你也可以直接提供一个返回 Promise 的函数:

  1. import { createApp, defineAsyncComponent } from 'vue'
  2. createApp({
  3. // ...
  4. components: {
  5. AsyncComponent: defineAsyncComponent(() =>
  6. import('./components/AsyncComponent.vue')
  7. )
  8. }
  9. })

对于高阶用法,defineAsyncComponent 可以接受一个对象:
defineAsyncComponent 方法还可以返回以下格式的对象:

  1. import { defineAsyncComponent } from 'vue'
  2. const AsyncComp = defineAsyncComponent({
  3. // 工厂函数
  4. loader: () => import('./Foo.vue')
  5. // 加载异步组件时要使用的组件
  6. loadingComponent: LoadingComponent,
  7. // 加载失败时要使用的组件
  8. errorComponent: ErrorComponent,
  9. // 在显示 loadingComponent 之前的延迟 | 默认值:200(单位 ms)
  10. delay: 200,
  11. // 如果提供了 timeout ,并且加载组件的时间超过了设定值,将显示错误组件
  12. // 默认值:Infinity(即永不超时,单位 ms)
  13. timeout: 3000,
  14. // 定义组件是否可挂起 | 默认值:true
  15. suspensible: false,
  16. /**
  17. *
  18. * @param {*} error 错误信息对象
  19. * @param {*} retry 一个函数,用于指示当 promise 加载器 reject 时,加载器是否应该重试
  20. * @param {*} fail 一个函数,指示加载程序结束退出
  21. * @param {*} attempts 允许的最大重试次数
  22. */
  23. onError(error, retry, fail, attempts) {
  24. if (error.message.match(/fetch/) && attempts <= 3) {
  25. // 请求发生错误时重试,最多可尝试 3 次
  26. retry()
  27. } else {
  28. // 注意,retry/fail 就像 promise 的 resolve/reject 一样:
  29. // 必须调用其中一个才能继续错误处理。
  30. fail()
  31. }
  32. }
  33. })

示例
vue3-component.rar