图 9:2 个 IPC(从浏览器进程到新渲染进程)告知渲染页面并告知旧渲染进程卸载 如果有 Service Worker最近对导航过程的改变是引入了 service worker。service worker 是一种在你的应用代码中编写网络代理的方法;允许 Web 开发者更好地控制本地缓存内容以及何时从网络获取新数据。如果将 service worker 设置为从缓存加载页面,则无需从网络请求数据。
要记住的重要部分是 Service Worker 是在渲染进程中运行的 JavaScript 代码。但是当导航请求进入时,浏览器进程如何知道该站点有 service worker?
图 10:浏览器进程中的网络线程查找 service worker 作用域
当注册一个 service worker 时,保持 service worker 的作用域作为一个引用(你可以在这篇文章 The Service Worker Lifecycle 中阅读更多关于作用域的知识)。当一个导航发生时,网络线程用已注册的 service worker 作用域来检查域名,如果已经为该 URL 注册了一个 service worker,UI 线程会找一个渲染线程来执行 service worker 的代码。service worker 可能从缓存中加载数据,无需从网络请求数据,或者可以从网络请求新资源。
图 11:浏览器中的 UI 线程启动渲染进程来处理 service workers;然后,渲染进程中的工作线程从网络请求数据 导航预加载你可以看到,如果 service worker 最终决定从网络请求数据,则浏览器进程和渲染器进程之间的往返可能会导致延迟。导航预加载是一种通过与 service worker 启动并行加载资源来加速此过程的机制。它用一个头部来标记这些请求,允许服务器决定为这些请求发送不同的内容;例如,只更新数据而不是完整文档。
图 12:浏览器进程中的 UI 线程启动渲染进程以在并行启动网络请求的同时处理 service worker 总结在这篇文章中,我们研究了导航过程中发生了什么,以及你的 Web 应用代码(例如响应头和客户端 JavaScript)如何与浏览器交互。了解浏览器通过网络获取数据的步骤,可以更容易地理解为什么开发导航预加载等 API。在下一篇文章中,我们将深入探讨浏览器如何分析 HTML/CSS/JavaScript 以渲染页面。