Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

浏览器的工作原理 #4

Open
luoway opened this issue Jun 30, 2023 · 0 comments
Open

浏览器的工作原理 #4

luoway opened this issue Jun 30, 2023 · 0 comments
Labels

Comments

@luoway
Copy link
Owner

luoway commented Jun 30, 2023

导航

加载 web 页面的第一步是导航。
它发生在以下情形:用户通过在地址栏输入一个 URL、点击一个链接、提交表单或者是其他的行为。

DNS 查询

导航的第一步是要去寻找页面资源的位置。
浏览器向域名服务器发起 DNS 查询请求,最终得到一个 IP 地址。第一次请求之后,这个 IP 地址可能会被缓存一段时间。

TCP 握手

一旦获取到服务器 IP 地址,浏览器就会通过 TCP“三次握手”与服务器建立连接。

TLS 协商

为了在 HTTPS 上建立安全连接,另一种握手是必须的。在发送真正的请求内容之前还需要三次往返服务器。

往返次数

经过 8 次往返,浏览器终于可以发出请求。
image

HTTP请求、响应

一旦我们建立了到 web 服务器的连接,浏览器就代表用户发送一个初始的 HTTP GET 请求,对于网站来说,这个请求通常是一个 HTML 文件。
初始请求的响应包含所接收数据的第一个字节。Time to First Byte(TTFB)是导航开始与收到第一个 HTML 数据包之间的时间。

解析

浏览器收到数据的第一块,它就可以开始解析收到的信息。“解析”是浏览器将通过网络接收的数据转换为 DOMCSSOM 的步骤,通过渲染器在屏幕上绘制成页面.

构建 DOM 树

第一步是处理 HTML 标记并构造 DOM 树。
对于 <script> 标签(没有 async 或者 defer 属性)会阻塞渲染并停止 HTML 的解析。

预加载扫描器:
它将在后台检索资源,以便在主 HTML 解析器到达请求的资源时,它们可能已经在运行,或者已经被下载。
等待获取 CSS 不会阻塞 HTML 的解析或者下载,但会阻塞 JavaScript 的解析或者下载。

构建 CSSOM 树

第二步是处理 CSS 并构建 CSSOM 树。
与 HTML 一样,浏览器需要将接收到的 CSS 规则转换为可以使用的内容。因此,它对 CSS 重复了 HTML 到对象的过程。

JavaScript 编译

JavaScript 被解释、编译、解析和执行。
脚本被解析为抽象语法树,并将其传递到解释器中,输出在主线程上执行的字节码。

构建辅助功能树

无障碍对象模型(AOM)类似于 DOM 的语义版本。当 DOM 更新时,浏览器会更新辅助功能树。
在构建 AOM 之前,屏幕阅读器无法访问内容。

渲染

渲染步骤包括样式、布局、绘制、合成。

样式

将 DOM 和 CSSOM 组合成一个渲染树,渲染树从 DOM 树的根开始构建,遍历每个可见节点。

布局

布局是确定呈现树中所有节点的宽度、高度和位置,以及确定页面上每个对象的大小和位置的过程。
第一次确定节点的大小和位置称为布局。随后对节点大小和位置的重新计算称为回流。

绘制

将各个节点绘制到屏幕上。
为了确保平滑滚动和动画,必须让浏览器在 1000/60=16.67 毫秒内完成。

合成

当文档的各个部分以不同的层绘制,相互重叠时,必须进行合成,以确保正确显示内容。

有一些特定的属性和元素可以实例化一个层,包括<video><canvas>,CSS 属性为opacity 、3D transformwill-change的元素。

交互

如果主线程正在解析、编译和执行 JavaScript,则主线程不可用,无法及时(小于 50ms)响应用户交互。

参考资料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant