设计网络方向的主要有三个:
- DNS 解析
- TCP 连接
- HTTP 请求/响应
HTTP 请求/响应
- 减少网络请求
- 减少单次网络请求所花费的时间
浏览器缓存
MemoryCache
图片全部会放到内存中缓存, 大文件的js或css会放到硬盘内,小的也放到内存中
ServiceWorkCache
独立于浏览器主线程,不能操作DOM,可以实现离线缓存、消息推送、网络代理
HTTPCache
- 强缓存
利用http请求头中的expires
和Cache-Control
两个字段来控制。同时出现时Cache-Control
优先级更高
Cache-Control
关键字理解
no-cache
: 直接绕过浏览器缓存,直接请求服务器,响应字段如果有浏览器不缓存no-store
: 浏览器和服务器都不缓存no-transform
: 不要随意转换我发过来的东西only-if-cached
: 缓存中有就返回,没有就不返回max-age
: 用于请求头,超过年龄限制就返回新的max-stale
: 用于请求头,允许返回已经过期的资源,但有最大时间限制min-fresh
: 用于请求头,对即将过期的资源不返回public
: 用于响应头,允许客户端缓存数据,也能给别人使用,比如代理服务器可以缓存private
: 用于响应头,允许客户端缓存数据,不能给别人使用
- 协商缓存
依赖Last-Modified
,If-Modified-Since
和ETag
,If-None-Match
来实现
Last-Modified
: response返回表示资源的最后修改时间If-Modified-Since
: 资源在请求期间是否有修改,如果没有修改,则命中协商缓存,从缓存中拿数据,如果有修改,则返回新的Last-Modified
,和服务器资源
问题:
- 周期性的重写资源,但是资源内容没有改动
- 修改的内容不重要
Last-Modified
时间太短无法精确
ETag
: 资源的唯一标示,随服务器返回If-None-Match
: 服务器比较If-No-Match
和当前资源的ETag
比较,如果一样则返回缓存中的,如果不一样,就返回新的ETag
和服务器资源
- HTTP 缓存决策
- 资源内容是否复用,拒绝一切形式缓存
- 是否需要向服务器发起请求
- 是否可以被代理服务器缓存
- 是否有缓存时间
- PushCache
指服务器HTTP2在server push阶段的缓存
- Memory Cache、HTTP Cache 和 Service Worker Cache 均未命中的情况下才会去询问 Push Cache。
- 只存在session使用期间
- 共享同一个HTTP2连接,可以共享同一个PushCache