vite首次启动加载慢

摘要:
得出的结论是,vite牺牲了第一页加载时间以实现快速启动时间的目标。vite项目的第二次加载显示,页面的第一次屏幕加载时间为1.04s,页面的渲染完成时间为1.09s,总下载大小为8.6MB。发送的120个请求的呈现时间与webpack项目的呈现时间相似。esm的形式是由浏览器加载的,请求的数量对页面的渲染时间没有重大影响。还确认了项目启动后浏览器首次加载的额外时间主要在编译中。结论通过以上分析,可以确定vite发展模式开始。页面加载速度慢是由于编译较少造成的。

背景

随着vue3的到来,vite开始被各大vue3组件库使用,公司开始一个新项目,准备尝试用vite试一波。

问题发现

当把公司新项目移植到vite后,启动非常快,但发现页渲染时间慢了很多

vite首次启动加载慢第1张

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

在看看webpack的渲染时间:

vite首次启动加载慢第2张

可以看到页面的首屏加载时间是1.05s,页面的渲染完时间是1.21s,下载总大小是3.6MB,发送了32个请求

vite的首屏加载时间是webpack的三倍,下载文件大小是webpack的两倍,请求数量也是三倍。vite开发环境下,模块以原生 esm 的形式被浏览器加载,也就说模块的加载是用es6原生的模块加载机制,没有对代码进行打包压缩处理,所以服务启动很快。那带来的问题就是下载的js文件没有处理的过的源码,那文件大小自然要比webpack处理过的js文件大很多。

 

因此初步判断因为这个原因导致首屏加载时间相差这么多。得出结论vite是牺牲了页面首次加载时间来达到启动时间快的目的。

峰回路转

于是我去网上寻找有没有好的解决方案,在vite的issue中找到类似的问题:

vite首次启动加载慢第3张

尤大大也回答了这个问题vite首次启动加载慢第4张

这个问题有两个细节:

  1. 项目启动后浏览器第一次加载才会慢。
  2. 这个慢是因为加载less的源码,按需编译中加载时间其实是在less的编译上。

看看vite项目第二次加载

vite首次启动加载慢第5张

可以看到页面的首屏加载时间是1.04s,页面的渲染完时间是1.09s,下载总大小是8.6MB,发送了120个请求

页面的渲染时间和webpack项目的渲染时间差不多,esm 的形式被浏览器加载和请求数量对页面的渲染时间的影响不是主要的,也证实项目启动后浏览器第一次加载多出的时间主要是在编译上。

尤大大在知乎回答中提到:“webpack 的打包模式在项目本身源码模块数量极大 (>1000) 的情况下还是有一点优势的,因为浏览器在处理这个级别的并发请求上会产生阻塞(但通常来说如果你一个路由下模块数到这个级别说明你代码分割/按需加载没做好)。”意思是esm 的形式被浏览器加载和请求数量对页面的渲染时间的影响不是主要的。

分析

浏览器第一次加载时间比较长的文件时间分部:

vite首次启动加载慢第6张

 

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看下渲染时间如何

vite首次启动加载慢第7张

可以看到页面的首屏加载时间是1.13s,页面的渲染完时间是1.16s,下载总大小是8.4MB,发送了120个请求

渲染速度基本和webpack差不多。

结论

通过上面分析可以确定vite开发模式启动,页面加载慢的原因是less编译导致。

这里反思下,由于对调试工具waterfall性能检测不熟悉导致开始错误的结论,走了一下弯路。有时候我们通过理论推导出来的结论未必正确的,需要实际数据去证实但更需要去证伪。就像吴军老师说的:

“我们每次给出的结论,都存在一种证伪的可能性,我们可以设计出一种方法、一个实验,或者一个场景,去看看我们的结论是不是还是成立,如果成立,我们就维持现有的结论;如果不成立,我们就修改现有结论。这就叫做证伪。

科学是一种做事情的方法,而不是特定的结论。采用科学方法得到的结论,相对来讲,比较经得起时间和现实世界的检验。更重要的是,用科学的方法求知,我们能得到可累加的进步,因为每一次验证的过程都是可以重复,后面的工作也可以基于前面的工作展开。”这句话牢记心中。

免责声明:文章转载自《vite首次启动加载慢》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇提高程序运行效率的10个简单方法(转)微信小程序获取unionid与openid下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ES6+转ES5(webpack+babel、指定多个js文件、自动注入)

  接续上篇ES6+转ES5,本篇将使用webpack和babel将多个不同目录下指定的多个ES6+语法的js文件编译为ES5,并将编译后的文件配置注入对应的html文件。   所需环境node、npm、设置淘宝镜像请参考上篇进行安装,地址:https://www.cnblogs.com/puyongsong/p/12036090.html 一、新建项目...

vue对比其他框架

对比其他框架React React 和 Vue 有许多相似之处,它们都有: 使用 Virtual DOM 提供了响应式(Reactive)和组件化(Composable)的视图组件。 将注意力集中保持在核心库,伴随于此,有配套的路由和负责处理全局状态管理的库。 性能简介 Vue 的性能是优于 React 的。如果你对此表示怀疑,请继续阅读。我们会解释为...

webpack性能优化-code split

代码分割: 1. 可以把一个大的入口文件 分割 成 多个入口文件,实现并行加载,从而速度更快 2.可以设置成按需加载,比如单页面开发,整个页面非常庞大,所以要根据路由拆分成多个文件,实现按需加载(拆分文件需要用到webpack拆分) 在 webpack 中可以定义多入口,将不同的入口文件打包为不同的 chunk    单入口---->只引入一个...

vue cli 3

介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 通过 @vue/cli 搭建交互式的项目脚手架。 通过 @vue/cli + @vue/cli-service-global 快速开始零配置原型开发。 一个运行时依赖 (@vue/cli-service) 一个开发环境依赖,局部安装在每个 @vue/cli 创建的项目中。 可升...

Element UI 框架搭建

Element UI 框架搭建 1、webpack 全局安装 1 npm install -g webpack 2、淘宝镜像cnpm安装 1 npm install -g cnpm --registry=https://registry.npm.taobao.org 3、vue脚手架全局安装 -- 用于生成vue模板 1 npm instal...

第四节:Webpack本地服务器搭建、剖析devServer的HRM热替换和其它配置、resolve模块解析、区分开发/生产环境方案实战

一. webpack本地服务器搭建 1. 为什么要搭建本地服务器?  我们之前通过【npm run build】,编译相关的代码; 然后需要在浏览器中运行,每次修改修改代码,都需要重新编译运行,很麻烦。我们希望可以做到,当文件发生变化时,可以自动的完成 编译 和 展示 。 2. watch mode模式 (1). 简介   在该模式下,webpack依赖图...