1

我尝试过使用现代网络浏览器的缓存功能,但效果太好了。使浏览器重新缓存数据的唯一方法是修改清单文件。

当然,我可以在清单文件中添加带有版本号的注释来强制浏览器,但是所需的手动工作感觉就像一个丑陋的黑客。难道没有别的办法了吗?

我试过利用:

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()
4

1 回答 1

3

您不需要做任何丑陋的事情并更改清单文件。

您需要做的就是在您正在加载静态文件的 url 的末尾添加应用程序的当前版本。这个版本号会随着每次部署而变化,因此它将在每次新部署后被缓存。

<link rel="stylesheet" href="/static/css/main.css?{{VERSION}}" type="text/css" />

{{VERSION}}在生产中运行时可能在哪里os.environ.get('CURRENT_VERSION_ID', ''),在本地运行时可能只是一个随机数。

您可以使用os.environ.get('SERVER_SOFTWARE',''). 这里有一个简单的例子来获取这个值,你稍后应该将它传递给你的基本模板:

import random
import os

if os.environ.get('SERVER_SOFTWARE','').startswith('Development'):
  VERSION = random.random()
else:
  VERSION = os.environ.get('CURRENT_VERSION_ID', '')
于 2013-06-10T12:27:29.580 回答