用 defineAsyncComponent 实现高效异步组件加载

defineAsyncComponent 是 Vue 3 提供的一个用于异步加载组件的功能,它允许我们在需要时才去加载某个组件,而不是一开始就把所有组件都加载到页面中。这样可以有效地减少首屏加载时间,尤其是当项目中组件数量庞大时,异步加载组件可以极大提高应用的性能。

1. 由来

在 Vue 2 中,我们使用 Vue.component 来异步加载组件,但这种方式不够灵活,而且代码风格比较混乱。因此在 Vue 3 中,引入了 defineAsyncComponent,提供了一种更清晰、更模块化的异步组件定义方法。

2. 为什么引入?

1、减少首屏加载时间:在大型应用中,初始加载时如果同时加载所有的组件,可能会导致页面首屏加载过慢。异步组件可以按需加载,提升页面加载速度。

2、提升性能:当用户访问到某个特定页面或触发特定操作时再加载相关组件,避免一次性加载所有内容,节省带宽和资源。

3、提升用户体验:使用 defineAsyncComponent 可以配合加载中的 UI 组件,给用户一种流畅的交互体验。

3. 基本使用

Vue 3 中 defineAsyncComponent 是一个函数,用于异步导入组件。它返回一个函数,当组件真正被使用时才去加载该组件。

在模板中使用异步组件:

<template><div><AsyncComponent /></div>
</template><script>
import { defineAsyncComponent } from 'vue';
export default {components: {AsyncComponent: defineAsyncComponent(() => import('./Component.vue')),},
};
</script>

import('./Component.vue') 是动态导入语法,返回一个 Promise,当组件加载成功时解析这个 Promise,组件才会被渲染。 

其还支持更复杂的用法,比如配置加载中组件、错误组件和延迟时间等。

带选项的用法:

const AsyncComponent = defineAsyncComponent({// 工厂函数,返回一个 Promiseloader: () => import('./Component.vue'),// 当异步组件正在加载时要显示的组件loadingComponent: LoadingComponent,// 当加载失败时要显示的组件errorComponent: ErrorComponent,// 延迟显示 loadingComponent,默认是 200 毫秒delay: 300,// 如果加载组件超时,将显示 errorComponent,默认值是 Infinitytimeout: 3000,
});

- loader:这是一个工厂函数,返回一个 Promise。

- loadingComponent:当组件正在加载时,用来展示的占位组件。

- errorComponent:如果组件加载失败(例如网络问题或超时),展示的错误组件。

- delay:如果需要延迟展示 loading 组件,可以设置一个延迟时间(单位为毫秒)。默认延迟是 200 毫秒,避免闪烁问题。

- timeout:如果在指定时间内组件没有加载完毕,就会显示 errorComponent,这里可以设定超时时间。

配合路由懒加载:

const routes = [{path: '/about',component: defineAsyncComponent(() => import('./components/About.vue')),},
];

当用户访问 /about 路径时才会去加载 About.vue 组件。

4. 隐藏点

1、首次渲染时的延迟

默认情况下,异步组件的 loadingComponent 会有一个 200 毫秒的延迟,这个延迟是为了避免在组件加载非常快时,闪烁显示加载组件。如果不想要这个延迟,可以手动设置 delay: 0。

const AsyncComponent = defineAsyncComponent({loader: () => import('./Component.vue'),loadingComponent: LoadingComponent,delay: 0, // 取消默认延迟
});

如果不设置 delay,短时间内加载完成的异步组件不会展示 LoadingComponent,这可能会让我们觉得加载动画不一致。

2、组件缓存与重复加载

- defineAsyncComponent 默认不会缓存已经加载的组件。如果多次切换到同一个异步组件,Vue 会每次重新加载它。要避免这种情况,可以将组件手动缓存到本地或使用类似 Vue Router 的路由缓存。

- 如果在同一个页面内反复使用同一个异步组件,且该组件的加载过程比较耗时,最好将组件缓存,减少不必要的重复加载。

<keep-alive><AsyncComponent />
</keep-alive>

3、异步组件的并发加载

如果异步组件在多个地方被同时加载,Vue 不会自动合并这些请求,导致同一组件被多次加载。这种情况可能会引起性能问题,尤其是在网络较差时。

解决方法:可以手动控制组件的加载,通过 Promise 的 then 和 catch 来缓存加载状态,避免重复加载。

let AsyncComponentPromise;
const AsyncComponent = defineAsyncComponent(() => {if (!AsyncComponentPromise) {AsyncComponentPromise = import('./Component.vue');}return AsyncComponentPromise;
});

4、异步错误处理机制

defineAsyncComponent 提供了 onError 回调,这个回调可以捕获组件加载过程中发生的错误,比如网络问题、模块解析失败等。通过 onError 可以做一些自定义的错误处理,比如重试机制或展示特定的错误信息。

默认情况下异步组件失败时只是简单地显示 errorComponent,但可以通过 onError 实现更复杂的错误恢复或重试机制。

const AsyncComponent = defineAsyncComponent({loader: () => import('./Component.vue'),onError(error, retry, fail, attempts) {if (attempts < 3) {// 尝试重试retry();} else {// 如果超过了重试次数,失败fail();}},
});

5. 使用场景

1、大型单页应用(SPA):当应用包含大量组件时,通过按需加载优化性能。

2、动态加载某些不常用的页面或组件:如管理后台、图表页面等,用户并不总是访问这些页面,可以异步加载以节省初始加载资源。

3、配合路由懒加载:使用 Vue Router 时,通过路由懒加载,实现不同页面组件的异步加载。

6. 注意事项

1、组件路径问题:要确保 import('./Component.vue') 的路径是正确的,否则会抛出模块找不到的错误。

2、超时处理:如果网络较慢,加载超时会显示错误组件,可以根据实际情况调整 timeout。

3、SEO 问题:异步组件的懒加载可能会导致首屏渲染延迟,影响到搜索引擎优化(SEO)。因此对于需要 SEO 的页面,应该避免懒加载关键内容。

4、加载中状态处理:为了用户体验,通常要显示 loadingComponent,并避免加载中的页面闪烁。

一个完整的异步组件例子:

import { defineAsyncComponent } from 'vue';
import LoadingComponent from './LoadingComponent.vue';
import ErrorComponent from './ErrorComponent.vue';const AsyncUserCard = defineAsyncComponent({loader: () => import('./UserCard.vue'),loadingComponent: LoadingComponent,errorComponent: ErrorComponent,delay: 200, // 延迟 200ms 显示 loadingComponenttimeout: 3000, // 3 秒后超时显示 errorComponent
});export default {components: {AsyncUserCard,},
};

总结:

defineAsyncComponent 是 Vue 3 为优化性能和用户体验而提供的一种强大工具,尤其适用于大项目中按需加载组件的需求。通过合理设置 loadingComponent、errorComponent 等选项,可以为用户提供更加流畅的体验,同时减轻首屏加载压力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/427914.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12种常见的华为杯数学建模竞赛matlab代码(建议收藏)

1.使用神经网络模型(向量量子化方法LVQ)解决分类/预测问题 clc;clear;​% 第一类蝗虫的触角和翅膀p1 [1.24, 1.27; 1.36, 1.74; 1.38, 1.64; 1.38, 1.82; 1.38, 1.90; 1.40, 1.70; 1.48, 1.82; 1.54, 1.82; 1.56, 2.08];​% 第二类蝗虫的触角和翅膀p2 [1.14, 1.82;…

小众语言ruby在苹果中的初步应用

前言 感觉Ruby在苹果系统中充当一种脚本语言来使用。 1、直接输入ruby没有反应 2、可显示结果的命令 ruby -e "puts Goodbye, cruel world!" 效果如下图&#xff1a; 说明苹果系统中ruby已经安装完毕&#xff0c;或者就是自带的。 3、编辑运行第一个ruby程序 输入…

阿里云盘bug,个人照片泄露 安当TDE透明加密完美保障数据安全

近期&#xff0c;阿里云盘出现了一个严重的隐私安全事件。用户在创建新相册时&#xff0c;系统意外地加载出了其他用户的照片&#xff0c;这些照片包括自拍、风景照、家人旅游照片等&#xff0c;引发了用户对隐私安全的担忧。阿里云盘官方对此事件迅速作出回应&#xff0c;确认…

ADB 安装教程:如何在 Windows、macOS 和 Linux 上安装 Android Debug Bridge

目录 一、ADB 介绍 二、Windows 系统安装 ADB 1. 下载 ADB 2. 解压文件 3. 验证 ADB 安装 4. 配置环境变量 5. 验证全局 ADB 使用 三、macOS 系统安装 ADB 1. 下载 ADB 2. 解压文件 3. 配置环境变量 4. 验证 ADB 安装 四、Linux 系统安装 ADB 1. 使用包管理器安装…

MySQL高阶1890-2020年最后一次登录

目录 题目 准备数据 分析数据 题目 编写解决方案以获取在 2020 年登录过的所有用户的本年度 最后一次 登录时间。结果集 不 包含 2020 年没有登录过的用户。 返回的结果集可以按 任意顺序 排列。 准备数据 Create table If Not Exists Logins (user_id int, time_stamp …

钉钉 钉钉打卡 钉钉定位 2024 免费试用 保用

打卡助手定位 如图&#xff0c;表示开启成功&#xff0c;软件已定位到钉钉打卡位置。 测试显示&#xff0c;高德地图位置已成功修改。 开启助手定位后&#xff0c;观察效果&#xff0c;打卡按钮由无法打卡变为可打卡状态&#xff0c;照片还显示打卡地点。 伙伴们担心作弊行为会…

《程序猿之设计模式实战 · 观察者模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

摩尔-彭罗斯伪逆(pinv)

摩尔-彭罗斯伪逆是一种矩阵&#xff0c;可在不存在逆矩阵的情况下作为逆矩阵的部分替代。此矩阵常被用于求解没有唯一解或有许多解的线性方程组。 对于任何矩阵 A 来说&#xff0c;伪逆 B 都存在&#xff0c;是唯一的&#xff0c;并且具有与 A’ 相同的维度。如果 A 是方阵且非…

[Linux]自定义shell详解

自定义shell 前言1.命令行提示符&#xff0c;字符串的打印1.1命令行提示符2.命令行字符串 2.0对命令行字符串进行切割2.执行命令3.有趣的小问题完整代码 前言 写之前我们先看看一个完整的shell都包括了什么 $符号前面&#xff08;包括这个符号&#xff09;就是命令行提示符&a…

Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐

在日常文字编辑中&#xff0c;我们经常需要重复使用复制的内容。然而&#xff0c;新内容一旦复制&#xff0c;旧内容就会被覆盖。因此&#xff0c;选择一款易用高效的剪贴板工具成为了许多人的需求。本文整理了一些适用于 macOS 系统的优秀剪贴板增强工具&#xff0c;欢迎大家下…

OJ 旋转图像

题目&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例&#xff1a; 解题规律: 我们以题目中的示例二作为例子&a…

2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件

# 2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件 前提按照之前的步骤打开deepfacelive正确配置并且在窗口已经输出了换脸后的视频&#xff0c;不懂步骤可以移步 https://doc.youyacao.com/88/2225 ## 首先下载obs并配置 https://obsproject.com/ 通过…

Vue: 创建vue项目

目录 一.创建项目 二.项目添加 三.添加成功 一.创建项目 打开本机终端输入npm create vuelatest 二.项目添加 1. 项目名称&#xff1a; Project name: one_vue 2.是否添加TypeScript支持&#xff1a;Add TypeScript? Yes 3.是否添加JSX支持&#xff1a;Add JSX Suppor…

英飞凌 PSoC6 评估板 CAPSENSE 触摸滑条应用示例

PSoC™ 62 with CAPSENSE™ evaluation kit 开发板&#xff08;以下简称 PSoC 6 RTT 开发板&#xff09;是英飞凌&#xff08;Infineon&#xff09;联合 RT-Thread 发布一款面向物联网开发者的 32 位双核 MCU 开发套件&#xff0c;其默认内置 RT-Thread 物联网操作系统。本文主…

《网络协议 - HTTP传输协议及状态码解析》

文章目录 一、HTTP协议结构图二、HTTP状态码解读1xx: 信息响应类2xx: 成功响应类3xx: 重定向类4xx: 客户端错误类5xx: 服务器错误类 一、HTTP协议结构图 二、HTTP状态码解读 HTTP状态码&#xff08;英语&#xff1a;HTTP Status Code&#xff09;是用以表示网页服务器超文本传…

java通过org.eclipse.milo实现OPCUA客户端进行连接和订阅

前言 之前写过一篇关于MQTT的方式进行物理访问的文章&#xff1a;SpringBoot集成MQTT&#xff0c;WebSocket返回前端信息_springboot mqtt websocket-CSDN博客 最近又接触到OPCUA协议&#xff0c;想通过java试试看能不能实现。 软件 在使用java实现之前&#xff0c;想着有没…

品牌力是什么?如何评估企业品牌影响力?

品牌影响力&#xff0c;其实就是指品牌在消费者心智中所占据的位置&#xff0c;以及它对消费者购买决策和行为的影响力。如果一个企业的品牌影响力越强&#xff0c;它在消费者心中的印象就越深刻&#xff0c;能够更有效地驱动消费者的购买行为&#xff0c;形成品牌忠诚度&#…

2024.9.20营养小题【2】(动态分配二维数组)

这道题里边涉及到了动态分配二维数组的知识点&#xff0c;不刷这道题我也不知道这个知识点&#xff0c;算是一个比较进阶一点的知识点了。 参考&#xff1a;C语言程序设计_动态分配二维数组_哔哩哔哩_bilibili【C/C 数据结构 】二维数组结构解析 - 知乎 (zhihu.com)

JSONC:为JSON注入注释的力量

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;广泛应用于Web开发、配置文件和数据存储等领域。 其简洁的语法和易于解析的特点&#xff0c;使得JSON成为了现代编程中不可或缺的一部分。然而&#xff0c;JSON的一个显著缺点是…

迁移学习+多模态融合,小白轻松发一区!创新性拉满!

多模态研究如今愈发火热&#xff0c;已成为各大顶级会议的投稿热门。今天&#xff0c;我为大家提供一个多模态的创新思路&#xff1a;迁移学习与多模态融合。 迁移学习多模态融合方向的优势 1.提升模型性能&#xff1a;综合更多维度优势&#xff0c;跨模态互补 2.快速适应新…