
浏览器的主要功能总结起来就是一句话:将用户输入的 URL 转变成可视化的图像。
URL 到 DOM 树;DOM 树到可视化图像;url 输入到浏览器,经历过怎样的解析过程?
index.html 被下载下来后是如何被解析和显示在浏览器上的;Trident ( 三叉戟): IE、 360 安全浏览器、 UC 浏览器Gecko( 壁虎) : Mozilla FirefoxPresto(急板乐曲) -> Blink (眨眼): OperaWebkit : Safari、 360 极速浏览器、搜狗高速浏览器、移动端浏览器(Android、 iOS)Webkit -> Blink : Google Chrome, Edge
浏览器的内核相当于汽车的发动机,是最核心的存在,它负责将代码转换成用户眼中的界面。
Browser 进程:
Renderer 进程:
GPU Process:负责 GPU 相关;Plugin Process:负责控制一个网页用到的 Plugin;

HTML 解析器,CSS 解析器,javascript 引擎,布局 layout 模块,绘图模块;
HTML 解析器:解释 HTML 文档的解析器,主要作用是将 HTML 文本解释成 DOM 树;CSS 解析器:它的作用是为 DOM 中的各个元素对象计算出样式信息,为布局提供基础设施;Javascript 引擎:使用 Javascript 代码可以修改网页的内容,也能修改 css 的信息,javascript 引擎能够解释 javascript 代码,并通过 DOM 接口和 CSS 树接口来修改网页内容和样式信息,从而改变渲染的结果layout):在 DOM 创建之后,Webkit 需要将其中的元素对象同样式信息结合起来,计算他们的大小位置等布局信息,形成一个能表达这所有信息的内部表示模型paint):使用图形库将布局计算后的各个网页的节点绘制成图像结果浏览器渲染页面的整个过程:浏览器会从上到下解析文档。

遇见
HTML标记,调用HTML解析器解析为对应的token(一个token就是一个标签文本的序列化)并构建DOM树(就是一块内存,保存着tokens,建立它们之间的关系)

遇见
style/link标记调用解析器处理CSS标记并构建CSS样式树。

当有了
DOM Tree和CSSOM Tree后,就可以两个结合来构建Render Tree了

link 元素不会阻塞 DOM Tree 的构建过程,但是会阻塞 Render Tree 的构建过程
Render Tree 在构建时,需要对应的 CSSOM Tree;Render Tree 和 DOM Tree 并不是一一对应的关系
display 为 none 的元素,压根不会出现在 render tree 中;
color background box-shadow.. (比如修改背景色、文字颜色、边框颜色、样式等)理解回流 reflow :也可以称之为重排
width top position.. (比如 DOM 结构发生改变 / 修改了布局)DOM
DocumentFragment 或者父元素中将要操作的 DOM 操作完成,再一次性的操作;getComputedStyle 获取尺寸、位置等信息;position 的 absolute 或者 fixed

JavaScript 在哪里呢?
HTML 的过程中,遇到了 script 元素是不能继续构建 DOM 树的;JavaScript 代码,并且执行 JavaScript 的脚本;JavaScript 脚本执行结束后,才会继续解析 HTML,构建 DOM 树;JavaScript 的作用之一就是操作 DOM,并且可以修改 DOM;DOM 树构建完成并且渲染再执行 JavaScript,会造成严重的回流和重绘,影响页面的性能;script 元素时,优先下载和执行 JavaScript 代码,再继续构建 DOM 树;Vue、 React),脚本往往比 HTML 页面更“重”,处理时间需要更长;script 元素给我们提供了两个属性(attribute): defer 和 async。defer 属性:告诉浏览器不要等待脚本下载,而继续解析 HTML,构建 DOM Tree。
DOM Tree 的构建过程;
defer 的脚本是可以保持正确的顺序执行的。
defer 可以提高页面的性能,并且推荐放到 head 元素中;defer 仅适用于外部脚本,对于 script 默认内容会被忽略。sync 特性与 defer 有些类似,它也能够让脚本不阻塞页面。async 脚本而阻塞(与 defer 类似);async 脚本不能保证顺序,它是独立下载、独立运行,不会等待其他脚本;
defer 通常用于需要在文档解析后操作 DOM 的 JavaScript 代码,并且对多个 script 文件有顺序要求的;async 通常用于独立的脚本,对其他脚本,甚至 DOM 没有依赖的;