700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 前端性能优化的指标和工具

前端性能优化的指标和工具

时间:2023-01-05 13:52:17

相关推荐

前端性能优化的指标和工具

目录

一:性能指标和优化目标

1.1.网络加载性能

1.2.用户交互体验

二:RAIL测量模型

2.1.Response(响应): 处理事件应在在50ms内完成

2.2.Animation(动画): 每10ms产生一帧

2.3.Idle(空闲): 尽可能增加空闲时间

2.4.Load(加载):在5s内完成内容加载并可以交互

2.5.RAIL性能测量工具

三:常用性能测量 APIs

一:性能指标和优化目标

1.1.网络加载性能

通过开发者工具中的Network选项卡最底部可以看总体情况

两根线蓝线:DOM加载完成时间红线:总资源加载完成时间

最后一栏属性Waterfall(瀑布图):直观显示网站资源加载(横向、纵向看),可以鼠标光标悬浮上面查看 优化小点(资源并行加载)

重要参数 Waiting(TTFB)表示资源发出到请求结束真正需要的总时间(能给用户最直观感受)

保存分析network信息:鼠标右键点击空白处save all as HAR with content

Lighthouse选项卡(性能测量工具)满分100分 多测试几次取平均

黄色warning 红色问题比较大 绿色非常好

两个最重要指标:1.First Contentful Paint(第一个内容(文本、图片)出现的时间)

2. Speed Index(速度指数)不需要知道如何计算标准4秒

1.2.用户交互体验

1.交互响应要做到足够快

2.浏览画面要足够的流畅

打开开发者工具 使用快捷键 Ctrl+Shift+P 输入frame

点击最后一项 可以查看当前页面的帧数

3.希望所有的异步请求要足够快(1秒之内把数据返回回来) 如果不行,做压缩,还是不行,先考虑前端交互上的优化(比如加一个loading动画)

二:RAIL测量模型

RAIL是谷歌提出的一个可以量化的标准,让用户的体验成为性能优化的目标

是 Response(响应), Animation(动画), Idle(空闲), 和 Load(加载)的首字母缩写

2.1.Response(响应): 处理事件应在在50ms内完成

为了确保在 100 毫秒内产生可见响应,需要在 50 毫秒内处理用户输入事件。因为除输入处理外,通常还有需要执行其他工作,而且这些工作会占用可接受输入响应的部分可用时间

2.2.Animation(动画): 每10ms产生一帧

为了保证动画能达到1s60帧,每一帧的时间在16ms左右,但浏览器需要用6ms来渲染每一帧

2.3.Idle(空闲): 尽可能增加空闲时间

利用空闲时间完成推迟的工作。例如,尽可能减少预加载数据,以便您的应用快速加载,并利用空闲时间加载剩余数据。

2.4.Load(加载):在5s内完成内容加载并可以交互

当页面加载缓慢时,用户注意力会分散,他们会认为任务已中断。

根据用户的设备和网络能力优化相关的快速加载性能。目前,对于首次加载,在使用速度较慢 3G 连接的中端移动设备上,理想的目标是在5秒或更短的时间内实现可交互。

对于后续加载,理想的目标是在 2 秒内加载页面。

2.5.RAIL性能测量工具

Chrome DevTools :开发调试、性能评测Lighthouse:网站整体质量评估WebPageTest:多测试地点、全面性能报告

关于WebPageTest等三者性能测量工具具体介绍,参考:

使用WebPageTest、Lighthouse和Chrome DevTools评估网站性能_不想学习的打工人的博客-CSDN博客

三:常用性能测量 APIs

性能测量工具都有一些关键的时间节点,比如:TTFB、首屏,这些时间节点是通过浏览器实现特定的API获取的,所以我们也可以通过API来直接获取这些数据

比如,我们想要获取Time to Interactive 可交互时间

// load事件后触发window.addEventListener('load', e => {// Time to Interactive 可交互时间let timing = performance.getEntriesByType('navigation')[0]// 计算 tti = domInteractive - fetchStartlet tti = timing.domInteractive - timing.fetchStartconsole.log('TTI', tti)})

下面是一些常用API的时间计算规则:

// DNS 解析耗时:domainLookupEnd - domainLookupStart// TCP 连接耗时:connectEnd - connectStart// SSL 安全连接耗时:connectEnd - secureConnectionStart// 网络请求耗时 (TTFB):responseStart - requestStart// 数据传输耗时:responseEnd - responseStart// DOM 解析耗时:domInteractive - responseEnd// 资源加载耗时:loadEventStart - domContentLoadedEventEnd// First Byte时间:responseStart - domainLookupStart// 白屏时间:responseEnd - fetchStart// 首次可交互时间:domInteractive - fetchStart// DOM Ready 时间:domContentLoadEventEnd - fetchStart// 页面完全加载时间:loadEventStart - fetchStart// http 头部大小:transferSize - encodedBodySize// 重定向次数:performance.navigation.redirectCount// 重定向耗时:redirectEnd - redirectStart

我们也可以通过performance实时监测对象

// 通过PerformanceObserver得到所有long tasks对象let observer = new PerformanceObserver(list => {for (const entry of list.getEntries()) {console.log(entry)}})observer.observe({ entryTypes: ['longtask'] })

假如你做的是视频网站,如果用户不再看你这个页面了,这时候需要考虑节流,不再进行视频内容的加载(可以在页面上进行 Tab 切换测试)

let vEvent = 'visibilitychange'if (document.webkitHidden !== undefined) {vEvent = 'webkitvisibilitychange'}function visibilityChange() {if (document.hidden || document.webkitHidden) {document.title = 'Web page is hidden'} else {document.title = 'Web page is visible'}}document.addEventListener(vEvent, visibilityChange, false)

如果知道用户当前网络状态,就可以有针对性资源加载。比如用户网络状态不好时使用稍微模糊的图片(去 Network 去控制网络吞吐进行测试)

let connection = navigator.connection || navigator.mozConnectionlet type = connection.effectiveTypefunction updateConnectionStatus() {console.log('connection type changed from' + type + 'to ' + connection.effectiveType)}connection.addEventListener('change', updateConnectionStatus)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。