从B站出发,用Chrome devTools performance分析页面如何渲染
获取performance数据
打开 Chrome 无痕模式。 关闭所有在 Chrome 无痕模式下启用的拓展(如果有的话)。 在地址栏输入 www.bilibili.com 前,先打开 devTools,选择 performance 面板,点击录制按钮。 在已经录制的情况下,地址栏回车,请求 B 站,大概 10s 后,停止录制。
控制面板 概览面板 网络面板 Web Vitals 线程面板 内存面板 聚合面板
disable javascript samples:启用后会隐藏一些 JS 调用栈的展示。在一些性能较弱的设备例如移动端上,可以开启这项功能。 Network:可以用来模拟各种网络状况。 enableadvanced paint instrumention (slow):启用后 paint 面板会显示与绘制相关事件的更详细的信息。 CPU:可以用来模拟不同的 CPU 性能。
Chrome是如何渲染页面的?
第一个请求
Queueing(排队):浏览器会在一些情况下让请求排队等待,比如这个请求的优先级不高,有更高优先级的请求存在;在使用 HTTP/1.0 或者 HTTP/1.1 时,同域请求最大并发数量为 6 个,此时已经达到了最大值;而上图中的请求是属于最高优先级的第一个请求,即浏览器正在硬盘缓存中分配空间,从图上可以看到有 14.72ms 用于在磁盘缓存中分配空间。 Stalled(停顿):它可能会因为上述排队中的任何原因而停顿。 DNS lookup(DNS 查询):解析这个域名的IP地址。需要注意的是,当我们多次访问同一域名时,这部分不会出现在 timing 中。 Initial connection(初始连接):浏览器建立连接,包括 tcp 三次握手、重试以及协商 SSL。图中的紫色部分,就代表了在初始连接过程中的 SSL 协商部分。 Request sent(发送请求):正在发送请求 Waiting (TTFB) 等待第一字节时间:浏览器在等待第一个响应的字节,TTFB 即 Time To First Byte。这个时间包括一个往返的延迟和服务准备响应的时间之和。 Content Download (内容下载):浏览器正在接收响应,浏览器可以通过网络或者 serviceWorker 来直接接收。这个值是读取响应体的总时间。由于网络不佳或者浏览器正在忙于执行其他工作而延迟了对响应体的读取,读取的时间可能会比预期的要长。
请求其它资源
HTML Parse
分层
拥有层叠上下文属性的元素会被创建成图层
需要被裁剪的地方会被创建为图层
Paint
页面优化关注哪些指标
FCP
@font-face {
font-family: 'Pacifico';
font-style: normal;
font-weight: 400;
src: url(https://fonts.gstatic.com/s/pacifico/v12/FwZY7-Qmy14u9lezJ-6H6MmBp0u-.woff2) format('woff2');
font-display: swap;
}
Time to intercative
页面已经展示了 FCP 事件处理函数已经为大部分可见页面元素进行了注册绑定 页面能够在 50ms 内对用户行为进行反应
Speed Index
Total Block Time
Largest Contentful Paint
<img > <svg> 内嵌的 <image> 元素 使用了封面的<video> 元素 url() 加载的带背景图的元素 包含文本或者其他行内文本元素子元素的块级元素
缓慢的服务器响应速度
js/css 的渲染阻塞
用optimize-css-assets-Webpack-plugin、uglyifyJS之类的 Webpack 插件压缩 css、js 对非必要的 js、css 延迟加载,如非必要 css 用预加载,在触发事件后再去 import xx from 'xxx'。 合适的情况下使用内联 css。
缓慢的资源加载速度 压缩图像 预加载重要资源 压缩文本文件 Gzip、br serviceWorker 进行缓存 客户端渲染 压缩 js 延迟加载未立即使用的 js 尽可能减少polyfill。"targets":">0.25%"
Cumulative Layout Shift
没指定宽高的图片 没有设置宽高的 iframe 没有设置宽高的资源位(顶部 banner、广告等) 前面提到的 无样式文本闪烁(FOUT, 用默认字体替换新字体)/ 不可见文本闪烁(FOIT,获取新字体前的显示不可见文本)。<link rel=preload>和font-display: optional结合使用 动画使用了修改 width、height、top、right、bottom、left 等属性值的方式来实现。应优先使用 css transfrom来实现动画。
往期推荐
一周热点 | 2023.02.08-2023.02.14
顶流开源项目作者全职做开源的“血泪史”:入狱、耗尽积蓄、被网暴……
非WebKit引擎的iOS浏览器即将到来
这里有最新开源资讯、软件更新、技术干货等内容
点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦
往期推荐
一周热点 | 2023.02.08-2023.02.14
顶流开源项目作者全职做开源的“血泪史”:入狱、耗尽积蓄、被网暴……
非WebKit引擎的iOS浏览器即将到来
这里有最新开源资讯、软件更新、技术干货等内容
点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章