常用 web 静态资源的缓存
- 代理服务器缓存
- CDN 缓存
- 浏览器端缓存
浏览器缓存
- Cache-Control: max-age=3600(s) | no-cache | no-store
- Pragma: no-cache | Pragma
- Expires: Fri, 11 Aug 2017, 17:00:00 GMT
- Last-Modified: Fri, 11 Aug 2017, 17:00:00 GMT
- If-Modified-Since: Fri, 11 Aug 2017, 17:00:00 GMT
- Etag: “v2.6”
- If-None-Match: “v2.6”
no-cache 是允许缓存的,但是使用缓存之前必须和服务器进行新鲜度对比,no-store 才是禁止缓存。
AppCache
对app内存缓存的方案,具体表现为当请求某个文件时不是从网络获取该文件,而是从本地获取。
index.appcache
1 | CACHE MANIFEST |
index.html
1 | <html manifest="index.appcache"> |
这样的话,每次都会请求 index.appcache,如果请求的文件存在在 index.appcache
里面,就无需向服务器请求。
弊端
- 除非改变 index.appcache,否则 index.appcache 里面的文件永远只会来自应用缓存
- 不在 appcache 缓存列表里面的文件不会被缓存,再次请求也不会去请求 😶
Service workers
本质上充当浏览器和网络之间的代理服务器。它们旨在能够创建有效的离线体验,拦截网络请求并基于网络是否可用判断资源是否需要更新来采取适当的动作。他们还允许访问推送通知和后台同步API。
Service worker 运行在 worker 线程,和驱动应用的 JavaScript 线程是分开的,两者相互不受影响,所以 Service worker 是不能访问 DOM 的。
完全的使用 Promise 异步设计,不允许使用同步 API。必须在 HTTPS 下使用,但是调试的时候在 localhost 下面可以使用 HTTP。
X5 内核浏览器是支持 service worker 的。
Service workers 生命周期
Service workers 监听事件
入口
这里指定的 sw.js
是在 worker 线程工作,所以它不能访问 DOM。
1 | export function registerSW() { |
安装
1 | // 需要缓存的文件列表,可以通过 Legos 生成或者 Webpack 获取 |
请求拦截
1 | // 这里会监听浏览器的 HTTP 请求,并做一层拦截 |
缓存更新
1 | /* |
调试
一些新的 API
Request
1 | interface Request extends Object, Body { |
Resopnse
1 | interface Response extends Object, Body { |
Cache 是一个专为为 Request 和 Response 对象提供缓存机制的接口,它可以把 Request 和 Response 对象缓存起来,并且提供一些很方便的 API 供调用。
1 | interface Cache { |
参考
https://x5.tencent.com/tbs/guide/serviceworker.html
https://alistapart.com/article/application-cache-is-a-douchebag
http://harttle.com/2017/04/10/service-worker-update.html
https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers