vue3 懒加载

vue2 实现懒加载

components:{ 'child': ()=>import('./child.vue') }

而 vue3 实现懒加载需要借助 defineAsyncComponent


components:{
'child': defineAsyncComponent(()=>import('./child.vue'))
}

Vue3 引入defineAsyncComponent 辅助函数的原因

现在,在 Vue 3 中,由于函数组件被定义为纯函数,异步组件定义需要通过将其包装在一个新的 defineAsyncComponent helper 中来显式定义。

更高级语法:

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

魔法注释

在组件懒加载的箭头函数前加注释可以指定打包的名字,并且分开打包

https://juejin.cn/post/7016890750193369101#comment

异步组件

<template>
<div>
<!--`<suspense>` 组件有两个插槽。它们都只接收一个直接子节点。`default` 插槽里的节点会尽可能展示出来。如果不能,则展示 `fallback` 插槽里的节点。-->
<Suspense>
<template #default>
<!--这里的内容可能会带有异步请求或者产生异步任务-->
<AsyncChild />
</template>
<template #fallback>
<!--这里的内容会在#default内容加载的过程中进行渲染,并显示-->
<div>data Info Loading...</div>
</template>
</Suspense>
</div>
</template>

参考 vue3 官网 suspense

Suspense | Vue.js (vuejs.org)

Vue3 新特性 Teleport Suspense 实现原理 - 掘金 (juejin.cn)

事件

<Suspense> 组件会触发三个事件:pendingresolvefallbackpending 事件是在进入挂起状态时触发。resolve 事件是在 default 插槽完成获取新内容时触发。fallback 事件则是在 fallback 插槽的内容显示时触发。

例如,可以使用这些事件在加载新组件时在之前的 DOM 最上层显示一个加载指示器。

tips:

  1. Vue Router 使用动态导入对懒加载组件进行了内置支持。这些与异步组件不同,目前他们不会触发 <Suspense>。但是,它们仍然可以有异步组件作为后代,这些组件可以照常触发 <Suspense>
  2. 异步组件默认就是“suspensible”的。这意味着如果组件关系链上有一个 <Suspense>,那么这个异步组件就会被当作这个 <Suspense> 的一个异步依赖。在这种情况下,加载状态是由 <Suspense> 控制,而该组件自己的加载、报错、延时和超时等选项都将被忽略。
  3. 异步组件也可以通过在选项中指定 suspensible: false 表明不用 Suspense 控制,并让组件始终自己控制其加载状态。