如果你是

Angular 新手

或者对 Http 缓存机制理解不清晰

使用 Angular CLI 开发 Angular

请继续往下读。

背景

在 Angular 开发的过程中, 我们经常会发布新的功能或者 fix bug,但是由于浏览器缓存的存在, 可能用户打开的页面并不是最新发布的。 而我们想要的是用户既可以及时看到我们的更新, 又可以在我们没有更新软件时使用缓存中的资源。

解决办法

往往静态资源由 Nginx、apache、IIS 等提供, 我们以 Nginx(当前最新版本是 1.15.8, 请确保 Nginx 版本不低于 1.7.3 changelog) 为例,简单说来就是:

在 Nginx 配置文件 nginx.conf 中确保 Etag 开启(默认是开启的)

对 index.html 设置响应缓存头:

Cache-Control: no-cache

客户端每次请求 index.html 时都要重新验证 index.html 是否发生了改变,

如果发生了改变,就会请求新的 index.html。

css、js 文件中都有 fingerprint,比如, style.x234dff.css.

css、js 文件改变 => fingerprint 改变 => 文件名改变 => index.html 改变 => 浏览器下载新的 index.html => 浏览器请求新的 css、js 文件。

对 css、js、图片等文件设置响应缓存头:

Cache-Control: max-age=31536000 // 缓存一年。

由于 css、js 文件名里有 fingerprint, 只要 css、js 文件变了, URL 就会更新,

这里的 max-age 可以设置足够长的时间

这是一份 Windows 下 nginx.conf 文件的配置节选:

location = /index.html {

add_header Cache-Control no-cache;

}

location ~\.(js|css)$ {

root D:\dist; # 静态资源目录

add_header Cache-Control max-age=31536000;

}

location ~\.(gif|jpg|png|ico)$ {

root D:\dist;

add_header Cache-Control max-age=86400;

}

补充

在 Chrome 开发者面板中可能看到某个资源是 200 from memory cache, 而不是 304, 有些人可能会感到很困惑。

13.2.2 Heuristic Expiration

Since origin servers do not always provide explicit expiration times, HTTP caches typically assign heuristic expiration times, employing algorithms that use other header values (such as the Last-Modified time) to estimate a plausible expiration time. The HTTP/1.1 specification does not provide specific algorithms, but does impose worst-case constraints on their results. Since heuristic expiration times might compromise semantic transparency, they ought to used cautiously, and we encourage origin servers to provide explicit expiration times as much as possible.

13.4 Response Cacheability

Unless specifically constrained by a cache-control (section 14.9) directive, a caching system MAY always store a

successful response (see section 13.8) as a cache entry, MAY return it without validation if it is fresh, and MAY

return it after successful validation.

浏览器的缓存有 2 种:

验证性缓存。用 ETag 、 Last-Modified 、 If-None-Match 、 If-Modified-Since 来控制,其特点是会发一个请求给服务器来确认缓存是否有效,如果有效就返回 304 ,省去传输内容的时间。

非验证性缓存(强缓存)。 如果响应头中没有指定明确的过期时间(Cache-Control: max-age=、Expires), 某些浏览器会缓存成功的请求并使用 Http 头部(比如 Last-Modified)应用某种推测算法计算得出过期时间。其特点是一但有效就在有效期内不会发任何请求到服务器。非验证性缓存的优先级是高于验证性缓存的。

Chrome 开发者面板中看到的 200 from memory cache 就是非验证性缓存, 原因是没有设置 相关的响应头。

参考

angular 缓存 html5,Angular 如何及时更新客户端缓存?相关推荐

  1. python使用redis做缓存_Python中的Redis客户端缓存(二)

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 处理失效 无效消息如何发送到被追踪的客户端取决于客户端正在使用的Redis序列化协议(RESP).早期版本 ...

  2. Redis系列(十四)、Redis6新特性之RESP3与客户端缓存(Client side caching)

    Redis6引入新的RESP3协议,并以此为基础加入了客户端缓存的新特性,在此特性下,大大提高了应用程序的响应速度,并降低了数据库的压力,本篇就带大家来看一下Redis6的新特性:客户端缓存. 目录 ...

  3. nxd无盘怎么设置服务器网卡,网众NxD 6.0无盘系统的客户端缓存设置

    网众NxD 6.0无盘系统的客户端缓存设置 网众NxD 6.0无盘系统的客户端缓存包含以下几个方面: 1) S盘缓存 网众特有的S盘,在NxD 6.0中真正实做了回写缓存.据测试,设置为128M即可有 ...

  4. 客户端缓存和服务器缓存处理

    问题?客户端缓存和服务器缓存处理 一.概述 缓存的思想可以应用在软件分层的各个层面.它是一种内部机制,对外界而言,是不可感知的.      数据库本身有缓存,持久层也可以缓存.(比如:hibernat ...

  5. 实战派 | Java项目中玩转Redis6.0客户端缓存

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 在前面的文章中,我们介绍了Redis6.0中的新特性客户端缓存client-side caching,通过tel ...

  6. HTTP缓存机制--客户端缓存

    HTTP缓存机制分为两种,客户端缓存和服务端缓存,本文主要对客户端缓存进行简单的分析. 服务端缓存 服务端缓存又分为 代理服务器缓存 和 反向代理服务器缓存(也叫网关缓存,比如 Nginx反向代理.S ...

  7. HTML5(3) -- 离线缓存与客户端存储总结

    1.离线检测 可以使用navigator.onLine属性来检测 <!DOCTYPE html> <html lang="en"><head>& ...

  8. html5结构 客户端缓存,Javascript--离线应用与客户端储存

    开发离线Web应用需要几个步骤: 首先确保应用知道设备是否能上网. 应用必须能访问一定的资源(图像,Javascript,CSS),这样才能正常工作. 离线检测 navigator.onLine HT ...

  9. Servlet防止页面被客户端缓存

    服务器端的HttpServlet可通过设置特定HTTP响应头来禁止客户端缓存网页,以下示范代码中的response变量引用HttpServletResponse对象: response.addHead ...

最新文章

  1. 电脑桌面便签小工具_可以直接在桌面上显示内容的便签软件电脑版
  2. FW: HTTP错误500显示具体的出错信息的方法
  3. HBase编程 API入门系列之put(客户端而言)(1)
  4. 信息系统项目管理师-成本管理知识点
  5. Cilium 首次集成国内云服务,阿里云 ENI 被纳入新版本特性
  6. 软件测试oracle问题,数据库基础:Oracle数据库中时间问题比较
  7. web服务之Tomcat
  8. Linux系统编程(四)信号
  9. 外媒:华为或将在2月24日发布麒麟820 支持5G网络
  10. QT中如果出现: warning: 'nullptr' is incompatible with C++98等类似警告
  11. wpf之通过MVVM绑定MouseEnter
  12. Dubbo视频教程《基于Dubbo的分布式系统架构视频教程》
  13. 基于Zabbix的校园网核心监控系统设计与实现
  14. 高中生如何结合生物思维导图做好知识点整理?
  15. 由于系统错误 1114:动态连接库(DLL)初始化例程失败。(MySQL ODBC 5.3 Unicode Driver,c:\Program Files(x86)\MySQL\Connector
  16. 高电平和低电平 到底是啥?
  17. untiy virtual reality supported勾选
  18. 数据分析的终极目标-预测第1辑
  19. SOLR7实践(二)--DIH配置及使用
  20. 模拟输出21点所有可能的Black Jack牌型

热门文章

  1. SQL Server 文件和文件组
  2. 37. 两个链表的第一个公共结点
  3. Java重写父类使用@Override时出现The method destroy() of type xxx must override a superclass method的问题解决...
  4. 多线程join(加入)
  5. iis7.5配置.net mvc注意事项
  6. Hadoop学习笔记一
  7. Apache Tiles 学习(四)、Tiles实战
  8. CString的用法
  9. matlab生产正弦mif文件
  10. java异常return笔试题_Java笔试面试总结—try、catch、finally语句中有return 的各类情况...