深入现代浏览器(第二部分)【chrome 浏览器导航】

导航发生了什么

这是四篇博客的第二篇, 来看看Chrome内部如何工作的. 在上一篇文章中, 我们了解到不同的进程和线程控制着浏览器的不同部分. 在这篇文章中, 我们会对于每一个线程和进程在渲染网站的时候的通信方式, 挖掘的更深.

让我们看一个简单的使用浏览器的案例: 你输入一个URL地址到浏览器中, 然后浏览器从网络上取回数据, 展示到页面上. 这篇文章中, 重点放到: 用户请求一个网站, 浏览器准备渲染页面, 也就是众所周知的导航.

通过浏览器进程开始

在这里插入图片描述

图1: 上面浏览器的界面, 下图表示浏览器进程中的UI线程, 网络线程存储线程都包含在浏览器进程中.

我们在第一篇文章中总结了, CPU, GPU, 内存和多进程架构, 所有tab页之外的一切都被浏览器进程控制. 浏览器进程有许多的线程, 比如:

  • UI线程: 负责描绘按钮以及浏览器中字段的输入,
  • 网络线程: 从互联网中通过使用网络堆栈接受数据,
  • 存储线程: 控制文件的访问或者更多. 当你输入URL到地址栏中的时候,你的输入操作就是由UI线程所控制的.

一个简单的导航

第一步: 正在输入

当一个用户开始往地址栏中输入的时候, 第一个UI线程的询问是: “这是一个搜索匹配, 还是URL?”. 在Chrome中, 地址栏也是搜索输入框, 所以UI线程需要通过匹配确认, 是将内容发送给搜索引擎, 还是访问你请求的站点.

在这里插入图片描述
图1: UI线程判断输入的是搜索内容还是URL.

第二步: 开始导航

当一个用户按下Enter键, UI线程初始化一个网络方法来获取站点内容. 加载标志展示在tab的角落, 网络线程通过适当的协议, 例如DNS解析和为请求建立TLS链接.
在这里插入图片描述
图2: UI线程通知网络线程导航到mysite.com

在这点上, 网络线程可能会接受一个服务重定向的头部, 例如HTTP 301. 在这个案例中, 网络线程UI线程通信的结果是请求重定向, 然后, 另个一URL会被初始化.

第三步: 读取响应内容

在这里插入图片描述

图3: 响应的头部确定了类型, 并且payload是真正的数据. 一旦响应体(有效载荷)开始进入, 网络线程就会在必要的时候, 查看流的前几个字节.响应中的Content Type展示了数据的类型, 但那可能已经丢失或者是错误的, MINI Type介绍介绍在这里. 正如源码中评论的那样, 这是一项棘手的任务. 你可以通过阅读评论发现不同的浏览器线程如何处理内容类型和负载对.

如果响应的内容是一个HTML文件, 然后下一步应该是解析数据到渲染引擎, 但如果这是一个zip文件, 或者一些其他的文件, 那就意味着这是一个下载请求, 所以他们需要解析数据到下载管理.
在这里插入图片描述
图4: 如果响应的是一个HTML数据, 网络线程会确认是否来自安全站点.

这也就是进行安全浏览检查的地方. 如果主域名和响应的数据似乎已匹配到了恶意站点, 然后网络线程会提醒展示一个危险页面. 此外, Cross Origin Read Blocking(CORB)检查为了确保敏感的跨站点数据不会进入到渲染进程中.

第三步: 发现一个渲染进程

一旦所有的检查都完成了, 网络线程变信任浏览器跳转到请求的站点, 然后网络线程告诉UI线程数据已经准备好了, UI线程找到一个渲染进程进行web页面的渲染.
在这里插入图片描述
图5: 网络线程告诉UI线程寻找渲染进程

因为网络请求需要几百毫秒才能得到响应, 这个进程就会采取一个优化策略. 当UI线程在第二步中, 发送一个URL请求到网络中, 就已经得知要导航到的网站. 在进行网络请求的同时, UI线程尝试主动的找到或者开始一个渲染进程. 这种方法, 如果所有的结果是预期那样的话, 当网络线程开始接受数据的时候, 一个渲染线程已经在备用位置准备好了. 如果导航的请求的跨域了, 这个备用线程也许不能用, 事实上, 另一个不同的进程也许用得到.

第四步: 提供导航

现在数据和渲染进程都准备好了, 接着IPC会通知浏览器进程渲染进程一个导航. 它也会传送数据流,所以渲染进程能够保持接收HTML数据. 一旦浏览器进程确认获取到了渲染进程的提交记录, 导航就完成了, 文件加载格式化就会开始了.

此时, 地址栏, 安全表示和网站设置的UI都会反映出新页面的信息. tab页上的历史操作也会更新, 所以前进后退按钮会走到这个刚刚导航的网站. 为了更快的恢复,当你关闭tab或者window的时候, 历史会话记录会存储在磁盘上.
在这里插入图片描述
图6: 浏览器进程发送IPC给渲染进程, 请求渲染页面.

额外步骤: 初始加载完成

一旦导航提交了, 渲染进程继续加载资源, 并开始渲染页面. 我们会在下一章中来回顾这个步骤里发生的细节. 一旦渲染进程"完成"渲染, 会发送一个IPC返回给浏览器进程(页面中所有frames都触发了onload事件,并完成执行). 在这点上, UI线程停在在tab页上的loading图标.

我说"完成", 因为客户端这边的JavaScript可以继续加载额外的资源并在这点之后, 继续渲染新的视图.
在这里插入图片描述
图7: 渲染进程向浏览器进程发送一个页面上的IPC通知, 表示加载完成.

导航到不同站点

简单的导航到此就完成了. 但是如果用户再次放了一个不同的URL到地址栏, 会发生什么呢? 没错,浏览器进程会通过一个相同的步骤导航到新的网站. 但在他能做之前, 需要简称当前渲染的网站, 是否订阅了beforeunload事件.

beforeunload事件能够, 当你尝试跳转或者关闭tab页时, 创建"确认离开网站"的提示. 每一个tab页里面都包含的js代码, 都是通过渲染进程处理的, 所以有新的导航请求进来时, 浏览器进程会检查当前的渲染进程.

不要在beforeunload中添加无意义的处理函数. 因为每一次导航开始的时候, 都会执行, 会造成更多的延迟.
这个事件应该按需添加, 例如用户离开当前页会丢失数据的时候, 需要进行提醒.

在这里插入图片描述
图8: 浏览器进程通过IPC告诉渲染进程, 将要跳转到不同的站点.

如果导航是渲染进程创建的(比如用户点击了某个链接, 或者js执行了window.location = "https://newsite.com"), 渲染进程会首先检查beforeunload回调. 然后, 会执行和浏览器进程一样的过程. 唯一不同的是, 导航的请求是从渲染进程到浏览器进程反向进行的.

当新的导航达到新的站点时, 会调用一个新的渲染进程来处理新的导航, 之前的渲染进程被留作处理, 类似与unload的事件. 其他的, 查看页面生命周期状态, 已经你可以使用页面生命周期API调用事件.
在这里插入图片描述

图9: 浏览器进程通过IPCs告告诉新的渲染进程渲染页面, 告诉旧的渲染进程执行unload

Service Worker 举例

导航过程最近的一次变化, 就是引入了服务工作者. 服务工作者是一种在你app代码中写入代理的方式, 允许开发者获得更多的控制权, 例如对于本地缓存什么, 以及什么时候通过网络获取新的数据. 如果服务工作者设置了从缓存中加载页面, 那么就不需要从网络中请求数据.

重要的地方是, 记录运行在当前渲染进程中js代码中的服务工作者. 但触发导航请求的时候, 浏览器进程如何知道网站中含有服务工作者呢?

在这里插入图片描述

图10: 浏览器进程中的网络线程正在查看服务工作者空间.

当服务工作者被注册, 服务工作者的空间被作为一个引用进行保存(你可以阅读服务工作者生命周期文章来了解更多关于空间的内容). 当导航事件发生的时候, 网络线程会对照已经注册的服务工作者空间来检查域, 如果一个服务工作者注册了这个URL, UI线程会找到渲染进程, 来按照顺序执行服务工作者的代码. 服务进程可能会从缓存中加载数据, 清除需要从网络中请求的数据, 或者它可以从网络中请求新的资源
在这里插入图片描述

图10: 浏览器进程中的UI线程启动一个渲染进程处理服务工作者; 然后, 渲染进程中的工作线程从网络中请求数据.

导航预加载

如果服务工作者最终确定从网络中获取数据, 那么你可以看到浏览器进程和渲染进程的一个循环过程导致了延迟. 导航预加载是一种通过启动服务工作者同时加载资源, 来提高速度的方式. 它可以让请求带上头部信息, 允许服务决定对这个请求发送不同的请求, 比如, 只是对整个文档替换数据.

在这里插入图片描述

图12: 浏览器进程中的UI线程开启一个渲染进程处理服务工作的同时, 开始了网络请求.

总结

在这篇文章中, 我们聊了导航中发生的, 以及你的web app代码, 例如响应头部, 和客户端JS在浏览器中的运行. 通过了解浏览器如何从网络中一步步的获取数据, 来更加容易的理解为什么开发使用预加载API. 在下一章中, 我们会介绍浏览器如何使用HTML/CSS/JavaScript来渲染页面.

原文地址: https://developers.google.com/web/updates/2018/09/inside-browser-part2

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 0x80004005 是一种 Windows 操作系统错误代码,它通常与文件、文件夹、网络连接等相关的问题有关。但是当这个错误代码出现在使用 Chrome 浏览器时,它通常与以下几个因素有关: 1. 网络设置问题:Chrome 浏览器可能无法连通因为网络设置的问题,例如 DNS 设置错误或代理服务器的配置问题。这可能会导致 0x80004005 错误出现。 2. Chrome 升级问题:Chrome 浏览器的更新可能有时会出现问题,因此导致错误代码 0x80004005 的出现。 3. Chrome 与其他应用程序的兼容性问题:有时,Chrome 浏览器与某些安装的应用程序或浏览器插件之间的兼容性可能会导致错误代码 0x80004005 的出现。 处理方式包括: 1. 检查网络设置:确保您的 DNS 设置正确,或者您的代理服务器配置正常。您可以尝试更改您的 DNS 设置或重新配置代理服务器以解决这个问题。 2. 卸载和重新安装 Chrome 浏览器:如果 Chrome 浏览器的升级出现问题,则可以尝试卸载并重新安装最新版本的浏览器。 3. 禁用 Chrome 扩展:如果 Chrome 浏览器与其他应用程序之间的兼容性问题是导致出现错误代码 0x80004005 的原因,则可以禁用、卸载或更新所涉及的扩展程序。 总的来说,出现 Chrome 浏览器错误代码 0x80004005 的情况有很多可能的原因,但是通过以上的处理方式,您有可能解决这个问题。 ### 回答2: Chrome浏览器0x80004005错误通常会导致用户无法升级浏览器、安装扩展程序或执行某些操作。此错误通常意味着无法访问指定的文件或目录。 可能的原因包括: 1. 损坏的文件:该错误可能是由于某些Chrome浏览器文件的损坏或缺失导致的。 2. 权限问题:您可能没有足够的权限来执行某些操作。例如,您可能无法在电脑上安装新软件或在系统目录中更改文件。 3. 第三方软件干扰:安装在您的计算机上的某些防病毒软件、防火墙或其他安全软件所执行的操作可能会干扰Chrome浏览器的操作。 如何修复Chrome浏览器0x80004005错误? 以下是一些可能有用的解决方法: 1. 重新安装Chrome浏览器:您可以尝试卸载Chrome浏览器并重新安装它,这可能有助于解决某些文件损坏或缺失的问题。 2. 手动删除Chrome浏览器的文件:如果某些Chrome浏览器文件已损坏或缺失,您可以手动删除这些文件,然后重新安装Chrome浏览器。 3. 检查电脑权限:您需要确保您对计算机有足够的权限来执行某些操作。您可以联系计算机管理员或尝试使用管理员帐户登录。 4. 暂时停用第三方软件:您可以尝试停用安装在计算机上的某些第三方软件,以查看这些软件是否干扰到了Chrome浏览器的操作。 总之,当Chrome浏览器0x80004005错误发生时,我们可以考虑重新安装浏览器、手动删除文件、检查电脑权限,或者暂时停用第三方软件来解决问题。 ### 回答3: Chrome浏览器出现错误代码0x80004005通常是由于以下几个方面引起的: 1. Chrome浏览器和Windows Defender不兼容:Windows Defender是Windows操作系统自带的安全软件,它可能会在Chrome浏览器与其交互时出现广告拦截。这可能导致Chrome浏览器出现错误代码0x80004005。解决方法是在Windows Defender设置中将Chrome浏览器添加到例外列表中。 2. Chrome浏览器和其他安全软件冲突:如果您的电脑上安装了其他安全软件,例如杀毒软件或防火墙,它们可能与Chrome浏览器不兼容,从而导致错误代码0x80004005。解决方法是通过关闭或卸载安全软件来检查是否解决问题。 3. Chrome浏览器的缓存和历史记录过多:Chrome浏览器的缓存和历史记录会占用大量的磁盘空间,从而降低Chrome浏览器的性能。这可能导致错误代码0x80004005。解决方法是清除Chrome浏览器的缓存和历史记录。 4. Chrome浏览器的插件和扩展程序有问题:Chrome浏览器的插件和扩展程序可能会与其他应用程序或操作系统发生冲突,从而导致错误代码0x80004005。解决方法是通过逐个禁用Chrome浏览器的插件和扩展程序来检查是否导致问题的解决。 总的来说,Chrome浏览器出现错误代码0x80004005的情况是多方面的,需要逐一排查。如果以上方法都不能解决问题,可以尝试重新安装Chrome浏览器或者更新操作系统来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值