我尝试过使用现代网络浏览器的缓存功能,但效果太好了。使浏览器重新缓存数据的唯一方法是修改清单文件。
当然,我可以在清单文件中添加带有版本号的注释来强制浏览器,但是所需的手动工作感觉就像一个丑陋的黑客。难道没有别的办法了吗?
我试过利用:
var loadNewCache = function() {
window.addEventListener('load', function(e) {
window.applicationCache.addEventListener('updateready', function(e) {
var newUpdates = (window.applicationCache.status == window.applicationCache.UPDATEREADY);
if (newUpdates) {
window.applicationCache.swapCache();
window.location.reload();
}
}, false);
}, false);
};
但是这些事件永远不会被触发。
我在 Google AppEngine 上运行并在我的 app.yaml 中有这个
- url: /html_client/(.*\.appcache)
mime_type: text/cache-manifest
static_files: html_client/\1
upload: html_client/(.*\.appcache)
编辑
我使它与这个脚本一起工作,该脚本作为部署前运行。它不漂亮,但它有效。
#!/usr/bin/python
def main():
"""
Takes the current git sha id and replaces version tag in manifest file with it.
"""
from subprocess import Popen, PIPE
input_file = open("manifest.appcache", 'r')
output_file = open("manifest.appcache.tmp", 'w')
try:
git_sha_id = Popen(["git rev-parse --short HEAD"], stdout=PIPE, shell=True).communicate()[0]
target_line = "# Version: "
for line in input_file:
if target_line not in line:
output_file.write(line)
else:
output_file.write(target_line + git_sha_id)
except IOError as e:
print "I/O error({0}): {1}".format(e.errno, e.strerror)
finally:
input_file.close()
output_file.close()
Popen(["mv -f manifest.appcache.tmp manifest.appcache"], stdout=PIPE, shell=True)
if __name__ == "__main__":
main()