浏览器工作原理与实践 / 透过浏览器看懂前端本质
李兵
前盛大创新院高级研究员
 
  • 课程目录
  • 课程介绍
  • 开篇词 | 参透了浏览器的工作原理,你就能解决80%的前端难题

    通过这个专栏的学习,让你系统地掌握浏览器工作原理,并把理论应用到前端实践中去。

  • 01 | Chrome架构:仅仅打开了1个页面,为什么有4个进程?

    明明只是打开了1个页面,为什么会启动4个进程呢?这就需要你好好学习浏览器的多进程架构,站在更高的维度去理解Web应用了。

  • 02 | TCP协议:如何保证页面文件能被完整送达浏览器?

    在网络中,文件通常会被拆分为很多数据包来进行传输,但这过程中又会大概率丢失或出错,那么如何保证它能被完整地送达浏览器呢?

  • 03 | HTTP请求流程:为什么很多站点第二次打开速度会很快?

    HTTP是一种允许浏览器向服务器获取资源的协议,是Web的基础,也是浏览器使用最广的协议。

  • 04 | 导航流程:从输入URL到页面展示,这中间发生了什么?

    导航流程很重要,它是网络加载流程和渲染流程之间的一座桥梁。理解了导航流程,你就能完整串起来整个页面的显示流程。

  • 05 | 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?

    渲染阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,也可以解决一系列页面相关的问题。

  • 06 | 渲染流程(下):HTML、CSS和JavaScript,是如何变成页面的?

    经过这一系列的阶段,编写好的HTML、CSS、JavaScript等文件,经过浏览器就会显示出漂亮的页面了。

  • 07 | 变量提升:JavaScript代码是按顺序执行的吗?

    如果你了解JavaScript执行流程,那在编写代码时,就能避开一些陷阱;在分析代码时,也能通过分析执行过程来定位问题。

  • 08 | 调用栈:为什么JavaScript代码会出现栈溢出?

    学习调用栈很重要,它可以让你了解JavaScript引擎背后的工作原理,助你调试代码,并帮你搞定相关的面试。

  • 09 | 块级作用域:var缺陷以及为什么要引入let和const?

    由于JavaScript的变量提升存在着变量覆盖、变量污染等设计缺陷,所以ES6引入了块级作用域关键字来解决这些问题。

  • 10 | 作用域链和闭包 :代码中出现相同的变量,JavaScript引擎是如何选择的?

    理解作用域链是理解闭包的基础,而闭包在JavaScript中几乎无处不在,因此,它们的重要性毋庸置疑。

  • 11 | this:从JavaScript执行上下文的视角讲清楚this

    从严格意义上来讲,this并不是一个很好的设计,因为它的很多使用方法都冲击人的直觉,在使用过程中存在着非常多的坑。

  • 12 | 栈空间和堆空间:数据是如何存储的?

    如果你想成为行业专家,并打造高性能前端应用,那么你就必须要搞清楚JavaScript的内存机制了。

  • 13 | 垃圾回收:垃圾数据是如何自动回收的?

    如果垃圾数据一直保存在内存中,那么内存会越用越多,所以需要对这些垃圾数据进行回收,以释放有限的内存空间。

  • 14 | 编译器和解释器:V8是如何执行一段JavaScript代码的?

    编译器和解释器的相关概念和理论很重要,向上能让你充分理解一些前端应用的本质,向下能打开计算机编译原理的大门。

  • 15 | 消息队列和事件循环:页面是怎么“活”起来的?

    要让不同类型的任务在主线程中有条不紊地执行,就需要一个系统来统筹调度这些任务,这就是本文要讲的消息队列和事件循环系统。

  • 16 | WebAPI:setTimeout是如何实现的?

    setTimeout是一个定时器,用来指定函数在多少毫秒之后执行。那浏览器如何实现定时器?在使用过程中又有哪些注意事项?

  • 17 | WebAPI:XMLHttpRequest是怎么实现的?

    XMLHttpRequest是一个非常典型的WebAPI,通过它来讲解浏览器是如何实现WebAPI的很合适。

  • 18 | 宏任务和微任务:不是所有任务都是一个待遇

    随着浏览器的应用领域越来越广泛,消息队列中粗时间颗粒度的任务已经不能胜任部分领域的需求,所以就出现了微任务。

  • 19 | Promise:使用Promise,告别回调函数

    Promise已经成为现代前端的“水”和“电”,很是关键,所以深入学习Promises势在必行。

  • 20 | async/await:使用同步的方式去写异步代码

    async/await无疑是异步编程领域非常大的一个革新,也是未来的一个主流的编程风格,使得代码逻辑更加清晰美观。

  • 21 | Chrome开发者工具:利用网络面板做性能分析

    页面是浏览器的核心,而Chrome开发者工具又是工程师调试页面的核心工具,所以本文详细介绍下Chrome开发者工具。

  • 22 | DOM树:JavaScript是如何影响DOM树构建的?

    在渲染流水线中,后面的步骤都直接或者间接地依赖于DOM结构,所以本文就继续沿着网络数据流路径来介绍DOM树的相关内容。

  • 23 | 渲染流水线:CSS如何影响首次加载时的白屏时间?

    虽然JavaScript和CSS带来了极大的便利,不过也对页面的渲染带来了很多限制,所以要小心处理这各种资源之间的关系。

  • 24 | 分层和合成机制:为什么CSS动画比JavaScript高效?

    分层和合成机制代表了浏览器最为先进的合成技术,Chrome团队为了做到这一点,做了大量的优化工作。

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

    页面优化,其实就是要让页面更快地显示和响应。本文主要讲解了如何系统优化加载阶段和交互阶段的页面。

  • 26 | 虚拟DOM:虚拟DOM和实际的DOM有何不同?

    虚拟DOM最近非常火,两大著名前端框架React和Vue都使用了它,所以本文就结合浏览器的工作机制对虚拟DOM进行分析。

  • 27 | 渐进式网页应用(PWA):它究竟解决了Web应用的哪些问题?

    PWA采取的是非常一个缓和的渐进式策略,充分发挥Web的优势,渐进式地缩短和本地应用或者小程序的距离。

  • 28 | WebComponent:像搭积木一样构建Web应用

    组件化开发是程序员的刚需,但因DOM和CSSOM都是全局的,所以影响了前端组件化。基于此就出现WebComponent。

  • 29 | HTTP/1:HTTP性能优化

    HTTP是浏览器最重要且使用最多的协议,是互联网的基石。但随着浏览器的发展,HTTP也在持续进化。

  • 30|HTTP/2:如何提升网络速度?

    虽然HTTP/1.1已经做了优化,但依然存在很多性能瓶颈,无法满足日益变化的新需求,所以就有了今天要聊的HTTP/2。

  • 31|HTTP/3:甩掉TCP、TLS 的包袱,构建高效网络

    HTTP/3是基于QUIC协议的,解决了HTTP/2中TCP带来的问题,但因改动了底层协议,所以推广起来面临巨大的挑战。

  • 32 | 同源策略:为什么XMLHttpRequest不能跨域请求资源?

    在没有安全保障的Web世界中,我们是没有隐私的,因此需要安全策略来保障我们的隐私和数据的安全。

  • 33 | 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?

    不过支持页面中的第三方资源引用和CORS也带来了很多安全问题,其中最典型的就是XSS攻击。

  • 34 | CSRF攻击:陌生链接不要随便点

    相信你经常能听到的一句话:“别点那个链接,小心有病毒!”点击一个链接怎么就能染上病毒了呢?

  • 35 | 安全沙箱:页面和系统之间的隔离墙

    在多进程基础上引入安全沙箱后,就可以将操作系统和渲染进程进行隔离,这样即便渲染进程由于漏洞被攻击,也不会影响到操作系统。

  • 36 | HTTPS:让数据传输更安全

    鉴于HTTP的明文传输使得传输过程毫无安全性可言,且制约了网上购物、在线转账等一系列场景应用,于是我们引入了加密方案。

  • 结束语 | 大道至简

    不知不觉中专栏就更新完了,若让我总结写作过程中的一些经验和心得,可用四个词概括:大道至简,学会权衡,懂得舍弃,持续进化。

  • 加餐一|浏览上下文组:如何计算Chrome中渲染进程的个数?

    如果两个标签页都位于同一个浏览上下文组,且属于同一站点,那么这两个标签页会被浏览器分配到同一个渲染进程中。

点击领取,浏览器工作原理知识框架图

浏览器是上网的入口,是互联网的“咽喉”。我们每天的工作、学习和娱乐等都离不开浏览器,各行各业、越来越多的应用也都依赖于此,特别是随着云计算的普及和HTML5技术的快速发展,它的重要性更是与日俱增。

为了能准确评估Web开发项目的可行性,站在更高维度审视页面,以及在快节奏的前端技术迭代中把握住问题的本质,完成前端技能进阶,学习浏览器的工作原理就势在必行了。

特别是前端技术出现了大爆炸式增长,各种新技术层出不穷,为了避免疲于应付,你可以通过学习浏览器的工作原理,掌握前端知识的本源,以不变应万变

李兵,前盛大创新院高级研究员。2008年,基于Chromium和IE发布了第一款双核浏览器(太阳花浏览器),在没有任何宣传的情况下,日活跃用户数达到20多万;而后进入盛大创新院,参与WebOS项目,在团队中负责HTML5特性的实现;再之后,在顺网科技和团队打造了一款给全国网吧使用的“F1浏览器”,日启量达2000万。

算下来,李兵已经深耕浏览器和前端领域十余年,有着丰富的理论和实践经验。为便于你快速对浏览器有个宏观的把控,李兵和极客时间团队专门做了一个小视频“工程师视角下的浏览器是怎样的”:

在这门讲解浏览器工作原理的课程中,李兵会用深入浅出的讲解方式、图文并茂的展现形式,把网络、页面渲染、JavaScript、浏览器安全等知识串联起来,从而让你高质量、高效率地学习这门课程,系统掌握浏览器工作原理,并同时把理论应用到前端实践中去

课程模块

课程共36讲,分为7大模块。

1. 宏观视角下的浏览器

本模块通过Chrome的多进程架构来介绍HTTP请求流程、导航流程和页面的渲染流程,带你从宏观视角建立浏览器的知识体系。

2. 浏览器中的JavaScript执行机制

虽然语法上和C语言很像,但是JavaScript背后的机制却又完全不同,很多人学习JavaScript时经常处于似懂非懂的状态。本模块则是站在浏览器的视角,来分析JavaScript代码的执行过程。如果你能掌握这些执行过程,那么很多诸如闭包、变量提升等疑难问题就会迎刃而解。

3. V8工作原理

继续深入探讨来自Google的JavaScript引擎V8,分析其执行流程,细化讲解JavaScript中数据是如何存储和回收的。通过本模块的学习,你离打造高性能且节约内存的Web应用就更近一步了。

4. 浏览器中的页面事件循环系统

要让不同类型的任务在主线程中有条不紊地执行,这就需要有一个事件循环系统,用来负责接收、调度这些不同的事件。本模块会深入探讨Web页面中的事件循环系统,讲解页面中的微任务和宏任务的实现机制,最后还会介绍一些WebAPI是如何与页面的事件循环系统结合使用的。理解事件循环,能让你从更高维度理解页面是如何运行的,并加深你对页面中异步事件的理解。

5. 浏览器中的页面

页面是浏览器的核心,浏览器中的所有功能点都是服务于页面的。本模块会对页面做全面的介绍,包括构建页面的核心流程、页面性能的分析过程。最后还会介绍一些应用场景,比如流行的前端框架为什么要有虚拟DOM,最近比较火的PWA的工作原理,以及WebComponent。

6. 浏览器中的网络

网络的重要性毋庸置疑,但是很多前端工程师却往往忽视它的存在。本模块通过HTTP/1、HTTP/2和HTTP/3的介绍,让你全面了解浏览器中的网络,并最终让你能向下理解其底层原理、向上理解其应用方向。

7. 浏览器安全

和浏览器打交道的内容都是通过网络进行的,但通常通过网络传输的内容是不被浏览器信任的,所以对于可能存在危险的地方都要重点防护。本模块会通过实例,向你介绍为何会出现各种安全问题,以及如何避免这些安全攻击。

限时福利