浏览器工作原理与实践
李兵
前盛大创新院高级研究员
立即订阅
6167 人已学习
课程目录
已完结 42 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 参透了浏览器的工作原理,你就能解决80%的前端难题
免费
宏观视角下的浏览器 (6讲)
01 | Chrome架构:仅仅打开了1个页面,为什么有4个进程?
02 | TCP协议:如何保证页面文件能被完整送达浏览器?
03 | HTTP请求流程:为什么很多站点第二次打开速度会很快?
04 | 导航流程:从输入URL到页面展示,这中间发生了什么?
05 | 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?
06 | 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?
浏览器中的JavaScript执行机制 (5讲)
07 | 变量提升:JavaScript代码是按顺序执行的吗?
08 | 调用栈:为什么JavaScript代码会出现栈溢出?
09 | 块级作用域:var缺陷以及为什么要引入let和const?
10 | 作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?
11 | this:从JavaScript执行上下文的视角讲清楚this
V8工作原理 (3讲)
12 | 栈空间和堆空间:数据是如何存储的?
13 | 垃圾回收:垃圾数据是如何自动回收的?
14 | 编译器和解释器:V8是如何执行一段JavaScript代码的?
浏览器中的页面循环系统 (6讲)
15 | 消息队列和事件循环:页面是怎么“活”起来的?
16 | WebAPI:setTimeout是如何实现的?
17 | WebAPI:XMLHttpRequest是怎么实现的?
18 | 宏任务和微任务:不是所有任务都是一个待遇
19 | Promise:使用Promise,告别回调函数
20 | async/await:使用同步的方式去写异步代码
浏览器中的页面 (8讲)
21 | Chrome开发者工具:利用网络面板做性能分析
22 | DOM树:JavaScript是如何影响DOM树构建的?
23 | 渲染流水线:CSS如何影响首次加载时的白屏时间?
24 | 分层和合成机制:为什么CSS动画比JavaScript高效?
25 | 页面性能:如何系统地优化页面?
26 | 虚拟DOM:虚拟DOM和实际的DOM有何不同?
27 | 渐进式网页应用(PWA):它究竟解决了Web应用的哪些问题?
28 | WebComponent:像搭积木一样构建Web应用
浏览器中的网络 (3讲)
29 | HTTP/1:HTTP性能优化
30|HTTP/2:如何提升网络速度?
31|HTTP/3:甩掉TCP、TLS 的包袱,构建高效网络
浏览器安全 (5讲)
32 | 同源策略:为什么XMLHttpRequest不能跨域请求资源?
33 | 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?
34 | CSRF攻击:陌生链接不要随便点
35 | 安全沙箱:页面和系统之间的隔离墙
36 | HTTPS:让数据传输更安全
结束语 (1讲)
结束语 | 大道至简
课外加餐 (4讲)
加餐一|浏览上下文组:如何计算Chrome中渲染进程的个数?
加餐二|任务调度:有了setTimeOut,为什么还要使用rAF?
加餐三|加载阶段性能:使用Audits来优化Web性能
加餐四|页面性能工具:如何使用Performance?
浏览器工作原理与实践
登录|注册

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

李兵 2019-10-01
在前面几篇文章中,我们分析了页面加载和 DOM 生成,讨论了 JavaScript 和 CSS 是如何影响到 DOM 生成的,还结合渲染流水线来讲解了分层和合成机制,同时在这些文章里面,我们还穿插说明了很多优化页面性能的最佳实践策略。通过这些知识点的学习,相信你已经知道渲染引擎是怎么绘制出帧的,不过之前我们介绍的内容比较零碎、比较散,那么今天我们就来将这些内容系统性地串起来。
那么怎么才能把这些知识点串起来呢?我的思路是从如何系统优化页面速度的角度来切入。
这里我们所谈论的页面优化,其实就是要让页面更快地显示和响应。由于一个页面在它不同的阶段,所侧重的关注点是不一样的,所以如果我们要讨论页面优化,就要分析一个页面生存周期的不同阶段。
通常一个页面有三个阶段:加载阶段、交互阶段和关闭阶段
加载阶段,是指从发出请求到渲染出完整页面的过程,影响到这个阶段的主要因素有网络和 JavaScript 脚本。
交互阶段,主要是从页面加载完成到用户交互的整合过程,影响到这个阶段的主要因素是 JavaScript 脚本。
关闭阶段,主要是用户发出关闭指令后页面所做的一些清理操作。
这里我们需要重点关注加载阶段和交互阶段,因为影响到我们体验的因素主要都在这两个阶段,下面我们就来逐个详细分析下。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《浏览器工作原理与实践》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(22)

  • HB
    为老师点赞,假期不断更

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

    2019-10-01
    1
    10
  • Luke
    我们在进行优化的时候,其中有一条策略就是使用离线dom减少重排与重绘,就是将dom先隐藏再修改,修改完后再显示出来。但是浏览器的渲染策略更倾向于将一个大的任务拆分成多个小的任务进行实时多次的渲染。那么离线dom的这种优化是不是有可能成为一种负优化?将多个渲染任务都集中到一次渲染中,导致页面渲染不够及时,当前帧占用时间过长,页面也会出现卡顿?
    2019-10-10
    1
    4
  • 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
    3
  • GY
    24讲和25讲中的一些疑惑
    24将中说,重排和重绘发生在主线程中,js也发生在渲染主线程中,但重排和重绘不是发生在GUI渲染线程中,js是在js引擎线程中执行吗,获取我对线程理解有误,主线程中还能执行别的线程,线程里面还能执行线程?还有gui渲染线程和js引擎线程的互斥,这应该怎么理解啊?我查了很多资料,没有相关介绍,困扰半个多月了,希望老师看到能回答下。
    2019-10-16
    2
  • 安静
    请问老师:当 JavaScript 标签加上了 sync 或者 defer、CSSlink 属性之前加上了取消阻止显现的标志后,它们就变成了非关键资源了。
    这段里面取消阻止显现标记是什么标记呀
    2019-10-08
    2
  • 阿哲
    加载阶段渲染流水线的配图中,css解析器和v8引擎是不是写反了?
    2019-10-03
    2
    2
  • 柴柴
    老师辛苦!
    2019-10-02
    1
  • vianem
    老师您好,我利用will-change: transform优化css动画,动画只进行了transfrom: translate()平移。在测试该动画是否会被主线程阻塞的时候出了问题:我在控制台输入while (1) {};动画直接卡住了

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

    2019-12-03
  • 昆虫捕手
    老师,强制同步布局是因为是和js任务一起执行,所以多触发了一次布局而消耗性能的? 正常情况下,可能是多个js任务执行完,再触发一次布局?
    2019-11-27
  • bai
    有疑惑,js文件加上defer应该也不能变成非关键资源吧。defer的js的执行时间是domcontentloaded事件之前,此时还没有执行布局和绘制,也就是首屏页面还没有展示。也就是说defer的js还是会执行之后再进行布局和绘制。
    2019-11-21
  • Crack
    想起一个问题,请问浏览器是如何渲染gif的,会引起页面重绘吗

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

    2019-11-13
  • Geek_320111
    这里的RTT和以太网的MTU有什么关系?之前了解到MTU一般默认为1500字节。那一个0.1M的文件要拆分的数据包就不止8个了吧,望老师解答。
    2019-10-29
  • Sunsmile
    老师给详细讲一下Performance可好?感觉性能优化这块,它很重要
    2019-10-21
  • 桃翁
    老师,我感觉应该是 JavaScript 是加上 async 标签吧,你写的是 sync 标签,async(异步)的方式才能达到优化的效果。

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

    2019-10-21
  • stone
    能优化储存结构,尽可能避免小颗粒对象的产生
    老师, 这里的小颗粒对象, 可以举个例子吗?
    2019-10-14
  • 渴望做梦
    老师,如果是因为页面里面要发送多个ajax请求导致的性能问题该如何优化呢?
    2019-10-11
  • Aaaaaaaaaaayou
    14kb应该是tcp的数据包吧
    2019-10-11
  • Mr. Cheng
    Performance面板看着有点晕
    2019-10-09
  • 🍪
    想知道老师的 14kb 怎么算出来的,发送窗口大小乘以 MTU 吗?如果这样的话,应该就不是固定的,很可能在html请求完之后,就变成更大的值了
    2019-10-08
  • 石川
    如何减少关键资源个数那一段,应该是加上 async 或 defer 属性。两者区别是,async 可以在解析 HTML 时并行下载 JS 文件,下载完成之后,暂停 HTML 解析,执行完 JS 再接着解析;而 defer 会并行下载 JS,等 HTML 解析完之后再执行 JS
    2019-10-05
收起评论
22
返回
顶部