如何让用户拥有最新的非缓存代码

How to let users have the latest non cached code?

本文关键字:缓存 代码 最新 拥有 用户      更新时间:2023-09-26

这是一种核心的web开发主题,也是一种很难搜索的主题。

我正在运行一个中等规模的网站~每天有2500个用户。我们每个月都在大力开发新功能。我们在GIT中设置了master、dev/master和其他一些开发分支。我们有一个临时服务器和一个开发服务器,我们都在本地工作,直到我们推送到dev。

然而,当我将更改推送到开发,甚至是实时时,通常情况下用户必须刷新缓存,否则他们会看到错误。

我们确实使用HTML5应用程序缓存,当我们更改清单时,将让所有文件重置。但是我们并没有对整个应用程序使用应用缓存,只是使用一些使应用程序更快的资源。

除了

应用缓存之外,这在我们的旧网站上仍然是一个问题,即使没有应用缓存。我知道你可以在JS和CSS文件之后做?但我希望用户缓存这些。它加快了他们的体验。

那么,如何让用户缓存内容以提高速度,但在我推送更新时获得最新的内容呢?大男孩们是怎么处理的?

谢谢!

我想在这里给出一个明确的答案,因为这个问题的解决方案非常棒。这基本上就是Kay说要做的。

在PHP中我们这样做define("GIT_HASH",exec(GIT." rev-parse --short HEAD 2>&1"));其中GIT是指向GIT bin的路径。linux是git, mac是/usr/local/bin/git

然后我们把我们的GIT哈希值放在JS中,用于require.js

<script>
    window.app_hash = '<?=GIT_HASH;?>' || '';
</script>

现在我们有了我们的哈希值,所以我们只是改变了require.js的配置

require.config({
baseUrl: '__' + app_hash,

对于硬编码的PHP url我们也有这个/css/main.css ">

最后我们使用了一个NGINX重写规则来允许这个
rewrite ^/__[^/]*/(.+) /$1 last;

对于apache在htaccess

RewriteRule ^__[^/]*/(.+) /$1

__是我们用于散列的前缀,只是为了更清楚。在NGINX中,最后一点是我们的其他规则被击中,而对于htaccess,你不需要这样做。

我们没有使用像?whatever这样的查询字符串的原因是一些浏览器永远不会缓存带有这样的查询字符串的url。我们不需要那样,我们需要缓存,只是在部署时不需要。

如果你不使用require.js -你将不得不改变你所有的url的语法,但这是值得的。

如果你使用的是html5应用程序缓存,请务必取出你在那里的任何css和js。

谢谢凯!

从我所读到的,浏览器缓存文件不同,当你添加一个查询字符串。我的解决方案是让url看起来像这样:

<script type="text/javascript" src="/resources/cacheholder1/js/site.js" />

每次构建项目并准备部署新版本时,我都会增加这个数字。当然,当你有几十或几百行这样的代码时,这是非常烦人的。因此,我编写了一个bash脚本来遍历我的项目并查找与以下模式匹配的任何内容:

/resources/cacheholder(#)/

然后取匹配的数字,增加它,并更新/保存文件。

当然,使用项目编号而不是任意编号可能更明智,只要您实际跟踪项目编号并且它是自动更改的。这对我们现在有效,所以我坚持使用它,但一直计划使用项目编号。

这应该缓存正确的文件,因为它是一个"新的"URL,而不仅仅是一个查询字符串的变化。同时,我还做了一些额外的配置来允许这个URL方案,因为"cacheholder"部分改变了(数字),所以你不能在你的项目中硬编码URL映射。

查询字符串的问题是浏览器不应该缓存带有查询字符串的请求,所以有一个做和不做之间的混合。我敢打赌,唯一能做到这一点的就是IE(因为我记得它确实发生过)。其他浏览器似乎遵循规范,不缓存带有querystring的请求。

asset?timestamp中的查询字符串使Firefox对每个请求都询问服务器。这是对资源和用户时间的浪费,即使您可以响应304。

我在我的项目中使用www.example.com/assets/<git hash>/name.js,它工作得很好。只有当内容被编辑时,修订才会改变,所以不会有不必要的查询。

静态内容设置为1个月过期:

<>之前最后修改:2013年3月28日星期四12:16:21 GMTCache-Control: public, max-age=2678400截止日期:2013年4月28日星期日14:00:58 GMTETag:"瓶- 1364472981.38 - 9149 - 1640239173"之前

在您的部署过程中,您必须替换布局文件中的<git hash>

当一个资产最后被修改时,你会得到修订:

git log --format=%h -1 -- path/to/asset.js