查看更多学习笔记:GitHub:LoveEmiliaForever
MDN中文官网
性能优良的网站能够提高访问者留存和用户满意度,减少客户端和服务器之间传输的数据量可降低各方的成本
不同的业务目标和用户需求需要不同的性能度量,要提高网站性能,你需要了解用户体验、加载和渲染性能,以及如何将性能度量与业务指标结合起来
懒加载
)交互等待时间
许多特性都会影响性能:延迟、应用程序大小、DOM 节点数量、资源请求数量、JavaScript 性能、CPU 负载等等
重要的是尽量缩短加载和响应时间,并通过增加额外的功能来隐藏延迟
而在此之前,应该要了解一些基础知识:
、
等,它们通常是按序下载DOM
,它是一种树状结构,具体知识在JS学习中有感知性能
是用户对网站速度的感受,它是主观感受,但是非常重要
虽然是主观感受,但是也可以用客观的评价指标来大致说明它
虽然指标不能绝对度量用户性能感知,但是可以作为一种相关提示
首先下载用户将立即与之交互的内容,然后在“后台”下载其余内容
将交互功能与内容分开,并加载初始加载时可见的文本、样式和图像,延迟或懒加载在初始页面加载时未使用或不可见的图像或脚本
图像和视频应以最佳格式、经过压缩和正确尺寸提供,减少其大小
图片或其他资源导致内容下移或跳转到不同位置(例如第三方广告的加载),会让页面感觉仍在加载中,这对感知性能是不利的
如果某些资源的加载速度比其他资源慢,在其他内容已经显示在屏幕上之后才加载这些元素,那么就需要提前规划,在布局中为它们留出空间,以便内容不会跳动或改变大小
从感知性能的角度来看,“字体导入不佳”可能会导致文本在样式化或回退到其他字体时出现闪烁
使回退字体具有相同的大小和粗细,以便在字体加载时页面变化不那么明显
确保可见的可交互元素始终可交互且可响应,如果输入元素可见,用户应能够无延迟与它们交互
当响应时间超过50 毫秒
时,用户会感受到延迟
内容重绘速度慢于16.67 毫秒
,或者重绘间隔不均匀时,会感觉页面卡顿不流畅
在按下按键keydown
时发出内容请求,而不是等待按键弹起keyup
,可以使内容加载的感知时间减少 200 毫秒
向 keyup
事件添加有趣但不引人注目的 200 毫秒动画
,可以再减少 200 毫秒的加载感知
测量性能提供了一个重要的指标,以帮助你评估应用程序、网站或 web 服务的成功程度
它们应以一致的方式收集和测量,并以普通人可以使用和理解的格式进行分析
对于这些指标,有着许多工具能够帮助进行测量,它们分为两大类
像 webpagetest.org(推荐)、PageSpeed Insights 这样的工具可以衡量网站的性能
输入一个 URL,并在几秒钟内获得一份详细的性能报告
性能报告包含有关用户在页面上显示任何内容之前需要等待多长时间、显示页面需要下载多少字节等信息
按F12
打开浏览器开发者工具,能够看到网络选项,使用它即可监视网络情况
同样的,在浏览器开发者工具中还可以监视网站性能
有着各种各样的API可以用来创建自己的性能测量工具
MDN文档-性能API
图片占据了非常多的资源空间,优化它对于提高web性能的效果立竿见影
对于一般网站而言,其带宽的 51% 来自图像,其次是视频占 25%
我们需要考虑流量问题,许多人使用的是有限流量套餐,甚至是按使用量付费,每兆字节都要付费
还需要考虑内存问题,因为许多移动设备的 RAM 有限,优化太差会很卡
虽然图片下载耗时长,但是对感知性能的影响却没有很大,我们先用占位符代替图片
虽然如此,但能更快下载好图片,就应该更快下载好
对于大多数网站来说,最大的改进之一是 延迟加载(懒加载) 可视区域以下的图像
而不是在初始页面加载时,无论访客是否滚动查看,都下载所有这些内容
例如GitHub:lazysizes库就可以帮助实现这个功能
根据不同图像的特点,可以选择最适合的图片格式,可以查看MDN:图像格式指南
SVG格式
的图片,适合于图标,徽标等
它是矢量的,放大缩小不会失真,但是适用范围比较小
可以用在线的一些工具调整SVG图片,如SVGOMG
PNG格式
是比较常见的,它支持透明度,因此比较大,常见有以下三种情况
对于PNG,也有很多的在线工具使用,如ImageOptim、Squoosh
JPEG格式
是不具有透明度的图片格式,但也很广泛使用
其中,有一个叫做渐进式JPEG
的技术,用户先看到的是一个低分辨率的图像版本,随着图像下载而逐渐清晰,而不是图像以全分辨率从上到下加载,或者只有在完全下载后才显示
推荐使用在线工具处理JPEG图片,如在Squoosh里面就有MozJPEG压缩选项
可以看到,图片由1.62MB,直接压缩到了154KB,效果显著
其它还有一些图片的格式,它们在压缩方面更加厉害,但是不是所有浏览器都支持
WebP
:既适用于图像又适用于动图的绝佳选择,非常不错的格式,但是不支持渐进式显示,除了Safari的14以前的浏览器外其它浏览器都支持它AVIF
:高性能和免费的图像格式,性能高于WebP,但只有 Chrome、Opera 和 Firefox 支持JPEG2000
:仅受 Safari 支持,也不支持渐进式显示虽然有这么多图片格式,但是你又不是只能选择一种是不是?
使用响应式图片技术,你的web可以根据情况选择最适合的图片格式进行下载
甚至还有一些帮助你构建响应式图片的在线工具Cloudinary
对于较小的屏幕,应该提供更低分辨率的图像,而对于较大的屏幕则相反
此外,为那些具有高 DPI 屏幕的设备应该提供更高分辨率的图像
这些都是响应式图片
涉及的内容,可以查看MDN:响应式图片
对于图片在高DPI屏幕上,有两个有用的客观事实:
将最重要的图像优先展示给访问者会提供更好的感知性能
通过采用优先级提示(Priority Hints),你可以进一步控制优先级,只需在图像标签中添加 fetchPriority
属性即可
由于图像是异步加载的,并且在第一次绘制后继续加载,如果在加载之前未定义其尺寸,它们可能会导致页面内容重新布局
因此,你需要设置 width
和 height
属性,以便浏览器可以在布局中为它们预留空间
这也是优化感知性能的重要环节
浏览器在实际加载图像之前有一种调整图像大小的机制
![]()
、
或
元素设置了 width
和 height
属性时,它的宽高比会在加载前计算出来,并使用提供的尺寸提供给浏览器![]()
元素,宽高比仅在图片加载时用于保留空间这样做的好处,是可以优化渲染的流程,减少卡顿、尺寸不精确等
对于一般网站来说,25% 的带宽来自视频,所以对视频的优化也很重要
视频也有着许多格式,在web上常见的有WebM
、MPEG-4/H.264
、Ogg/Theora
有着很多本地使用的视频编辑工具都有格式转换功能,也可以查看线上工具如FFmpeg
顺序根据需要,选择最适合的顺序,是低带宽优先?还是高质量优先?
不同的环境和要求下,有着不同的选择
没理由要为了静音的视频传输音轨过去,例如首页动画这类的就不需要音轨
删除音频可以节省 20% 的带宽
而删除音轨的操作,需要在本地的视频编辑软件中进行
预加载属性preload
有三个可用选项:auto|metadata|none
,默认设置是 metadata
none
:在播放开始之前,视频不会被下载metadata
:在页面加载时下载视频的一小部分auto
:自动下载整个视频根据视频资源的重要程度,可以结合使用预加载参数,来构建合理的加载策略
流媒体的视频,视频数据将会像流一样传输,也就是视频一边传输,网站一边播放
由于这个特性,可以动态调整视频的质量,做到这一秒是1080p,下一秒就变成480p
不过,这一技术应该要仔细研究才能使用,应该自己找找有没有更好的讲解资源
JS脚本会显著影响下载时间、渲染性能、CPU 和电池使用
使用JS模块
设计程序整体结构,把大文件拆分为多个小文件,以及把代码分为关键文件和非关键文件,对于优化加载,以及按需导入都很重要
最后,可以进行代码压缩
减少文件大小,再使用Gzip
进一步压缩文件
使用Webpack
这类的构建工具会很方便的完成这些事情
默认情况下,JavaScript 的解析和执行会阻塞渲染
浏览器在遇到 JavaScript 之后,会阻塞解析任何出现在其后的 HTML 代码,直到脚本处理完成
因此,要充分考虑代码的运行时机和运行方式
如果某个脚本非常重要,而且担心加载速度影响性能,那么可以在中加载它(不推荐)
<head>
<script src="main.js">script>
head>
上面的方法会阻塞渲染,更好的方法是使用rel="preload"
来为JS文件创建一个预加载器
<head>
<link rel="preload" href="important-js.js" as="script" />
<link rel="modulepreload" href="important-module.js" />
head>
预加载是异步的,因此不能保障文件是否加载完成,可能你使用它时它还没加载好
应该尽量推迟解析和执行非关键 JavaScript 的时间,直到它真正需要时再加载,以减少阻塞
例如,可以给设置
async
或defer
<head>
<script async src="main.js">script>
head>
或者,可以在HTML
和JS
中动态加载脚本
来动态决定请求脚本的时机import().then(() => {})
来动态引入JS模块浏览器运行脚本时,会按序运行其中的操作任务
任务大部分都在主线程上运行,有一些在Worker上运行,主线程一次只能运行一个任务
一个耗时超过50ms的任务,会让用户感觉到延迟,导致看起来卡卡的
所以,把大任务分解成小任务会让使用体验更好,就像是CPU的时间片一样
具体操作为,使用await
和Promise
来进行异步操作,以让出线程
动画效果如果很多很复杂,那么会明显降低性能,会卡卡的(如:拼多多)
跟踪及处理事件是很耗资源的,特别是当你持续运行一个事件时(如:跟踪鼠标位置)
最好动态删除不再需要的事件监听器,以减少资源浪费
尽可能使用事件委托,当你有一些代码需要在用户与大量子元素中的任何一个进行交互时,可以在它们的父元素上设置事件监听器
break
或continue
Worker
来进行高开销运算WebGPU
进行图像和3D模型操作(但这太底层,比较难掌握)HTML理论上应该要保证快速、易于访问,这两个是基本要求
HTML主要是文本,因此比较快,所以真正影响网页性能有三大点
,会影响性能利用媒体查询
技术,以及响应式设计,可以为不同的设备提供最合适的网页
这样就不会造成资源浪费,一般在图像和视频上使用较多
图片懒加载技术,指图片仅在实际对用户可见时加载
浏览器现今可以使用loading
属性,指示
标签以进行图片懒加载
以及,在设置时,指示
preload
属性的值,以合适的方式加载视频
对于嵌入内容,只有一个建议:不必要就不要使用
此外,同样可以使用
loading
属性,指示进行懒加载
对于JS资源的处理,可以参照上面介绍的JS优化来进行
对于链接到其它资源时资源的获取,可以使用预加载
一般即使用rel="preload"
将转换为预加载器
由于浏览器的运行原理,只有在下载完所有CSS并生成CSSOM后,浏览器才能够绘制画面
因此,优化CSSOM的构建可以提高页面性能
CSS精灵图
:CSS 精灵图 是一种技术,它将你希望在站点上使用的多个小图像(例如图标)放入单个图像文件中,然后使用不同的 background-position 值在不同的位置显示图像的一部分,这可以大大减少获取图像所需的 HTTP 请求数量慎重选择要进行动画处理的属性,某些属性在进行动画处理时会触发回流
、重绘
避免使用下面的属性做动画:
width
、height
、border
和 padding
margin
、top
、bottom
、left
和 right
align-content
、align-items
和 flex
box-shadow
浏览器是很智能的,仅会重绘被更改的区域,因此动画越大开销越多
在使用动画时,transforms
、opacity
、filter
都不会引起回流
或重绘
将动画处理工作转移到主线程之外,并放到设备的 GPU 上进行,也称为合成
这可以通过选择特定类型的动画来实现,浏览器会自动将这些动画发送到 GPU 来处理
transform: translateZ()
和 rotate3d()
position: fixed
will-change
的元素
、
和
will-change
浏览器可能会在元素实际发生变化之前进行优化设置
这类优化可以通过提前完成可能需要的大量工作,提高页面的响应速度
CSS 的will-change
属性向浏览器提示元素预期的变化方式
.element {
will-change: opacity, transform;
}
CSS可以使用媒体查询将样式限定在特定条件下
而浏览器会阻塞渲染直到解析完所有的CSS样式,但不会阻塞不会使用的样式
通过根据媒体查询将 CSS 拆分为多个文件,可以防止在下载未使用的 CSS 时阻塞渲染
字体仅在使用 font-family
属性应用于元素时才会加载,而不是在首次使用 @font-face
规则引用时加载
/* 字体在此处没有加载 */
@font-face {
font-family: "Open Sans";
src: url("OpenSans-Regular-webfont.woff2") format("woff2");
}
h1,
h2,
h3 {
/* 字体实际上在此处加载 */
font-family: "Open Sans";
}
所以,使用 rel="preload"
来提前加载重要的字体可以让字体更快可用
"preload"
href="OpenSans-Regular-webfont.woff2"
as="font"
type="font/woff2"
crossorigin />
如果你知道你将使用特定的字形集(例如,仅用于标题或特定标点符号字符的字形),你可以限制浏览器需要下载的字形数量
这可以通过创建仅包含所需子集的字体文件来实现,这个过程叫做子集化
然后可以使用 @font-face
的 unicode-range
描述符来指定何时使用你的子集字体
@font-face {
font-family: "Open Sans";
src: url("OpenSans-Regular-webfont.woff2") format("woff2");
unicode-range: U+0025-00FF;
}
应用于 @font-face
规则的 font-display
描述符定义了浏览器加载和显示字体文件的方式,使得文字在字体正在加载或加载失败时都能以备用字体显示
代价是出现未样式化文本的闪烁
@font-face {
font-family: someFont;
src: url(/path/to/fonts/someFont.woff) format("woff");
font-weight: 400;
font-style: normal;
font-display: fallback;
}
通过使用 CSS 局限模块中定义的属性,你可以指示浏览器将页面的不同部分隔离开来,并独立地优化它们的渲染
这允许在渲染各个部分时提高性能。例如,你可以指定浏览器在特定容器于视口中可见之前不要渲染它们
contain
属性允许作者精确指定要应用于页面上各个容器的局限类型
这使得浏览器可以针对 DOM 的一部分重新计算布局、样式、绘制、大小或它们的任意组合
article {
contain: content;
}
content-visibility
属性是一个有用的快捷方式,允许作者在一组容器上应用一组强大的局限,并指定浏览器在需要之前不要布局和渲染这些容器
contain-intrinsic-size
也可用,它允许你为容器提供一个占位大小,同时它们受到局限的影响
article {
content-visibility: auto;
contain-intrinsic-size: 1000px;
}
### 使用 CSS 局限进行样式重新计算的优化
通过使用 CSS 局限模块中定义的属性,你可以指示浏览器将页面的不同部分隔离开来,并独立地优化它们的渲染
这允许在渲染各个部分时提高性能。例如,你可以指定浏览器在特定容器于视口中可见之前不要渲染它们
`contain` 属性允许作者精确指定要应用于页面上各个容器的局限类型
这使得浏览器可以针对 DOM 的一部分重新计算布局、样式、绘制、大小或它们的任意组合
```css
article {
contain: content;
}
content-visibility
属性是一个有用的快捷方式,允许作者在一组容器上应用一组强大的局限,并指定浏览器在需要之前不要布局和渲染这些容器
contain-intrinsic-size
也可用,它允许你为容器提供一个占位大小,同时它们受到局限的影响
article {
content-visibility: auto;
contain-intrinsic-size: 1000px;
}
你可能感兴趣的:(MDN前端入门文档,前端,性能优化,学习,笔记)