[深刻01] 执行上下文
[深刻02] 原型链
[深刻03] 继承
[深刻04] 事件循环
[深刻05] 柯里化 偏函数 函数记忆
[深刻06] 隐式转换 和 运算符
[深刻07] 浏览器缓存机制(http缓存机制)
[深刻08] 前端安全
[深刻09] 深浅拷贝
[深刻10] Debounce Throttle
[深刻11] 前端路由
[深刻12] 前端模块化
[深刻13] 观察者模式 发布订阅模式 双向数据绑定
[深刻14] canvas
[深刻15] webSocket
[深刻16] webpack
[深刻17] http 和 https
[深刻18] CSS-interview
[react] Hooks前端
[部署01] Nginx
[部署02] Docker 部署vue项目
[部署03] gitlab-CIvue
[源码-webpack01-前置知识] AST抽象语法树
[源码-webpack02-前置知识] Tapable
[源码-webpack03] 手写webpack - compiler简单编译流程react
会显示 from-cache (from-disk-cache),(from-memory-cache)
Expires的原理
1. 浏览器第一次向服务器请求资源,浏览器在请求资源的同时,在responder响应头中加上Expires字段
2. 浏览器在接收到这个资源后,将这个资源和全部response header一块儿缓存起来
- 因此,缓存命中的请求返回的header并非来自服务器,而是来自以前缓存的header
3. 浏览器再次请求这个资源时,先从缓存中寻找,找到这个资源后,拿出Expires跟当前的请求时间作比较
- 若是当前请求时间,在Expires指定的时间以前,就能命中强缓存,不然不能
- 注意:Expires是和浏览器本地时间做对比
4. 若是未命中缓存,则浏览器直接从服务器获取资源,并更新response header中的Expires
复制代码
表示该资源仅仅属于发出请求的最终用户,这将禁止中间服务器(如代理服务器)缓存此类资源,对于包含用户我的信息的文件,能够设置private
容许全部服务器缓存该资源
Cache-Control的原理
1. 浏览器第一次向服务器请求资源,服务器在返回资源的同时,在responder的header中加上Cache-Control字段
2. 浏览器在接收到这个资源后,会将这个资源和全部的response header一块儿缓存起来
- 因此,缓存命中的请求返回的header并非来自服务器,而是来自以前缓存的header
3. 浏览器再次请求这个资源时,先从缓存中寻找,找到这个资源后,拿出Cache-Control和当前请求的时间作比较
- 若是当前请求时间,在Cache-Control表示的时间段内,就能命中强缓存,不然不能
4. 若是缓存未命中,则浏览器直接从服务器获取资源,并更新response header中的 Cache-Control
复制代码
Last-Modified If-None-Match
1. 浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在response的header加上Last-Modified的header
- 这个header表示这个资源在服务器上的最后修改时间
2. 浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since的header
- 这个header的值就是上一次请求时返回的Last-Modified的值
3. 服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化
- 若是没有变化则返回304 Not Modified,可是不会返回资源内容;
- 若是有变化,就正常返回资源内容。
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 当服务器返回304 Not Modified的响应时,response header中不会再添加Last-Modified的header
// 由于既然资源没有变化,那么Last-Modified也就不会改变
4. 浏览器收到304的响应后,就会从缓存中加载资源
5. 若是协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified Header在从新加载的时候会被更新
- 下次请求时,If-Modified-Since会启用上次返回的Last-Modified值
复制代码
ETag 和 If-None-Match
1. 浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在response的header加上ETag的header
- 这个header是服务器根据当前请求的资源生成的一个惟一标识,这个惟一标识是一个字符串
- 只要资源有变化这个串就不一样,跟最后修改时间没有关系,因此能很好的补充Last-Modified的问题
2. 浏览器再次跟服务器请求这个资源时,在request的header上加上If-None-Match的header,
- 这个header的值就是上一次请求时返回的ETag的值
3. 服务器再次收到资源请求时,根据浏览器传过来If-None-Match而后再根据资源生成一个新的ETag
- 若是没有变化则返回304 Not Modified,可是不会返回资源内容
- 若是有变化,就正常返回资源内容。
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 与Last-Modified不同的是,当服务器返回304 Not Modified的响应时
// 因为ETag从新生成过,response header中还会把这个ETag返回,即便这个ETag跟以前的没有变化
4. 浏览器收到304的响应后,就会从缓存中加载资源。
复制代码
可是ETag相对于Last-Modified也有其优点,能够更加准确的判断文件内容是否被修改,从而在实际操做中实用程度也更高。
juejin.im/post/5b9346…webpack