vite首次启动加载慢
背景
随着vue3的到来,vite开始被各大vue3组件库使用,公司开始一个新项目,准备尝试用vite试一波。
问题发现
当把公司新项目移植到vite后,启动非常快,但发现页渲染时间慢了很多

可以看到页面的首屏加载时间是3.34s,页面的渲染完时间是3.37s,下载总大小是8.6MB,发送了119个请求
在看看webpack的渲染时间:

可以看到页面的首屏加载时间是1.05s,页面的渲染完时间是1.21s,下载总大小是3.6MB,发送了32个请求
vite的首屏加载时间是webpack的三倍,下载文件大小是webpack的两倍,请求数量也是三倍。vite开发环境下,模块以原生 esm 的形式被浏览器加载,也就说模块的加载是用es6原生的模块加载机制,没有对代码进行打包压缩处理,所以服务启动很快。那带来的问题就是下载的js文件没有处理的过的源码,那文件大小自然要比webpack处理过的js文件大很多。
因此初步判断因为这个原因导致首屏加载时间相差这么多。得出结论vite是牺牲了页面首次加载时间来达到启动时间快的目的。
峰回路转
于是我去网上寻找有没有好的解决方案,在vite的issue中找到类似的问题:

尤大大也回答了这个问题
这个问题有两个细节:
- 项目启动后浏览器第一次加载才会慢。
- 这个慢是因为加载less的源码,按需编译中加载时间其实是在less的编译上。
看看vite项目第二次加载

可以看到页面的首屏加载时间是1.04s,页面的渲染完时间是1.09s,下载总大小是8.6MB,发送了120个请求
页面的渲染时间和webpack项目的渲染时间差不多,esm 的形式被浏览器加载和请求数量对页面的渲染时间的影响不是主要的,也证实项目启动后浏览器第一次加载多出的时间主要是在编译上。
尤大大在知乎回答中提到:“webpack 的打包模式在项目本身源码模块数量极大 (>1000) 的情况下还是有一点优势的,因为浏览器在处理这个级别的并发请求上会产生阻塞(但通常来说如果你一个路由下模块数到这个级别说明你代码分割/按需加载没做好)。”意思是esm 的形式被浏览器加载和请求数量对页面的渲染时间的影响不是主要的。
分析
浏览器第一次加载时间比较长的文件时间分部:

waterfall性能检测详解详解:
- Queueing 是排队的意思
- Stalled 是阻塞 请求访问该URL的主机是有并发和连接数限制的,必须要等之前的执行才能执行之后的,这段时间的耗时
- DNS Lookup 是指域名解析所耗时间
- Initial connection 初始化连接时间,这里一般是TCP 3次连接握手时间
- SSL https特有,是一种协议
- Request sent 发送请求所消耗的时间
- Waiting 等待响应时间,这里一般是最耗时的
- Content Download 下载内容所需要消耗的时间
加载index.less的时间主要在Waiting阶段,Content Download的时间占比很少。等待响应时间应该就是vite在编译的时间。
我的项目也引用了组件库的less源码,改为引用组件库的css看下渲染时间如何

可以看到页面的首屏加载时间是1.13s,页面的渲染完时间是1.16s,下载总大小是8.4MB,发送了120个请求
渲染速度基本和webpack差不多。
结论
通过上面分析可以确定vite开发模式启动,页面加载慢的原因是less编译导致。
这里反思下,由于对调试工具waterfall性能检测不熟悉导致开始错误的结论,走了一下弯路。有时候我们通过理论推导出来的结论未必正确的,需要实际数据去证实但更需要去证伪。就像吴军老师说的:
“我们每次给出的结论,都存在一种证伪的可能性,我们可以设计出一种方法、一个实验,或者一个场景,去看看我们的结论是不是还是成立,如果成立,我们就维持现有的结论;如果不成立,我们就修改现有结论。这就叫做证伪。
科学是一种做事情的方法,而不是特定的结论。采用科学方法得到的结论,相对来讲,比较经得起时间和现实世界的检验。更重要的是,用科学的方法求知,我们能得到可累加的进步,因为每一次验证的过程都是可以重复,后面的工作也可以基于前面的工作展开。”这句话牢记心中。
vite首次启动加载慢的更多相关文章
- AngularJS进阶(三十九)基于项目实战解析ng启动加载过程
基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...
- Microsoft Corporation 去掉 windows 修改 启动加载 版权
windows 修改 开机界面 boot启动界面 windows 修改 启动加载 版权 windows 系统如何修改开机画面的版权文字“Microsoft Corporation ... ◎Micro ...
- SpringBoot启动加载类ApplicationRunner
SpringBoot启动加载类ApplicationRunner 有时希望项目在启动的时候加载一些系统参数,就要用到ApplicationRunner ApplicationRunner是一个接口,我 ...
- SpringBoot(七)-- 启动加载数据
一.场景 实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求.为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunn ...
- JavaWeb 服务启动时,在后台启动加载一个线程
JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍, ...
- redis启动加载过程、数据持久化
背景 公司一年的部分业务数据放在redis服务器上,但数据量比较大,单纯的string类型数据一年就将近32G,而且是经过压缩后的. 所以我在想能否通过获取string数据的时间改为保存list数据类 ...
- spring boot启动加载项CommandLineRunner
spring boot启动加载项CommandLineRunner 在使用SpringBoot构建项目时,我们通常有一些预先数据的加载.那么SpringBoot提供了一个简单的方式来实现–Comman ...
- Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析
Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...
- Windows机器配置启动加载器的高级选项后,机器出现蓝屏,无法RDP
问题描述: 虚拟机重启后出现蓝屏,需要排查原因 蓝屏界面如下: 排查结果: 1.Console发现机器停留在上述蓝屏界面,按F8后,机器可以正常启动并成功连接:但通过console再次重启后,又会进入 ...
随机推荐
- SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑
前言 最近在做项目的时候,基于前后端分离的权限管理系统,后台使用 Spring Security 作为权限控制管理, 然后在前端接口访问时候涉及到跨域,但我怎么配置跨域也没有生效,这里有一个坑,在使用 ...
- mysql主要的两个索引Innodb和MyIASM。
参考:https://www.cnblogs.com/xiaohaillong/p/6079551.html 1. a.Innodb引擎,Innodb引擎提供了对数据库ACID事务的支持.并且还提供了 ...
- 程序挂了之后别再跟我说让我帮你重启啦! 让supervisor帮你搞定...
目录 有啥用? 安装 生成配置文件 启动supervisor 自定义配置文件 控制命令 求关注啦 有啥用? 很多我们项目排期进入联调.测试阶段,如果QA同学是直接跟你要一个后端环境的话,那简单点大概率 ...
- Python3-sqlalchemy-orm 查询、修改
#-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...
- Mysql常用sql语句(4)- distinct 去重数据
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 我们使用select进行数据查询时是会返回所有匹 ...
- Servlet体系结构
一.使用HttpServlet 其中,HttpServlet在重写的service()方法中对http请求的共7中提交方式进行了判断,所以只要我们只要重写对应的请求方式处理逻辑方法 doGet()和d ...
- 使用easyui为tab页增加右键菜单
在使用easyui进行上左右布局一文中,我们已经使用easyui搭建起了一个简单的上左右布局.在使用的过程中,我们经常会遇到tab页打开的太多,但只能一个一个的关闭的烦恼,这个时候有没有想到eclip ...
- 硕盟 type-c转接头转接口(HDMI+VGA+USB3.0+PD3.0)四合一拓展坞
硕盟SM-T54是一款 TYPE C转HDMI+VGA+USB3.0+PD3.0四合一多功能扩展坞,支持四口同时使用,您可以将含有USB 3.1协议的电脑主机,通过此产品连接到具有HDMI或VGA的显 ...
- Haproxy搭建web集群
目录: 一.常见的web集群调度器 二.Haproxy应用分析 三.Haproxy调度算法原理 四.Haproxy特性 五.Haproxy搭建 Web 群集 一.常见的web集群调度器 目前常见的we ...
- 线程调用BeginInvoke
线程异步调用 Thread objThread = new Thread(new ThreadStart(delegate { Dispatch ...