提到了性能就不得不说下性能指标
核心内容如下:
目标 |
准则 |
|
响应: 在 50 毫秒内处理事件 |
在 100 毫秒内完成由用户输入发起的转换,让用户感觉交互是即时的 |
|
动画: 在 10 毫秒内生成一帧 |
|
|
空闲: 最大限度增加空闲时间 |
最大限度增加空闲时间以提高页面在 50 毫秒内响应用户输入的几率 |
|
加载: 在 5 秒内交付内容并实现可交互 当页面加载缓慢时,用户注意力会分散,他们会认为任务已中断。加载速度快的网站具有更长的平均会话时间、更低的跳出率和更高的广告可见性。 |
|
|
注:
目标是在 100 毫秒内响应输入,那么,为什么我们的预算只有 50 毫秒?这是因为除输入处理外,通常还有需要执行其他工作,而且这些工作会占用可接受输入响应的部分可用时间。如果应用程序在空闲时间以推荐的 50 毫秒区块执行工作,这就意味着,如果输入在这些工作区块之一中发生,它最多可能会排队 50 毫秒。考虑到这一点,假设只有剩余的 50 毫秒可用于实际输入处理才是安全地做法。下图展示了这种影响,图中显示了在空闲任务期间收到的输入如何排队,从而减少可用的处理时间:
空闲任务如何影响输入响应预算
选择开发者工具的 Performance,可以看到左边有三个按钮,一个点击是直接开始录制,第二个是重新加载页面并录制,第三个便是清除。
Network
通过Network可以看出网络请求的详细情况, 可以将鼠标 移动 或 点击 到具体的请求上查看加载时间和加载速度
Frame
通过 Frames 指标可以查看页面每一帧渲染时 CPU 所消耗的时间、持续时间Duration、FPS值的信息
Timings 指标
通过 Timings 指标可以查看在上面列举的一些性能指标的值,如下:
Main 指标
记录渲染进程中主线程的执行记录,点击 Main 可以看到某个任务执行的具体情况,可以分析主线程的 Event Loop,分析每个 Task 的耗时、调用栈等信息
面板中会有很多的 Task,如果是耗时长的 Task,其右上角会标红,这个时候就可以选中标红的 Task,定位到耗时函数,然后针对性去优化。
Main 指标包含了加载过程的三个阶段:
Performance 面板最大的优点就是各种数据信息非常的全,但这也是它最大的缺点,数据信息庞大到需要自行过滤,对于不熟悉的开发者来说,还是需要一定的学习成本的。
相反,Lighthouse 面板中的信息就相对简洁一些,除了检测结果以外,还会提供对应的改进方案,主要检测五个方面的内容:
还提供了对应的诊断结果,建议优化点:
如Performance的优化建议:
可访问性Accessibility
浏览器端的全局对象window上有一个名为 performance 的属性,在浏览器中用于记录页面加载和解析过程中关键时间点的机制,内置了一些前端需要的性能参数。
其中performance.timing 当前页面期间发生的各种事件的性能计时信息,我们可以通过这些时间节点来简单的计算出需要的性能指标数据(每个参数含义详见PerformanceTiming - Web API 接口参考 | MDN),计算方式如下:
const {
domainLookupStart,
domainLookupEnd,
navigationStart,
loadEventEnd,
responseStart,
responseEnd,
connectStart,
connectEnd,
redirectStart,
redirectEnd,
domContentLoadedEventEnd,
domComplete,
} = performance.timing
// DNS 查询时间
DNS = domainLookupEnd - domainLookupStart
// TCP 建立连接时间
TCP = connectEnd - connectStart
// 页面重定向时间
Redirect = redirectEnd - redirectStart
// 首字节到底时间
TTFB = responseStart - navigationStart
// 首次渲染时间
FP = responseStart - navigationStart
// DOM 解析时间
DOM = domComplete - responseEnd
// 首屏时间
LCP = loadEventEnd - navigationStart
Web 指标是Google 开创的一项新计划,旨在为网络质量信号提供统一指导,这些信号对于提供出色的网络用户体验至关重要。
Google 提供了许多性能测量和性能报告工具。一些开发者对这些工具的使用十分在行,而另一些开发者则发现大量的工具和指标令人应接不暇。
我们想了解提供给用户的体验质量,并非需要成为性能专家。 Web 指标计划旨在简化场景,帮助网站专注于最重要的指标,即核心 Web 指标
核心 Web 指标是适用于所有网页的 Web 指标子集,每位网站所有者都应该测量这些指标,并且这些指标还将显示在所有 Google 工具中。每项核心 Web 指标代表用户体验的一个不同方面,能够进行实际测量,并且反映出以用户为中心的关键结果的真实体验。
核心 Web 指标的构成指标会随着时间的推移而发展 。当前针对 2020 年的指标构成侧重于用户体验的三个方面——加载性能、交互性和视觉稳定性——并包括以下指标(及各指标相应的阈值):
为了确保能够在大部分用户的访问期间达成建议目标值,对于上述每项指标,一个良好的测量阈值为页面加载的第 75 个百分位数,且该阈值同时适用于移动和桌面设备。
如果一个页面满足上述全部三项指标建议目标值的第 75 个百分位数,那么评估核心 Web 指标合规性的工具应评判该页面为通过。
可视化性能指标分析中,经常会用到分位统计。比如FCP 8分位的值为1s: 意即80%的用户FCP为1s
测量所有核心 Web 指标,最简单的方法是使用web-vitalsJavaScript 库,这是一个围绕底层网页 API 的小型的、生产就绪的封装器,通过准确匹配每项指标在上方列出的所有 Google 工具中的报告方式来进行指标测量
通过使用web-vitals库,测量每项指标就像调用单个函数一样简单(有关完整用法和API详情,请参阅文档):
import {getCLS, getFID, getLCP} from 'web-vitals';
function sendToAnalytics(metric) {
const body = JSON.stringify(metric);
// Use `navigator.sendBeacon()` if available, falling back to `fetch()`.
(navigator.sendBeacon && navigator.sendBeacon('/analytics', body)) ||
fetch('/analytics', {body, method: 'POST', keepalive: true});
}
getCLS(sendToAnalytics);
getFID(sendToAnalytics);
getLCP(sendToAnalytics);
写了个检测当前网站是否使用preload和prefetch的google插件可以参考下:prefetch-preload-Checker
Layout(回流): 根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小),以下操作会触发回流:
添加或删除可见的DOM元素
元素的位置发生变化
元素的尺寸发生变化(包括外边距、内边框、边框大小、高度和宽度等)
内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代。
页面一开始渲染的时候(这肯定避免不了)
浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)
Painting(重绘): 根据渲染树以及回流得到的几何信息,得到节点的绝对像素。
当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color
设置will-change: transform;
优势
使用css3硬件加速,可以让transform、opacity、filters这些动画不会引起回流重绘
对于动画的其它属性,比如background-color这些,还是会引起回流重绘的,不过它还是可以提升这些动画的性能。
缺点
如果你为太多元素使用css3硬件加速,会导致内存占用较大,会有性能问题。
GPU渲染字体会导致抗锯齿无效,这是因为GPU和CPU的算法不同。因此如果你不在动画结束的时候关闭硬件加速,会产生字体模糊。