3

我们有很多人 (10k+) 定期返回我客户的网站,使用我们为他们构建、改进和托管的 Web 应用程序。随着我们的应用程序的改进和发展,我们一直在对网络应用程序的 javascript 进行相当频繁的向后不兼容更新。在部署期间,javascript 被压缩并连接到一个文件中,由 require.js 加载到浏览器中,然后上传到 Amazon S3 并托管在 Amazon S3 上。文件名和 url 目前在更新期间根本不会改变。上周,我们对 Web 应用程序进行了重大重构,并收到了一些(但不是很多)报告,称该应用程序对某些人停止工作,尤其是在 Firefox 中。这似乎是一个缓存问题。我们最初能够在一些浏览器的测试中看到它,但它似乎在一两次刷新后就消失了。

我突然意识到,我真的不知道在 S3 上部署新版本的 javascript 文件(同名)会有什么浏览器缓存后果,以及这种情况是否需要缓存破坏或操纵 S3 的标头或任何东西。有人可以帮我解决这个问题吗?在部署期间我应该采取哪些措施来确保浏览器立即获取新版本的 javascript 文件?如果不是这样,我们将冒 javascript 和服务器 API 不同步和失败的风险,我认为这发生在这里。

不确定这是否重要,但该站点的服务器运行 Django,并且应用程序和数据库已部署到 Heroku。静态文件通过 Django 的 collectstatic 命令使用 S3Boto 部署到 S3。

4

1 回答 1

3

这在很大程度上取决于 S3 的行为以及它在 S3 上请求文件时发送的标头。如您所见,浏览器会显示不同的缓存行为 - 因此最好的选择是使用唯一的文件名。

我建议使用 cachebuster 哈希 - 这样您可以确保新文件总是被浏览器请求,并且如果您在自己的服务器上托管文件,则可以使用长缓存寿命标头。例如,您可以创建缩小文件的 MD5 散列并附加它(如mycss-322242fadcd23.css)。或者您可以使用源代码控制系统的修订号。您必须在指向此文件的所有链接中使用缓存破坏器,但您通常可以在嵌入静态资源的模板中轻松执行此操作。根据您的应用程序,您可能会使用应该为您完成这项工作的这个 Django 插件。

于 2012-09-18T18:37:30.953 回答