我正在处理一个中等大小的网络应用程序,并尝试想出最佳解决方案,以使所有浏览器都使用缓存,并仅在加载的资产有更新时才使其失效。
根据我在这里和其他地方所做的研究,似乎每个人都同意将?v={version#}附加到诸如css或js文件之类的资产是一种自动使资产失效的好方法。 (参见Force browser to clear cache和Better way to prevent browser caching of JavaScript files)
但我认为这个解决方案应该泛化到网站上驻留的所有资产。
所以我的问题是,有没有好的实践方法可以让构建脚本查找整个网站上的每个src=""属性 - 无论是img、css还是js,并以编程方式追加?={timestamp},其中时间戳是文件最后修改的时间。这样,每当您从开发推送到暂存再到生产时,只有那些已修改的文件才会有更改的时间戳,并且浏览器将知道使这些文件的缓存失效。
这种方法有什么不足之处吗?
注意:再考虑一下,时间戳对于稍后撤销的更改肯定是不理想的。因此,追加?={md5(filecontents)}是一种更为强大的方法。但是,是否在所有资产和所有构建中实施这个方法仍然是一个问题。
根据我在这里和其他地方所做的研究,似乎每个人都同意将?v={version#}附加到诸如css或js文件之类的资产是一种自动使资产失效的好方法。 (参见Force browser to clear cache和Better way to prevent browser caching of JavaScript files)
但我认为这个解决方案应该泛化到网站上驻留的所有资产。
所以我的问题是,有没有好的实践方法可以让构建脚本查找整个网站上的每个src=""属性 - 无论是img、css还是js,并以编程方式追加?={timestamp},其中时间戳是文件最后修改的时间。这样,每当您从开发推送到暂存再到生产时,只有那些已修改的文件才会有更改的时间戳,并且浏览器将知道使这些文件的缓存失效。
这种方法有什么不足之处吗?
注意:再考虑一下,时间戳对于稍后撤销的更改肯定是不理想的。因此,追加?={md5(filecontents)}是一种更为强大的方法。但是,是否在所有资产和所有构建中实施这个方法仍然是一个问题。