我们有很多人(超过1万)会定期返回我客户的网站,以使用我们为他们构建,改进和托管的Web应用程序。随着我们的应用程序的改进和发展,我们一直在对该Web应用程序的javascript进行向后不兼容的相当频繁的更新。在部署期间,将javascript缩小并连接成一个文件,由require.js加载到浏览器中,然后上传到Amazon S3并托管在Amazon S3上。在更新过程中,文件名和URL当前完全不变。上周,我们对Web应用程序进行了重大重构,并获得了一些(但不是很多)报告,称该应用程序停止了对某些人的工作,尤其是在Firefox中。似乎是一个缓存问题。最初我们可以在几个浏览器中进行测试,但是经过一两次刷新后,它似乎消失了。

我突然意识到,我真的不知道在S3上部署新版本的javascript文件(具有相同名称)的浏览器缓存会有什么影响,以及这种情况是否需要清除缓存或操作S3的 header 或其他内容。有人可以帮我解决这个问题吗?在部署过程中,我应该采取什么措施来确保浏览器立即获取新版本的javascript文件?如果没有,我们冒着JavaScript和服务器API不同步并失败的风险,我认为这是在这里发生的。

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

最佳答案

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

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

10-06 06:07
查看更多