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

时间:2013-03-28 13:56:44

标签: javascript css html5 caching web-applications

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

我正在运营一个中型网站〜每天2500个用户。我们每个月都在大力开发新功能。我们有一个GIT设置,包括master,dev / master和其他一些开发分支。我们有一个临时服务器和一个开发服务器加上我们都在本地工作,直到我们推送到dev。

但是,当我将更改推送到dev或甚至是live时,通常情况是用户必须刷新缓存,否则他们会看到错误。

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

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

那么,如何让用户缓存内容以提高速度,以及在推送更新时获取最新内容?大男孩怎么处理这个?

谢谢!

3 个答案:

答案 0 :(得分:2)

我想在这里给出一个明确的答案,因为解决方法很棒。这基本上就是凯所说的。

在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网址,我们也有此功能 /css/main.css">

最后我们使用了NGINX重写规则来允许这个

rewrite ^/__[^/]*/(.+) /$1 last;

对于htaccess中的apache

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

__是我们用于哈希的前缀,只是为了清楚。 NGINX中的最后一个是我们的其他规则被击中,而对于htaccess,你不需要它。

我们没有使用类似查询字符串的原因是什么?因为某些浏览器永远不会使用类似的查询字符串来缓存URL。我们不希望这样,我们需要缓存,而不是在部署时。

如果您没有使用require.js - 您必须将所有URL更改为语法,但值得信赖。

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

谢谢凯!

答案 1 :(得分:1)

从我读过的内容来看,当您添加查询字符串时,浏览器缓存文件会有所不同。所以我使用的解决方案是让URL看起来像这样:

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

每次构建项目并即将部署新版本时,我都会增加此数字。当然,当你有几十条/几百条线路时,这非常烦人。所以我编写了一个bash脚本来完成我的项目并查找符合以下模式的任何内容:

/resources/cacheholder(#)/

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

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

这应该正确缓存文件,因为它是一个“新”URL,而不仅仅是一个查询字符串更改。同时,我需要一些额外的配置才能允许这个URL方案,因为“cacheholder”部分会更改(数字),因此您无法对项目中的URL映射进行硬编码。

查询字符串的问题在于浏览器不应该使用查询字符串来缓存请求,因此在它们之间存在混合。我打赌唯一一个(因为我记得它发生)是IE。其他浏览器似乎遵循规范不使用查询字符串缓存请求。

答案 2 :(得分:0)

asset?timestamp中的查询字符串会导致Firefox向服务器询问每个请求。这是浪费资源和用户的时间,即使你可以回复304。

我在我的项目中使用www.example.com/assets/<git hash>/name.js,它运行正常。只有在编辑内容时,修订才会更改,因此不会有不必要的查询。

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

Last-Modified: Thu, 28 Mar 2013 12:16:21 GMT
Cache-Control: public, max-age=2678400
Expires: Sun, 28 Apr 2013 14:00:58 GMT
ETag: "flask-1364472981.38-9149-1640239173"

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

上次修改资产时,您将获得修订:

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