Vue极致性能优,史上最全指南!!!(持续更新)

关于Vue性能优化这个话题感觉大家一定都不陌生,不管做没做过,肯定是多少听说过的,面试的时候也没被少问

每次面试被问到性能优化,肯定只会照着面试题上的答案背一遍,并且心里默念,别再往下问啦,再问就露馅了,没错,这是我曾经面试被问到如果做性能优化时的一些心路历程

所以,我痛定思痛,决心写一篇关于如何做性能优化相关的文章 (其实是工作中领导要求我优化的)这篇文章应该会持续更新,毕竟优化的方案实在太多,牵扯的内容也太广,不可能一下子全部涵盖,这个标题纯纯标题党,不喜勿喷 手动狗头

首先我说一下我理解的优化分为两点

1.首页渲染时间优化

2.组件内部渲染时间优化

这两者的区别应该通俗易懂吧,
先说说低一点,首页渲染时间优化,就是你的Vue项目启动之后会呈现一段时间的白屏,为什么会有白屏呢,此时打开你的控制台
在这里插入图片描述
会出现类似这种,各种js文件的加载,图片的加载,字体文件的加载等等,Size 就是加载的js文件的大小,Time 就是加载这个文件所用的时长,可以看到最长的时间达到了惊人的31s,可想而之白屏时间也不会太短

那么第一点所说的 首页渲染时间加载,该怎么优化呢,从两方面入手
1.减少首次渲染加载的文件数量
2.减少首次渲染加载文件的体积

思路是不是一下子打开了,只要足够少,足够小,就可以足够快

问题又来了,怎么减少数量,又怎么减少体积呢,依次来,先说如何减少数量
首先要想减少数量,首先得知道这些文件从何而来,在哪能找到这些文件? 答案: main.js
main.js 是vue项目的入口文件,项目的初始化就是根据main.js文件来初始的,所以main.js文件中引入的各种组件库啦,什么路由啦,插件啦,js文件等等,都会在首次渲染加载,所以要想减少数量,就从main.js文件入手
在这里插入图片描述
我这个项目是用的第三方框架集成的,所以引入的这些文件中还进一步引用了别的文件,所以如果又用到第三方框架的类似什么若依啥的可以深入到这些文件内部看看,一直看到最后,不要被表象迷惑

关于如何减少数量应该明白了吧,至于删多少,哪些能删哪些不能删,还要根据项目的具体情况去分析

下面说一下如何减少体积
这个可能比减少数量要复杂一些,大家可能会想,有些js文件也不是自己写的,或者是自己写的,已经不能再删了,我只能说想多了,你删的那些代码对性能造不成多少影响,也不会减少多少体积

这里说的删除体积并非真正的删除,而是拆分
先说一下浏览器首次渲染Vue项目时,通常涉及加载多个资源,包括JavaScript文件、样式表(CSS)、图片等。加载这些资源的过程可能是异步的,也可能是同步的,具体取决于资源的类型和加载方式。

一般来说浏览器会异步加载js文件,取决于 <script> 标签的asyncdefer属性,如果 <script> 没有设置这两种属性,浏览器就会同步加载js文件

这时候可能就会有人出现疑问,自己项目中的js文件好像没有加过这两个标签,难道说我的js文件都是同步加载的吗?

当然不是,现在的Vue项目都是基于Vite创建的,Vite 使用了现代的 ES 模块导入系统,它会异步加载你的模块,以提高性能,所以Vue项目中的 vue.js 文件都是异步加载
(另外多提一嘴 css文件和图片文件加载都是异步的,虽说异步加载不会阻塞HTML解析,但是当你的文件过大时,还是会有影响,所以才会有白屏)

OK,已知上面的信息(异步加载),我们如何减少体积呢,答案:拆分
已知一个js文件 200kb,加载时间需要20s,我们将这个文件拆分成两个100kb大小的文件,就算我们达不到最完美的10s,那也不会有20s这么久,变相的减小了体积

怎么减小呢

build: {// sourcemap: true,manifest: true,brotliSize: false,rollupOptions: {output: {manualChunks: {echarts: ['echarts'],'ant-design-vue': ['ant-design-vue'],vue: ['vue', 'vue-router', 'vuex', 'vue-i18n']}},external: ['@jsplumb/browser-ui']},chunkSizeWarningLimit: 1000},

这是原来vite.js的build的配置,其中的 manualChunks,是rollup打包工具中的拆包api,这里不细讲,在你执行

npm run build

vite会跟你的配置进行打包,其中,然后在你页面渲染的时候会出现一些你没见过的js文件,这些文件就是打包后生成的文件,但是他会将很多文件融合在一起合并成一个js文件,这就导致某个js文件过大,尤其是你的项目中引入了诸多npm插件后

这时候可以利用 manualChunks api 进行拆包,我就提供一个例子,具体怎么拆,要拆哪一个,自行研究,总归现在是方向明确了

manualChunks: {echarts: ['echarts'],'ant-design-vue': ['ant-design-vue'],vue: ['vue', 'vue-router', 'vuex', 'vue-i18n'],'lodash': ['lodash-es'],'library': ['@highlightjs/vue-plugin', '@tinymce/tinymce-vue', 'highlight.js'],'jsplumb': ['jsplumb'],'antv': ['@antv/g2', '@antv/g2plot'],'icon-vue': ['@ant-design/icons-vue'],'icon-svg': ['@ant-design/icons-svg'],'tinymce': ['tinymce'],'axios': ['axios'],'js-pinyin': ['js-pinyin'],'vuedraggable-es': ['vuedraggable-es']}

拆完之后,你会发现首次渲染的时候,加载的文件数量变多了,但是每个文件都变小了,异步加载嘛,同时进行,总归比你加载一个大文件需要的时间短的,不寒碜请添加图片描述
可以对比一下,上面是没拆分的 三个文件,下面是拆分过的,截取了部分,效果还是比较显著的
请添加图片描述
这里还要推荐一个插件 rollup-plugin-visualizer 这个插件可以在你打包之后生成一个 stats.html文件 在你的根目录,通过这个页面你可以看到你的那些插件体积比较大,你可以给他单独拆分,就是下面这张图

在这里插入图片描述
当然,除了拆包,其实很多插件你在初始化的时候用不到,还有一个思路就是,在初始化只加载必需的插件,不用的等用户登录进来再加载等等,不过我还没试过,后续我试了再补充

那么首页渲染如何优化先说到这,后面等有时间我再补充组件内部该如何优化

如果大佬们有更好的优化方案也可以给我留言
未完待续~~

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

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

相关文章

mediapipe+opencv实现保存图像中的人脸,抹去其他信息

mediapipeopencv MediaPipe本身不提供图像处理功能&#xff0c;它主要用于检测和跟踪人脸、手势、姿势等。如果您想要从图像中仅提取人脸主要信息并去除其他信息. # codingutf-8 """project: teatAuthor&#xff1a;念卿 刘file&#xff1a; test.pydate&…

数字化升级,智慧医疗新时代——医院陪诊服务的技术创新

在信息技术飞速发展的今天&#xff0c;医疗服务正迎来数字化升级的新时代。本文将探讨如何通过先进技术的应用&#xff0c;为医院陪诊服务注入更多智慧元素&#xff0c;提升患者和家属的医疗体验。 1. 创新医疗预约系统 # Python代码演示医疗预约系统的简单实现 class Medic…

ZStack Cloud构建青州市中医院核心业务云平台

青州市中医院通过ZStack Cloud云平台构建云基础设施&#xff0c;实现对原有物理机和分布式存储平台的利旧和纳管&#xff0c;有效将HIS&#xff08;医院管理系统&#xff09;、PACS&#xff08;影像系统&#xff09;等核心业务系统进行统一管理&#xff1b;同时&#xff0c;借助…

如何选择 Facebook 代理?

Facebook上从事业务推广、广告或资料推广以及群组的用户需要高质量且可靠的代理。使用代理&#xff0c;用户可以在账号被封锁的情况下访问自己的资料&#xff0c;同时与多人进行即时通信&#xff0c;并能够&#xff1a; 自动发送邀请参加各种活动&#xff1b; 通过特殊的机器人…

OpenCL学习笔记(三)手动编译开发库(win10+mingw64)

前言 有的小伙伴仍然在使用mingw编译器&#xff0c;这时只能重新编译opencl的sdk库。本文档简单记录下win10下&#xff0c;使用mingw11.20编译的过程&#xff0c;有需要的小伙伴可以参考下 一、安装所需软件 1.安装git&#xff0c;教程比较多&#xff0c;不再重复 2.安装cm…

【开发问题】vue的前端和java的后台,用sm4,实现前台加密,后台解密

sm4加密 vue引入的包代码加密解密 javamaven代码运行结果 vue 引入的包 npm install sm-crypto代码加密解密 加密&#xff1a; key &#xff1a;代表着密钥&#xff0c;必须是16 字节的十六进制密钥 password &#xff1a;加密前的密码 sm4Password &#xff1a;代表sm4加密…

丢掉破解版,官方免费了!!!

哈喽&#xff01;大家好。 几天不见&#xff0c;今天给大家带来一款海外的神器&#xff0c;官方宣布完全免费&#xff0c;但仅限于个人与教育用途&#xff0c;切勿商用噢&#xff01; 不要看这个软件名字普普通通&#xff0c;实际上内蕴乾坤&#xff01; 接下来看我给大家炫一…

华为云RDS通用型(x86) vs 鲲鹏(ARM)架构的性能对比

概述 之前&#xff0c;我们对比了阿里云RDS的经济版&#xff08;ARM&#xff09;与x86版的性价比&#xff0c;这次我们来看看华为云的RDS MySQL的“通用型”(x86)与“鲲鹏通用增强型”(ARM)版本的情况如何。 这里依旧选择了用户较为常用的4c16g的规格进行测试&#xff0c;测试…

基于jsp+servlet的图书管理系统

基于jspservlet的图书管理系统演示地址为 图书馆后台管理系统 用户名:mr ,密码:123 图书馆管理系统主要的目的是实现图书馆的信息化管理。图书馆的主要业务就是新书的借阅和归还&#xff0c; 因此系统最核心的功能便是实现图书的借阅和归还。此外&#xff0c;还需要提供图书…

VIT总结

关于transformer、VIT和Swin T的总结 1.transformer 1.1.注意力机制 An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a wei…

MySQL数据库,函数与分组

单行函数&#xff1a; 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以嵌套 参数也可以是一列或一个值 数值函数 基本函数&#xff1a; 注&#xff1a;ROUND(x,y)函数的y是负数时&#xff0c;即往高位进行四舍五入&#xff0c;如-3就是按百位…

Plonky2 = Plonk + FRI

Plonky2由Polygon Zero团队开发&#xff0c;实现了一种快速的递归SNARK&#xff0c;据其团队公开的基准测试&#xff0c;2020年&#xff0c;以太坊第一笔递归证明需要60s生成&#xff0c;而于今Plonky2在 MacBook Pro上生成只需 170 毫秒。 下面将逐步剖析Plonky2。 整体构造 …

acwing-Linux学习笔记

acwing-Linux课上的笔记 acwing-Linux网址 文章目录 1.1常用文件管理命令homework作业测评命令 2.1 简单的介绍tmux与vimvimhomeworktmux教程vim教程homework中的一些操作 3 shell语法概论注释变量默认变量数组expr命令read命令echo命令printf命令test命令与判断符号[]逻辑运算…

Hive HWI 配置

前言 1、下载安装好hive后&#xff0c;发现hive有hwi界面功能&#xff0c;研究下是否可以运行&#xff0c;于是使用hive –service hwi命令启动hwi界面报错。 启动hwi功能 2、访问192.168.126.110:9999/hwi&#xff0c;发现访问错误 一、HWI介绍 HWI&#xff08;Hive Web Int…

借助乔拓云,轻松驾驭小程序开发

在当今数字化时代&#xff0c;微信小程序已经成为企业和个人开展业务、提升用户体验的重要工具。然而&#xff0c;要想成功地开发并运营一个小程序&#xff0c;却不是一件容易的事情。在这个过程中&#xff0c;第三方开发平台的出现为开发者提供了一个便捷、高效、可靠的解决方…

【android开发-22】android中音频和视频用法详解

1&#xff0c;播放音频 MediaPlayer是Android中用于播放音频和视频的类。它提供了许多方法来控制播放&#xff0c;例如播放、暂停、停止、释放等。下面是一个简单的MediaPlayer用法详解和参考代码例子。 首先&#xff0c;确保在布局文件中添加了一个MediaPlayer控件&#xff…

如何进行代码混淆?方法与常见工具介绍

​ 如何进行代码混淆&#xff1f;方法与常见工具介绍 目录 什么是代码混淆&#xff1f; 代码混淆的方法 常见代码混淆工具 什么是代码混淆&#xff1f; 代码混淆是指将计算机程序的代码转换成一种功能上等价&#xff0c;但难于阅读和理解的形式的行为。混淆后的代码很难被…

探究Logistic回归:用数学解释分类问题

文章目录 前言回归和分类Logistic回归线性回归Sigmoid函数把回归变成分类Logistic回归算法的数学推导Sigmoid函数与其他激活函数的比较 Logistic回归实例1. 数据预处理2. 模型定义3. 训练模型4. 结果可视化 结语 前言 当谈论当论及机器学习中的回归和分类问题时&#xff0c;很…

cpu 300% 爆满 内存占用不高 排查

top查询 cpu最高的PID ps -ef | grep PID 查看具体哪一个jar服务 jstack -l PID > ./jstack.log 下载/打印进程的线程栈信息 可以加信息简单分析 或进一步 查看堆内存使用情况 jmap -heap Java进程id jstack.log 信息示例 Full thread dump Java HotSpot(TM) 64-Bit Se…

MQTT 协议入门:轻松上手,快速掌握核心要点

文章目录 什么是 MQTT&#xff1f;MQTT 的工作原理MQTT 客户端MQTT Broker发布-订阅模式主题QoS MQTT 的工作流程开始使用 MQTT&#xff1a;快速教程准备 MQTT Broker准备 MQTT 客户端创建 MQTT 连接通过通配符订阅主题发布 MQTT 消息MQTT 功能演示保留消息Clean Session遗嘱消…