本文转自 developers.google.com/ ,原作者为 Mariko Kosaka
阅读后觉得内容非常不错,为了加深记忆和理解,决定翻译一些重要的部分。(虽然掘金里已经有好几篇本文翻译了)
一切从浏览器进程而起
浏览器进程内有3个线程,他们的作用分别是:
1. UI 线程:绘制浏览器的所有按钮、输入框等界面元素,以及处理相关操作。
2. 网络线程:处理网络任务并从互联网获得数据。
3. 存储线程:控制文件的访问以及更多。
一个简单的流程
步骤 1:处理输入
当用户在地址栏输入内容的时候,UI 线程会解析输入的内容以判断这是一个搜索内容还是一个 URL,从而决定是打开默认搜索引擎还是访问 URL。
步骤 2:开始导航
当用户访问的是 URL 时,UI 线程会启动一个网络调用来获取网页内容,它让网络线程发起请求,如果网络线程收到的是重定位301的话,网络线程会返回给 UI 线程,接着 UI 线程重新启动一个网络调用。
步骤 3:读取返回内容
网络线程会读取 header 中的 Content-Type,如果是 HTML 文件的话,下一步就是将数据传给 渲染进程,而如果是 zip 或者其他文件,就会被认作是下载,于是把数据传递给下载管理器。
与此同时,SafeBrowsing 也会检查网站返回的内容是否在谷歌的恶意名单内,如果是的话则会弹出一个警告页面。
另外 CROB(跨域访问阻止)也会在此时检查,以避免跨域的数据被传到渲染进程。
步骤 4:通知渲染进程
当所有检查都完成,网络进程确保已经导航到网站的时候,网络进程通知 UI 进程数据准备完毕,由 UI 进程通知渲染进程来执行页面的渲染。
其实,UI 线程并不会等到网络线程收到返回内容再启动渲染进程,它会主动找到或启动一个渲染进程,以在获得返回内容时就能立刻执行渲染。网络线程请求内容和 UI 线程启动渲染进程是同时进行的。
步骤 5:完成导航
数据和渲染进程都准备好了,此时由浏览器进程向渲染进程发送 IPC,同时建立数据流以让渲染进程可以保持接受 HTML 数据。一旦浏览器进程接受到数据已经提交到渲染进程,导航即结束,此时文档加载阶段开始。
额外的步骤:初始化加载完成
一旦渲染进程完成渲染,它会发送 IPC 给浏览器进程,此时 UI 线程会停止标签的加载旋转。