最新の Web ブラウザーのキャッシュ機能を利用してみましたが、うまく機能しすぎています。ブラウザにデータを再キャッシュさせる唯一の方法は、マニフェスト ファイルを変更することです。
確かに、マニフェスト ファイルにバージョン番号を付けてコメントを追加してブラウザーを強制することはできますが、必要な手作業は醜いハックのように感じます。他に方法はありませんか?
私は以下を利用してみました:
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()