HTTP缓存 - 图1

关于顺序和配置项

  • 整体顺序: URL => 强缓存 => 协商缓存 => 发新的网络请求。
  • 设置了 no-store,内存缓存也不存。两个一样的 img-url,注定会请求 2 次(memory cache都不存)。
  • 设置了 no-cache【表示使用协商缓存】,并不是说不存,而是说是否存根据后续对比(即看后续协商缓存有不)。
  • public - 存在客户端、代理服务器、CDN。
  • private - 只存客户端。
  • 协商缓存 - Last-Modifed/If-Modified-Since 并不准确,因为 1s 内,也是可以改变文件数据的。
  • 协商缓存 - Etag/If-None-Match 是准确的,因为根据文件内容字节 => hash码,准确判断内容变化。
  • etag原理:
    • nginx是用 16进制事件
    • express/koa 用专门的 npm 框架:通常是 文件内容 + 时间

关于实际使用

  • html用协商缓存 => 【经常变化的用协商缓存】

    !!!! 如果你一定要用“强缓存”

    • 最好修改对应的名字(不然可能客户一直用着老页面)。
    • 最好设置较小的 max-age,让缓存短一点,越短越不会出现:客户端一直没有更新的情况(要是旧版本有bug就更惨了)
  • css/js 经常变化,用 contentHash

  • webpack三种随机数
    • hash - 有一个内容变化,全部变化;无内容变化则不变
    • chunkhash(根据入口区分) - 可以通过 vendor 配置,把不常改变的 “第三方库”(比如 Vue、React),打进去,然后用 chunkhash,就可以保证其,强缓存
    • contenthash(根据内容变化区分,有点像etag的原理)- 像我们可以把 css 的变化单独用插件抽出来,就实现了 css变更信息,但是 js 保持之前的缓存。
      1. module.exports={
      2. module:{
      3. rules:[
      4. {
      5. test: /\.css$/,
      6. use:[
      7. miniCssExtractPlugin.loader,
      8. 'css-loader'
      9. ]
      10. }
      11. ]
      12. },
      13. plugins:[
      14. new miniExtractPlugin({
      15. filename: 'main.[contenthash:7].css'
      16. })
      17. }
      18. }

后端怎么设置

  • Express
    • res.setHeader(‘Cache-Control’, ‘public, max-age=0’)
    • res.setHeder(‘ETag, xxxx’)
  • Koa
    1. ctx.set('Cache-Control', 'no-cache');

    all in ctx. ctx.request ctx.response ctx.body