若是不会被重复加载,机制是什么?
这个问题其实就是web的cache问题,首先加载是确定的,可是接下来的过程会有不一样,
咱们看看加载的时候发生了什么:
1. 客户端请求一个js文件(a.js)。
2. 服务器返回a.js,并在给它加上一个Last-Modified/ETag。
3. 客户端获取到a.js,并将它连同Last-Modified/ETag一块儿缓存。
4. 客户再次请求该文件(好比说刷新页面,或是同站跳转),并将上次请求时服务器返回的Last-Modified/ETag 做为请求头的If-Modified-Since/If-None-Match一块儿传递给服务器。
5. 服务器检查该If-Modified-Since/If-None-Match(即前一次响应头中的Last-Modified或ETag),并判断出该页面自上次客户端请求以后还未被修改,直接返回响应304和一个空的响应体。
由上面能够看出,虽然在客户端仍是发起了一次请求,可是能够避免接下来更多的服务器操做,而且没有返回该文件而只是一个 HTTP Header,从而大大的下降带宽的消耗,提升用户体验。html
这里的讲下304状态码。304状态码表示客户端有缓冲的文档并发出了一个条件性的请求(通常是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。若是客户端在请求一个文件的时候,发现本身缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。服务器只要判断这个时间和当前请求的文件的修改时间就能够肯定是返回 304 仍是 200 。对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。web
还有一种状况:
对于动态页面,就是动态产生的页面,每每没有包含 Last Modified 信息,这样浏览器、网关等都不会作缓存,也就是在每次请求的时候都完成一个 200 的请求。所以,对于动态页面作缓存加速,首先要在 Response 的 HTTP Header 中增长 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。浏览器