更新:
AppCache 已于 2015 年夏季弃用,因此以下不再是最佳解决方案。新的建议是改用Service Workers。然而,Service Workers 目前仍在试验 IE 和 Safari 中的粗略(阅读:可能没有)支持。
另外,许多构建工具现在无缝地结合了缓存清除和文件“版本控制”技术来解决 OP 问题。 WebPack 可以说是这个领域的当前领导者。
这可能是使用 HTML5 的 AppCache 的一个很好的用例
您可能希望将其中一些步骤自动化到您的部署脚本中,但这里有一些代码可能对您有所帮助。
首先,创建您的 appcache 清单文件。这也将允许您在客户端浏览器中缓存资源,直到您明确修改 appcache 清单文件的日期。
/app.appcache:
CACHE MANIFEST
#v20150327.114142
CACHE:
/appcache.js
/an/image.jpg
/a/javascript/file.js
http://some.resource.com/a/css/file.css
NETWORK:
*
/
在 app.appcache 中,#v20150327.114142 行上的注释是我们向浏览器指示清单已更改并且应重新加载资源的方式。它可以是任何东西,真的,只要文件在浏览器中看起来与以前的版本不同。在应用程序中部署新代码期间,应修改此行。也可以使用构建 ID。
其次,在任何你想使用appcache的页面上,修改header标签如下:
<html manifest="/app.appcache"></html>
最后,您需要添加一些 Javascript 来检查 appcache 是否有任何更改,如果有,请对其进行处理。这是Angular module。对于这个答案,这里有一个普通的例子:
appcache.js:
window.applicationCache.addEventListener('updateready', function(e) {
if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
// Browser downloaded a new app cache.
// Swap it in and reload the page to get the latest hotness.
window.applicationCache.swapCache();
if (confirm('A new version of the application is available. Would you like to load it?')) {
window.location.reload();
}
}
else {
// Manifest didn't changed. Don't do anything.
}
}, false);
或者,如果 AppCache 不适用于您的情况,则更偏僻的解决方案是创建一个简单的 API 端点,该端点返回当前构建 ID 或上次部署日期时间。您的 Angular 应用程序偶尔会遇到此端点并将结果与其内部版本进行比较,如果不同,则重新加载自身。
或者,您可以考虑使用实时重新加载脚本 (example),但是,虽然对开发很有帮助,但我不确定使用实时/就地重新加载资产的想法有多好正在生产中。