浏览器工作原理
前沿
浏览器工作原理是一块非常重要的内容,我们经常看到的 重绘 、重排 或者一些讲解CSS属性的时候,都会用到一些浏览器工作原理的知识来讲解。理论化学习浏览器工作原理,效果不是很大,而且很枯燥,所以这里我们从零开始用 JavaScript 来实现一个浏览器。 通过自己实现一遍简单的浏览器,我们会对浏览器的基本原理有更为深刻的理解。
浏览器基础渲染流程
● 首先浏览器是由5个步骤完成的整体渲染 ● 我们从URL访问一个网页,经过浏览器的解析和渲染后成为了Bitmap ● 最后通过我们的显卡驱动设配出去画面,让我们看到完成的页面 ● 这是一个浏览器的渲染流程 ● 这里我们只实现一个简单的基础流程,但是真正的浏览器还包含了很多功能,比如历史等等
我们主要需要完成的是从 URL 请求到 Bitmap 页面展示的整个流程就可以了。 浏览器流程:
- URL 部分,经过 HTTP 请求,然后解析返回内容,然后提取 HTML 内容
- 得到 HTML 后,我们可以通过文本分析(parse),然后把HTML的文本编程一个 DOM 树
- 这个时候的 DOM 树是光秃秃的,下一步我们进行 CSS 计算(CSS computing),最终把 CSS 挂载在这个 DOM 树上
- 经过计算后,我们就拥有一个有样式的 DOM 树,这个时候我们就可以布局(或者排版)了
- 通过布局计算,每一个 DOM 都会得到一个计算后的盒(当然实际浏览器中是每个CSS都会生成一个盒,但是为了简化这个,我们这里只做到每个 DOM 只生成一个盒即可)
- 最后我们就可以开始渲染(Render),把这个 DOM 树该有背景图的有背景图,该有背景色的有背景色,最后把这些样式画到一张图片上。然后我们可以通过操作系统和硬件驱动提供的API接口,展示出来给用户看了。
有限状态机去处理字符串
因为这个处理字符串是整个的浏览器里面贯穿使用的技巧,如果不会用这个状态机,后面实现和读浏览器实现的代码会非常吃力。所以这里我们先讲讲什么是有限状态机。
● 每一个状态都是一个机器 ○ 每个机器都是互相解耦,强有力的抽象机制 ○ 在每一个机器里,我们可以做计算、存储、输出等 ○ 所有的这些机器接受的输入是一致的 ○ 状态机的每一个机器本身没有状态,如果我们用函数来表达的话,它应该是纯函数(无副作用) ○ 无副作用指的是:不应该再受外部的输入控制,输入是可以的 ● 每一个机器知道下一个状态 ○ 每一个机器都有确定的下一个状态(Moore) ○ 每一个机器根据输入决定下一个状态(Mealy)
JavaScript 中如何实现
Mealy 状态机:
// 每个函数是一个状态 function state (input) { // 函数参数就是输入 // 在函数中,可以自由地编写代码,处理每个状态的逻辑 return next; // 返回值作为下一个状态 } /** ========= 以下是调试 ========= */ while (input) { // 获取输入 state = state(input); // 把状态机的返回值作为下一个状态 }