原文连接:From URL to Interactive
原文做者:agustafson
译者:wangdsjavascript
这是一个系列文章,分为四个部分介绍了从输入URL到页面呈现的详细过程css
本篇翻译的是第一部分:Server to Clientjava
每当咱们在地址栏中输入URL或者点击一个连接的时候,实质就是对浏览器(客户端)下达一道指令去指定的位置(服务器)得到咱们想要的资源。获取资源是浏览器展现web页面的第一步工做。web
获取资源是一个过程,这个过程能够拆解成以下几个步骤。跨域
当浏览器接收到URL后,浏览器首先要修正URL的传输协议(http or https)。之因此采用修正这个词,是由于浏览器中有两个列表:预加载 HSTS列表
和浏览器曾经访问过的HSTS列表,凡是在这两个列表内的地址,浏览器都会将传输协议改为HTTPS。举个例子,即便你在浏览器里输入了http://www.bing.com这个地址,最后访问的都是https://www.bing.com。浏览器
接下来,浏览器要确认Service Worker
是否能处理这个请求。Service Worker
本质上充当了Web应用程序与浏览器之间的代理服务器,也能够在网络可用时做为浏览器和网络间的代理。Service Worker
经过拦截并代理请求的方式,从脚本控制的缓存内得到资源。缓存
用户首次访问具备Service Worker
功能的网站时,Service Worker
会马上被下载(以后每24小时它至少会被下载一次)。下载完成后Service Worker
将依次进行安装和激活。若是网站有一个Service Worker
处于激活状态,新下载的Service Worker
在安装完成后不会当即激活而是处于等待状态。只有当网站不依赖旧的Service Worker
后,新的Service Worker
才会激活。Service Worker
是彻底异步的。安全
若是没有Service Worker
,浏览器将会访问网络层,直接进行下一步工做。服务器
在这一步中,浏览器首先肯定本次请求的资源是否已经存在于本身的缓存中。若是浏览器是第一访问这个网站,确定没有缓存,而后浏览器将发送请求至服务器,在请求头中添加Cache-Control
这个字段用来制定本次请求关于缓存的规则。Cache-Control
常见的取值有max-age
(缓存内容失效时限)、no-store
(是否开启缓存)、no-cache
(使用缓存时是否须要与服务器验证)等。每次从浏览器的缓存中使用设置了no-cache
资源前,都要发送一个验证请求到服务器,验证缓存中的资源是不是最新的。这个验证缓存的请求头中包含If-Modified-Since
(时间断定)或者包含If-None-Match
(资源版本号),服务器接收到请求后根据修改时间或者最新版本号来判定浏览器中的资源是否是最新的,若是浏览器中的资源是最新的则响应HTTP 304
,告知浏览器继续使用以前的缓存;不是最新的则返回HTTP 200
,同时响应最新的资源给浏览器,更新缓存。网络
这一步的工做是解析DNS
获取正确的IP
地址,解析域名的第一步是浏览器查找本机硬盘HOST
文件是否有对应的IP
地址,若是本机硬盘HOST
文件内没有,浏览器会发送一个DNS
请求到本地DNS
服务器(Internet服务提供商托管,中国的电信联通等),本地DNS
服务器会首先查找本身的缓存记录,若是没有将继续发送请求至DNS
根服务器,逐级查找到正确的IP
地址。
有些时候,浏览器能够预先知道将要访问哪些资源,提早与这些资源进行链接。方法就是在页面的link
标签内添加Resource Hint
来告知浏览器哪些资源须要预先链接加载。Resource Hint
有DNS Prefetch
、Preconnect
、Prefetch
和Prerender
四种。举个应用例子,当咱们在搜索引擎中搜索东西的时候,结果页面上会展现大量的相关连接。浏览器可使用Resource Hint
将最靠前的搜索结果进行预链接和预下载,这样当咱们点击这些靠前连接的时候,打开速度将更快。
到了这一步,客户端(也就是浏览器)已经正式与服务器创建了链接。若是咱们使用TLS
,则须要执行TLS握手来验证服务器提供的证书。
一般来讲,浏览器发给服务器的第一个请求是最基础的页面请求。服务器会将一个HTML
文件发送给浏览器。
浏览器接收到来自服务器的响应资源后,将对这些响应资源进行分析。首先,浏览器将查看Response header
。若是浏览器查看Response header
表示须要重定向(例如采用 Location header
的方法),浏览器拿到重定向的地址后,将从新从第一步修正传输协议(CHECK FOR HSTS)开始工做。
若是服务器的响应资源进行了压缩,浏览器还须要对这些资源进行解压。
另外,浏览器开始解析响应资源的时候,同时开始对这些资源进行缓存。
接下来,浏览器经过判断响应内资源的MIME
类型肯定用什么样的方式来加载资源。例如,在浏览器解析HTML
的时候,碰到图像文件就以image
对象的方式加载。另外浏览器在解析HTML
时(未生成render
树),还会继续下载响应内的资源。这一部分的知识将在下篇文章内详细讲解。
至此,浏览器将会把此次访问的URL
放入浏览器的历史记录里,咱们能够经过浏览器的前进和后退功能访问他们。
下面的流程图的展现了1-7的步骤内容:
正如咱们所知道的,还有不少后续须要请求的资源,例如图片资源、css
资源、JavaScript
资源。以及css
资源内又包含的图片或者使用import()
,AJAX
引用的其余资源等等。这些所有的资源才构造了具备交互性的页面。咱们全部请求的资源都遵循上面的流程图,固然也遵循浏览器的缓存策略。
前文已经提到,浏览器管理着HTTP缓存
,缓存中的资源用来快速展现咱们曾经访问过的网站。缓存中储藏着相似于网站图标、基础JavaScript
文件等不常常变更的资源。合理的使用缓存既能够减小网络请求的数量又能够加快页面的载入速度。
另外,HTTP缓存
也是有限度的。浏览器经过Response header
头内的Cache-Control
来判断须要缓存哪些资源和缓存资源的时限。好比浏览器能够经过Cache-Control: no-store
来判断本次请求的资源是不须要缓存的,这种不缓存的内容通常是指须要频繁变更的资源。又好比Cache-Control: immutable
用来判定本次请求的资源是永久不变的。在使用Cache-Control: immutable
的时候,做者建议用不一样的URL来对应同一资源的不一样版本,以便浏览器缓存的资源不受影响。
固然,浏览器中不只仅有HTTP缓存
这一种缓存。咱们能够经过JavaScript
进行程序化缓存。这就是咱们第二步中提到的Service Worker
,Service Worker
能够拦截请求并返回Service Worker
缓存的资源。Service Worker
程使网站的缓存更具备灵活性。另外,每一个网站的程序化缓存都是独立,这些缓存与网站是一一对应的关系。
同源指的是通讯协议、域名、端口彻底相同。举个例子,https://www.bing.com:443中https是通讯协议,www.bing.com是域名,443是端口。https://www.bing.com:443和 http://www.bing.com:80就是不一样源的。
同源是浏览器中很是重要的一个概念,隔离开来的数据变得更加安全。在大多数状况下,浏览器为了安全考虑都采用同源策略。在上面的两个例子中https://www.bing.com:443和 http://www.bing.com:80都没法查看对方的缓存。
假如bing.com想调用一个microsoft.com的JavaScript
资源,正常状况下浏览器会由于同源策略而不容许。这个时候能够采用CORS(Cross-Origin Resource Sharing)
方法来进行跨域访问。microsoft.com服务器将进行一个声明表示bing.com能够访问哪些资源。
以上就包含了资源从服务器到客户端的所有内容。下一篇文章咱们将聊聊HTML标签是如何转化成DOM的。
限于本人水平有限,文中若有错误感谢您指正。