最新的 Google Android 用户行为分析中,获得如下几个数据css
PWA(Progressive Web App)给用户原生APP的体验,其实不难发现PWA核心就是创建在离线缓存和后台数据交互基础上构建的崭新的Web app,使其具有了Native App的部分特性。那么从缓存开始咱们一步步在技术上组装PWA服务。为了使本篇教程更多的朋友能举一反三,咱们技术栈尽可能从浅入深。前端
前端工程化的发展,意味着产品的重点从原来的功能体验,愈来愈升级到用户体验。从早期的代码压缩,到减小http请求,异步加载,经过CDN的内容分发,缓存等技术的综合应用,从几十秒到几十毫秒的优化而费尽心思。这些应用体验只是为了“秒开”页面。node
为了达到秒开的效果,必然要在客户端作持久的离线缓存,HTML5的离线缓存就是最主要的特性之一,2014年W3C就开始提倡ServiceWorker,为了更好的理解ServiceWorker咱们就要从离线缓存控制环节一步步揭开它的面纱,先让咱们回顾一下HTML5控制离线缓存的各类方式吧。nginx
随着HTTP1.1的协议最先使用的缓存机制,经过HTTP头来控制用户代理(浏览器)是否把头对应的文件进行缓存,缓存多长时间。经过HTTP RESPONSE HEADERS属性来控制页面加载的元素缓存。web
Cache-Control 服务端缓存控制来控制元素的加载后端
课程中咱们使用Chrome浏览器,前端工程化
1. 打开 [baidu.com](https://baidu.com)浏览器
2. 打开开发者工具 Ctrl+Shift+i缓存
3. 点击顶部NetWork服务器
4. 选择下面的加载列表
能够看到页面加载的全部URI资源的属性,固然咱们如今更关注的是缓存,那么请注意右侧的Cache-Control的属性:
Cache-Control 属性告诉用户代理缓存机制是否能够缓存及哪一种类型。他包含如下值:
– public 全部内容都将被缓存(客户端和代理服务器均可缓存)
– private 内容只缓存到私有缓存中(仅客户端能够缓存,浏览器不可缓存)
– no-cache 不缓存
– no-store 全部内容都不会被缓存
– must-revalidation/proxy-revalidation 若是缓存的内容失效,请求必须发送到服务器/代理以进行从新验证
– max-age=xxx (xxx is numeric) 缓存的内容将在 xxx 秒后失效
咱们能够发现百度首页把经常使用的资源,都进行了缓存,咱们经过选择左侧的属性列表也能够看到几个不缓存的案例。固然Cache-Control属性不止这些,推荐你们阅读如下文档更多的理解Cache-Control
一、百度百科:[https://baike.baidu.com/item/Cache-control/1885913?fr=aladdin](https://baike.baidu.com/item/Cache-control/1885913?fr=aladdin)
二、MDN: [https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control)
咱们若是查看Google或者Facebook等国外站点不难发现headers头部没有cache-control属性,而变成了strict-transport-security。其实这也是缓存的一种机制,更有利https缓存介入,国内从去年刚刚才大量普及https,可是用户习惯输入http,服务器通常直接作了强制跳转https资源,这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。网站经过HTTP Strict Transport Security通知浏览器,这个资源禁止使用HTTP方式加载,浏览器应该自动把全部尝试使用HTTP的请求自动替换为HTTPS请求。
为了更好的兼容性考虑,如建议使用:
固然在常常修改的内容上咱们也能够加入这样的方式进行缓存
但使用这种方式必定要注意,缓存时间是服务器时间,并非用户代理(浏览器)时间。因此若是多个资源都使用了从新加载,咱们没法保证在同一时间某个资源是没有被加载的。多个资源间不匹配。页面崩塌。固然咱们继续学习下去,后续咱们学习serviceWorker就能够杜绝这个问题出现。
当下多数公司网站的图片,js,css等文件的缓存会选择Nginx的web缓存服务。Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成。
1. proxy_cache相关指令集用于反向代理时,对后端内容源服务器进行缓存.Nginx的proxy_cache缓存功能,十分稳定。
2. fastcgi相关指令集主要用于对FastCGI的动态程序进行缓存.二者功能基本同样.
固然咱们最后一个问题,这个Headers是怎么配置的,若是你是前端工程师,你必定会选用Nginx+node的反向代理和负载均衡的方式处理你的业务。一个简单KOA2的header的配置吧,只须要set一下就ok了,你能够经过nginx的反向代理控制服务器缓存。甚至咱们会把须要缓存的资源独立一个Koa进行处理,这样能发挥更多CDN的能力。
转载: https://wosclass.com/2019/03/07/%E7%AC%AC%E4%BA%8C%E7%AB%A0-%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%A6%BB%E7%BA%BF%E7%BC%93%E5%AD%98%E6%8A%80%E6%9C%AF/