You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<!DOCTYPE html><html><head><title>Critical Path: Measure Inlined</title><metaname="viewport" content="width=device-width,initial-scale=1"><style>
p { font-weight: bold }
span { color: red }
p span { display: none }
img { float: right }
</style></head><body><p>Hello <span>web performance</span> students!</p><div><imgsrc="awesome-photo.jpg"></div><script>varspan=document.getElementsByTagName('span')[0];span.textContent='interactive';// change DOM text contentspan.style.display='inline';// change CSSOM property// create a new element, style it, and append it to the DOMvarloadTime=document.createElement('div');loadTime.textContent='You loaded this page on: '+newDate();loadTime.style.color='blue';document.body.appendChild(loadTime);</script></body></html>
关键路径渲染优化
原文链接
什么是优化关键路径
好的页面交互,即使是在服务器处理或是资源还未完全返回期间,也应该尽量渲染部分信息给用户,而不是让用户明显感知过长白屏时间,以为页面卡死。例如Google时,在服务器处理搜索时及时渲染局部信息,而后逐步显示完整信息。
白屏 -> 灰屏渲染根节点(body设置了灰色的样式) -> FCP 渲染 body 内有意义的内容,如页头 -> FMP DOM节点增加最陡峭的那个点 -> 用户可交互 -> 资源加载完毕。
关键指标
宗旨:
你不需要去优化你无法测量的东西
。DOMContentLoaded
这段时间。performance.timing
获得。First Paint Time = responseEnd - fetchStart
First ContentfulPaint
Time to Interact = responseEnd - fetchStart
构建对象
浏览器渲染页面需要DOM、CSSOM,所有应该尽快把HTML、CSS给到浏览器。
<meta name="viewport" content="width=device-width,initial-scale=1">
告诉浏览器视口宽度等于设备宽度,初始缩放1:1,去掉这段浏览器会默认窗口980px,导致页面缩放成很小,需要手动放大,很不友好。但页面没做适配或响应式布局设计的话,还不如不加这段,至少用户通过缩放可以看到想看的部位。DOM不能和部分CSSOM组成渲染树
,你不能为了提前渲染而渲染出错误的样式信息给用户,宁愿不做也不能做错。这也就是为什么常听到优化点CSS尽量放在头部尽快加载解析
。CSS会阻塞渲染
打开Chrome 开发工具 performance 分析中可以看到(PS:即使HTML中没有style 或 link 样式标签,浏览器依然有默认样式。)。
优化关键渲染路径就是优化以上过程的总时间。
分析关键路径渲染性能
1、无JS、CSS。链接(PS:以下图片只为举例说明原理,实际数据不一定对的上,包括浏览器更新,实际呈现未必一样。)
查看chrome 开发工具 -> network 。HTML文件很小,获取文件一次网络往返即可,服务器处理和网络传输大约200ms,DOM完全解析没有被阻塞仅仅花费了几毫秒。图片等某些资源并不会阻塞渲染、
DOMContentLoaded
事件,但会影响onLoad
事件 。(T0到T1的时间是网络往返和服务器处理时间)DOMContentLoaded
和onLoad
区别,DOM解析完成之后会调用前者,这时对于JS来说,整个DOM元素都是可交互状态。后者是所有资源包括图片等下载完毕后会调用onLoad
。2、有 JS 和 CSS。链接
DOMContentLoaded
触发时间,和onLoad
很接近了。CSS下载不会阻塞DOM解析,CSS、JS几乎同时下载。JS会阻塞DOM构建,外部脚本且要等待下载执行完后DOM才能继续解析
。常见的优化是把脚本尽量紧邻</body>
。3、内联脚本
虽然减少了网络资源请求,但没有获得太大提升,而且不利于公共代码分享和缓存。CSS样式下载解析完成之前会阻塞内联脚本的执行。
4、同时内联样式和脚本。链接
5、有CSS,无JS
这里再次说明外联样式会阻塞渲染树生成,CSS应该尽早解析生成CSSOM。
6、异步脚本 script
DOMContentLoaded
触发时间明显减少,async
表示脚本不阻塞DOM解析,下载完后安排执行。在这里HTML较轻量,DOM在脚本下载完成之前就解析完毕。等CSS下载解析完成就能合成渲染树了。7、media CSS、async JS
<link href="style.css" rel="stylesheet" media="print">
表示用于打印时渲染的样式。此时浏览器在非打印状态仍然会下载,但不会阻塞渲染树生成。这里由于 HTML DOM树结构较简单解析得比较快,async
脚本也没有阻塞当前DOM构建和渲染。defer async 的区别
只对外联脚本有效
defer
下载时不阻塞HTML
解析成DOM
,下载完成会在DOM解析完毕DOMContentLoaded
事件触发之前执行,并且保证脚本执行顺序。async
下载时不阻塞HTML
解析成DOM
,下载完毕后尽量安排JS执行。意思说执行时间不确定,早下载早执行。如果 HTML 文件复杂在脚本下载完成还未解析完毕,脚本可能会在 DOMContentLoaded 之前执行阻塞DOM构建。
Pre-loading vs Pre-fetching
1、pre-loading
预加载程序不会干等着 JS 执行阻塞 HTML 解析构建 DOM,会另起线程扫描并下载后面的资源。
2、pre-fetching
试题
通过以下执行记录,大家都能知道应用了那种方式吧。
总结
目的:学习HTML从服务器到浏览器后都发生些,知道原理的本质,优化时才能知道瓶颈所在。
优化:减少关键渲染路径资源个数、大小、长度
GZIP
,减少网络传输往返次数和时间。@import
方式引入,@import 只有下载解析后才会去获取样式文件,不能并发下载,影响性能。async
避免下载阻塞渲染,延迟脚本执行。参考
视频课程
分析关键渲染路径性能
w3c performance
预加载
script async defer
Performance Optimization
Inside a super fast CSS engine: Quantum CSS (aka Stylo)
The text was updated successfully, but these errors were encountered: