Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >构建Vite知识体系-项目性能优化

构建Vite知识体系-项目性能优化

原创
作者头像
泯泷、
发布于 2024-03-17 13:06:19
发布于 2024-03-17 13:06:19
2920
举报

对于项目的加载性能优化而言,常见的优化手段可以分为下面三类:

  1. 网络优化。包括 HTTP2DNS 预解析PreloadPrefetch等手段。
  2. 资源优化。包括构建产物分析资源压缩产物拆包按需加载等优化方式。
  3. 预渲染优化,本文主要介绍服务端渲染(SSR)和静态站点生成(SSG)两种手段。

一、网络优化

1. HTTP2

传统的 HTTP 1.1 存在队头阻塞的问题,同一个 TCP 管道中同一时刻只能处理一个 HTTP 请求,也就是说如果当前请求没有处理完,其它的请求都处于阻塞状态,另外浏览器对于同一域名下的并发请求数量都有限制,比如 Chrome 中只允许 6 个请求并发(这个数量不允许用户配置),也就是说请求数量超过 6 个时,多出来的请求只能排队、等待发送。因此,在 HTTP 1.1 协议中,队头阻塞请求排队问题很容易成为网络层的性能瓶颈。

HTTP 2实现能力:

  • 多路复用。将数据分为多个二进制帧,多个请求和响应的数据帧在同一个 TCP 通道进行传输,解决了之前的队头阻塞问题。
  • Server Push,即服务端推送能力。比如对于一个 html 的请求,通过 HTTP 2 我们可以同时将相应的 js 和 css 资源推送到浏览器,省去了后续请求的开销。

在 Vite 中,可以通过vite-plugin-mkcert在本地 Dev Server 上开启 HTTP2

插件的原理也比较简单,由于 HTTP2 依赖 TLS 握手,插件会帮你自动生成 TLS 证书,然后支持通过 HTTPS 的方式启动,而 Vite 会自动把 HTTPS 服务升级为 HTTP2。

其中有一个特例,即当你使用 Vite 的 proxy 配置时,Vite 会将 HTTP2 降级为 HTTPS,不过这个问题你可以通过vite-plugin-proxy-middleware插件解决。

vite-plugin-mkcert插件仅用于开发阶段,在生产环境中我们会对线上的服务器进行配置,从而开启 HTTP2 的能力,如 Nginx 的 HTTP2 配置

2. DNS 预解析

通过 dns-prefetch 技术将这一过程提前,降低 DNS 解析的延迟时间,具体使用方式如下:

代码语言:html
AI代码解释
复制
<!-- href 为需要预解析的域名 -->
<link rel="dns-prefetch" href="https://fonts.googleapis.com/"> 

一般情况下 dns-prefetch会与preconnect 搭配使用,前者用来解析 DNS,而后者用来会建立与服务器的连接,建立 TCP 通道及进行 TLS 握手,进一步降低请求延迟。使用方式如下所示:

代码语言:html
AI代码解释
复制
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com/">

值得注意的是,对于 preconnect 的 link 标签一般需要加上 crorssorigin(跨域标识),否则对于一些字体资源 preconnect 会失效。

3. Preload/Prefetch

对于一些比较重要的资源,我们可以通过 Preload 方式进行预加载,即在资源使用之前就进行加载,而不是在用到的时候才进行加载,这样可以使资源更早地到达浏览器。具体使用方式如下:

代码语言:html
AI代码解释
复制
<link rel="preload" href="style.css" as="style">
<link rel="preload" href="main.js" as="script">

其中我们一般会声明 hrefas 属性,分别表示资源地址和资源类型。Preload的浏览器兼容性也比较好,目前 90% 以上的浏览器已经支持。

预加载原生模块:

与普通 script 标签不同的是,对于原生 ESM 模块,浏览器提供了modulepreload来进行预加载:

代码语言:html
AI代码解释
复制
<link rel="modulepreload" href="/src/app.js" />

仅有 70% 左右的浏览器支持这个特性,不过在 Vite 中我们可以通过配置一键开启 modulepreload 的 Polyfill,从而在使所有支持原生 ESM 的浏览器(占比 90% 以上)都能使用该特性,配置方式如下:

代码语言:ts
AI代码解释
复制
// vite.config.ts
export default {
  build: {
    polyfillModulePreload: true
  }
}

Prefetch预加载其他页面资源

代码语言:ts
AI代码解释
复制
<link rel="prefetch" href="https://B.com/index.js" as="script">

这样浏览器会在 A 页面加载完毕之后去加载B这个域名下的资源,如果用户跳转到了B页面中,浏览器会直接使用预加载好的资源,从而提升 B 页面的加载速度。而相比 Preload, Prefetch 的浏览器兼容性不太乐观,小于78%

资源优化

1. 产物分析报告

为了能可视化地感知到产物的体积情况,推荐用rollup-plugin-visualizer进行产物分析

2. 资源压缩

有这样几类资源可以被压缩处理: JavaScript 代码CSS 代码图片文件

JavaScript 压缩

在 Vite 生产环境构建的过程中,JavaScript 产物代码会自动进行压缩,相关的配置参数如下:

代码语言:ts
AI代码解释
复制
// vite.config.ts
export default {
  build: {
    // 类型: boolean | 'esbuild' | 'terser'
    // 默认为 `esbuild`
    minify: 'esbuild',
    // 产物目标环境
    target: 'modules',
    // 如果 minify 为 terser,可以通过下面的参数配置具体行为
    // https://terser.org/docs/api-reference#minify-options
    terserOptions: {}
  }
}

Target 也会影响压缩成果,为了达到极致的压缩效果,压缩器一般会根据浏览器的目标,会对代码进行语法层面的转换,比如下面这个例子:

代码语言:ts
AI代码解释
复制
// 业务代码中
info == null ? undefined : info.name

如果你将 target 配置为exnext,也就是最新的 JS 语法,会发现压缩后的代码变成了下面这样:

代码语言:ts
AI代码解释
复制
info?.name

为了线上的稳定性,推荐最好还是将 target 参数设置为ECMA语法的最低版本es2015/es6

CSS 压缩

对于 CSS 代码的压缩,Vite 中的相关配置如下:

代码语言:ts
AI代码解释
复制
// vite.config.ts
export default {
  build: {
    // 设置 CSS 的目标环境
    cssTarget: ''
  }
}

默认情况下 Vite 会使用 Esbuild 对 CSS 代码进行压缩,一般不需要我们对 cssTarget 进行配置。

不过在需要兼容安卓端微信的 webview 时,我们需要将 build.cssTarget 设置为 chrome61,以防止 vite 将 rgba() 颜色转化为 #RGBA 十六进制符号的形式,出现样式问题。

图片压缩

一般使用 vite-plugin-imagemin来进行图片压缩

产物拆包

如果不对产物进行代码分割(或者拆包),全部打包到一个 chunk 中,会产生如下的问题:

  • 首屏加载的代码体积过大,即使是当前页面不需要的代码也会进行加载。
  • 线上缓存复用率极低,改动一行代码即可导致整个 bundle 产物缓存失效。

而 Vite 中内置如下的代码拆包能力:

  • CSS 代码分割,即实现一个 chunk 对应一个 css 文件。
  • 默认有一套拆包策略,将应用的代码和第三方库的代码分别打包成两份产物,并对于动态 import 的模块单独打包成一个 chunk。

当然,我们也可以通过manualChunks参数进行自定义配置

按需加载

在一个完整的 Web 应用中,对于某些模块当前页面可能并不需要,如果浏览器在加载当前页面的同时也需要加载这些不必要的模块,那么可能会带来严重的性能问题。一个比较好的方式是对路由组件进行动态引入,比如在 React 应用中使用 @loadable/component 进行组件异步加载

当然,对于组件内部的逻辑,我们也可以通过动态 import() 的方式来延迟执行,进一步优化首屏的加载性能

预渲染优化

而 SSG 可以在构建阶段生成完整的 HTML 内容,它与 SSR 最大的不同在于 HTML 的生成在构建阶段完成,而不是在服务器的运行时。SSG 同样可以给浏览器完整的 HTML 内容,不依赖于 JS 的加载,可以有效提高页面加载性能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
性能知识点二
之前讲到重排,布局的时候使用flex时,比使用inline-block和float时重排更快,所以在布局时可以优先考虑Flex。
wade
2020/04/23
2730
“非主流”的纯前端性能优化
性能优化一直是前端研究的主要课题之一,因为不仅直接影响用户体验,对于商业性公司,网页性能的优劣更关乎流量变现效率的高低。例如 DoubleClick by Google 发现:
2020labs小助手
2020/09/23
6030
10个前端性能优化实用技能
考虑一个场景,滚动事件中会发起网络请求,但是我们并不希望用户在滚动过程中一直发起请求,而是隔一段时间发起一次,对于这种情况我们就可以使用节流。
王小婷
2020/11/26
4670
http请求过程及性能优化分析
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/75215499
j_bleach
2019/07/02
1.4K0
http请求过程及性能优化分析
什么是 Preload、Prefetch 和 Preconnect?
今天我们将研究一下能显著提升页面性能的方法 —— 资源提示与指令。你也许听说过 preload,prefetch 和 preconnect,可是我们想研究的更深一点,搞清他们之间的区别并且充分的利用它们。它们带来的好处包括允许前端开发人员来优化资源的加载,减少往返路径并且在浏览页面时可以更快的加载到资源。
前端黑板报
2019/12/11
6K0
Resource Hints 知多少
在上篇文章 探究网页资源究竟是如何阻塞浏览器加载的 中介绍到 JS 会阻塞 DOM 的加载,样式会阻塞页面的渲染,外链样式里的自定义字体还会对文字造成闪动给用户带来不好的体验,诸如此类问题还有挺多,那到底该如何解决它们呢?
用户4456933
2021/06/01
1.3K0
Resource Hints 知多少
穷追猛打,阿里二面问了我30分钟从URL输入到渲染...
同样的问题,可以拿来招聘P5也可以是P7,只是深度不同。所以我重新整理了一遍整个流程,本文较长,建议先收藏。
用户9899350
2022/07/29
6310
穷追猛打,阿里二面问了我30分钟从URL输入到渲染...
Web性能优化小结
下载性能 消灭重定向 域名收敛,减少DNS解析 减少文件数量(减少TCP连接数) 压缩文件体积 CDN 客户端缓存 渲染性能 CSS放顶部 JS放底部 心理性能 进度条 有效提示 转“菊花” 移动网络的“空口”信道 TCP 慢启动:不同的应用类型获得的连接资源不公平——下载 vs 网游 Head-of-line blocking HTTP无法多路复用TCP连接(HTTP2可以) 三次握手和四次挥手过程冗余(TCP Fast Open,QUIC) 预解析和预加载 # DNS预解析 <l
linjinhe
2018/06/06
8270
仅需 5 分钟,快速优化 Web 性能的10 个手段
作者:Marc 译者:前端小智 来源:dev 本人已经过原作者制授权翻译。 在这篇文章中,主要介绍10种快速提高网站性能的方法,你只需5分钟内就可以将它应用到你的网站上,废话不多说,让我们进入正题吧
前端小智@大迁世界
2020/10/28
8230
仅需 5 分钟,快速优化 Web 性能的10 个手段
前端性能优化系列 | 加载优化
在浏览器发起网络请求时,并非每个字节都具有相同的优先级,所以,浏览器通常会对所要加载的内容进行推测,将相对重要的信息先呈现给用户。比如浏览器一般会先加载CSS,再去加载JavaScript脚本和图像文件。当然,浏览器的判断并不一定都是准确的,下面就来看看如何影响浏览器对资源加载的优先级。
用户6256742
2024/08/01
2050
前端性能优化系列 | 加载优化
优秀的网站都用了这几个属性
得益于浏览器技术的不断发展,现代网页应用体验已经不断接近原生应用,许多大公司也将原生应用迁移到浏览器,甚至更极端的,放弃原生应用,只提供网页应用。随之而来的,网页应用的代码量在不断增加,如果还像以前的样子,将所有代码放到一两个文件中,势必会影响网页加载和渲染的速度。所以网页应用一般都会利用构建工具,如webpack、gulp和rollup等,将代码按模块、路由或者命名空间进行分割,然后生成一个个比较小的js、css和html文件。但是问题又随之而来了,在如此众多的资源文件中,该如何决定加载的先后顺序和优先级呢?幸运的是,浏览器提供了preload、prefetch、preconnect和prerender等指令用来帮助网页优化资源的加载。这些指令用于<link>标签中,可以用来加载图像、css、js和字体等关键资源。
coder_koala
2021/09/22
6110
京东微信购物首页性能优化实践
一般来说产品是按以下方式进行迭代的,我认为循环的起点应该是「收集用户反馈」,我们对页面的优化依据和目标一个重要来源就是用户的反馈,因此说网页优化我们先从网页监控开始聊起。
前端劝退师
2019/12/26
1.7K0
京东微信购物首页性能优化实践
快速优化 Web 性能的10 个手段
优化网站的性能需要花费大量的时间,并且如果要根据自己的需求进行优化则花费的时间可能更多。
疯狂的技术宅
2020/09/01
2K0
快速优化 Web 性能的10 个手段
prelink
现如今网络越来越快,网页应用也变得越来越受人们欢迎,与此同时,人们对应用响应速度的期望值也越来越高。 怎样提升网站的响应速度,怎样让用户更快的看到想要的内容已经变得越发重要了。 对此,除了开发者们绞尽脑汁优化应用外,浏览器产商们也提供了各种各样方式来帮助开发者预加载资源。
epoos
2022/10/28
6010
Web页面全链路性能优化指南
性能优化不单指优化一个页面的打开速度,在开发环境将一个项目的启动时间缩短使开发体验更好也属于性能优化,大文件上传时为其添加分片上传、断点续传也属于性能优化。在项目开发以及用户使用的过程中,能够让任何一个链路快一点,都可以被叫做性能优化。
唐志远
2022/10/27
1.9K0
Web页面全链路性能优化指南
前端性能优化总结
最近花了一些时间在项目的性能优化上,背后做了很多工作,但是最后依然没有达到自己想要的结果,有些失望,但是还是记录下自己的执着。
前端迷
2020/07/02
1.3K0
有货移动Web端性能优化探索实践
在移动互联网的时代里,对于一个web站点来说,移动端的用户体验尤为重要。现代web站点的设计和开发都是以移动优先作为第一原则,我们也专门为了移动端的web站点做了相应的优化和提升。而网页的打开速度和页面的流畅度,对于用户是否长时间访问至关重要。我们在移动端的站点通过一系列的方法,最终为了快速打开页面展示网页内容,触达用户,同时能流畅的浏览网页。 移动端的硬件条件,网络条件相对于桌面端,会复杂的多,设备类型多样,硬件配置参差不齐,分辨率碎片化,网络状况在移动过程中稳定性,速率都会变化,而对于一个页面到达用户的
用户1263954
2018/04/03
1.3K0
有货移动Web端性能优化探索实践
写在 2021 的前端性能优化指南
当收集浏览器端每个用户核心性能指标时,可通过 web-vitals 收集并通过 sendBeacon 上报到打点系统。
山月
2021/10/27
1.4K0
写在 2021 的前端性能优化指南
前端性能优化
前端性能优化与重绘与回流有关系的原因是:频繁的触发重绘与回流,会导致UI频繁染,最终会导致js变慢,会导致页面性能变差
javascript艺术
2021/05/28
9470
前端性能优化
前端 Web 性能清单
考虑添加 preconnect 或 dns-prefetch 资源提示以建立与重要第三方来源的早期连接。
海拥
2023/05/23
1.2K0
前端 Web 性能清单
相关推荐
性能知识点二
更多 >
LV.3
哔哩哔哩开发工程师
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档