浏览器工作原理与实践
李兵
前盛大创新院高级研究员
56402 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
浏览器工作原理与实践
15
15
1.0x
00:00/00:00
登录|注册

25 | 页面性能:如何系统地优化页面?

避免频繁的垃圾回收
合理利用CSS合成动画
避免布局抖动
避免强制同步布局
使用Web Workers
分解长时间执行的函数
避免频繁的垃圾回收
CSS合成动画
布局抖动
强制同步布局
JavaScript脚本执行时间
减少单帧生成时间
使用CDN
压缩资源
使用async或defer属性
内联JavaScript和CSS
请求关键资源需要的RTT
关键资源大小
关键资源个数
降低关键资源的RTT次数
降低关键资源大小
减少关键资源个数
优化方案
影响帧生成速度的因素
优化原则
优化方案
影响页面加载速度的因素
优化原则
交互阶段
加载阶段
页面性能优化

该思维导图由 AI 生成,仅供参考

在前面几篇文章中,我们分析了页面加载和 DOM 生成,讨论了 JavaScript 和 CSS 是如何影响到 DOM 生成的,还结合渲染流水线来讲解了分层和合成机制,同时在这些文章里面,我们还穿插说明了很多优化页面性能的最佳实践策略。通过这些知识点的学习,相信你已经知道渲染引擎是怎么绘制出帧的,不过之前我们介绍的内容比较零碎、比较散,那么今天我们就来将这些内容系统性地串起来。
那么怎么才能把这些知识点串起来呢?我的思路是从如何系统优化页面速度的角度来切入。
这里我们所谈论的页面优化,其实就是要让页面更快地显示和响应由于一个页面在它不同的阶段,所侧重的关注点是不一样的,所以如果我们要讨论页面优化,就要分析一个页面生存周期的不同阶段。
通常一个页面有三个阶段:加载阶段、交互阶段和关闭阶段
加载阶段,是指从发出请求到渲染出完整页面的过程,影响到这个阶段的主要因素有网络和 JavaScript 脚本。
交互阶段,主要是从页面加载完成到用户交互的整合过程,影响到这个阶段的主要因素是 JavaScript 脚本。
关闭阶段,主要是用户发出关闭指令后页面所做的一些清理操作。
这里我们需要重点关注加载阶段和交互阶段,因为影响到我们体验的因素主要都在这两个阶段,下面我们就来逐个详细分析下。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了页面性能优化的系统性方法,从加载阶段和交互阶段两个方面进行了详细分析。在加载阶段,文章提到了影响页面加载速度的关键因素,包括关键资源个数、大小以及请求关键资源所需的往返时延(RTT)。针对这些因素,文章提出了优化方案,如减少关键资源个数、压缩资源大小以及使用CDN来减少RTT时长。在交互阶段,文章强调了渲染帧的速度对交互流畅度的重要性,讨论了通过JavaScript和CSSOM来触发帧生成的过程,并提出了减少JavaScript脚本执行时间的策略,如将一次执行的函数分解为多个任务或采用Web Workers。总的来说,本文通过系统性的分析和优化方案,为读者提供了深入理解和优化页面性能的方法。 在加载阶段,核心的优化原则是:优化关键资源的加载速度,减少关键资源的个数,降低关键资源的RTT次数。在交互阶段,核心的优化原则是:尽量减少一帧的生成时间。可以通过减少单次JavaScript的执行时间、避免强制同步布局、避免布局抖动、尽量采用CSS的合成动画、避免频繁的垃圾回收等方式来减少一帧生成的时长。 文章还提到了避免强制同步布局和布局抖动的重要性,以及合理利用CSS合成动画和避免频繁的垃圾回收的建议。这些优化策略可以帮助开发者更好地优化页面性能,提升用户体验。 总的来说,本文通过深入的技术分析和实用的优化建议,为读者提供了全面的页面性能优化指南,有助于开发者快速了解并应用于实际项目中。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《浏览器工作原理与实践》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(50)

  • 最新
  • 精选
  • HB
    为老师点赞,假期不断更

    作者回复: 争取快点把主干课程写完,然后还要整理几百条留言,来系统地答疑

    2019-10-01
    2
    35
  • vianem
    老师您好,我利用will-change: transform优化css动画,动画只进行了transfrom: translate()平移。在测试该动画是否会被主线程阻塞的时候出了问题:我在控制台输入while (1) {};动画直接卡住了

    作者回复: 我不知道你怎么写的代码,你可以用同样的方式试下这个站点:https://chokcoco.github.io/demo/css3demo/html/index.html

    2019-12-03
  • Crack
    想起一个问题,请问浏览器是如何渲染gif的,会引起页面重绘吗

    作者回复: 不会的,gif是经过专门处理的

    2019-11-13
    2
  • 桃翁
    老师,我感觉应该是 JavaScript 是加上 async 标签吧,你写的是 sync 标签,async(异步)的方式才能达到优化的效果。

    作者回复: 嗯 是写错了,一会改正

    2019-10-21
  • Luke
    我们在进行优化的时候,其中有一条策略就是使用离线dom减少重排与重绘,就是将dom先隐藏再修改,修改完后再显示出来。但是浏览器的渲染策略更倾向于将一个大的任务拆分成多个小的任务进行实时多次的渲染。那么离线dom的这种优化是不是有可能成为一种负优化?将多个渲染任务都集中到一次渲染中,导致页面渲染不够及时,当前帧占用时间过长,页面也会出现卡顿?
    2019-10-10
    4
    24
  • 阿哲
    加载阶段渲染流水线的配图中,css解析器和v8引擎是不是写反了?
    2019-10-03
    11
    19
  • L2
    避免强制同步布局那里,我的疑问是既然需要知道offsetHeight肯定是想要最新的啊! 如果我先获取再执行dom操作,还有什么意义?
    2020-05-08
    8
    14
  • mfist
    加载阶段: 通过分析network中关键资源(html文件 js文件 css文件)的大小,个数,只找到一个可能性能问题:html文件是128kb比较大,网站本身已经开启gzip http2 多个静态资源域名、开启缓存等多个优化手段 交互阶段 新浪首页页面加载完成后,滚动页面查看次屏页面,没有太多的交互,查看performance没有发现太明显的性能问题 今日总结: 一个页面从生命周期的维度主要分为三个阶段:加载阶段、交互阶段、关闭阶段。 1. 加载阶段影响网页首次渲染的关键资源几个指标:个数、大小、RTT(round trip time)。通常一个HTTP的数据包在14kb左右。 2. 交互阶段的优化主要是指渲染进程渲染帧速度。如何让单个帧生成的速度变快呢? * 减少JavaScript脚本执行时间 * 避免强制同步布局,添加 删除dom后计算样式布局是在另外一个任务中执行的,这时候获取样式信息,会将其变成同步任务。 * 避免布局抖动 * 合理利用CSS合成动画(标识 will-change 单独生成一个图层) * 避免频繁的垃圾回收。(尽量避免临时垃圾数据,优化存储结构,避免小颗粒对象产生)
    2019-10-03
    1
    14
  • 安静
    请问老师:当 JavaScript 标签加上了 sync 或者 defer、CSSlink 属性之前加上了取消阻止显现的标志后,它们就变成了非关键资源了。 这段里面取消阻止显现标记是什么标记呀
    2019-10-08
    4
    10
  • Geek_fd81b3
    老师,如果操作dom引起了重拍或重绘,是整个页面从0开始吗,哪些没变化的地方也会重拍重绘吗?比如我把页面最后的元素大小改变了,上面的都没发生变化,这样上面哪些没有变化的也会重拍重绘吗?
    2020-09-09
    4
    6
收起评论
显示
设置
留言
50
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部