2012-07-04 42 views
0

我看看this question,我必须说它不符合我目前的问题/审讯。一页JavaScript应用程序和缓存静态资源

方案:用户成功登录(通过Ajax调用),他们将被重定向(document.location.href)到/应用程序,其中基本HTML与CSS和JS文件一起发送

后。

问题:

我目前把版本号上类似应用程序的名字,2.3.3.js我的精缩JavaScript和CSS文件名,并添加了查询字符串的版本号,以确保它得到新版本前刷新:

<script src="/js/app/appname-2.3.3-min.js?1207040740" language="javascript" type="text/javascript"></script> 

当我推一个新的版本,新的登录后,即使文件名和查询字符串的数字变化,浏览器保持最新版本缓存。用户需要刷新整个页面CTRL + F5才能获得新的静态文件。

问:

一)什么是保证每一个新的登录用户的最佳途径有正确的版本?我的猜测是/ app的HTML页面是缓存的,也许我需要在登录后重定向时将查询字符串值。但是,这带来了问题,即调用登录方法的JavaScript文件必须是“正确”的版本等,等等。

我应该在控制器中指示一个HTTP头,告诉浏览器不要缓存/应用页面?这是否意味着没有从该页面缓存静态文件?

几乎每周都有新的更新,仍然需要缓存。

b)从您的角度来看,如果警告已登录的用户已更新新版本并且应刷新其页面,那么用户体验的好方法是什么?从用户的视角来看,它是“可接受的”吗?

以供参考,该应用程序是建立在ASP.NET MVC您的时间/输入

+1

浏览器的开发工具有一个“网络”选项卡,您可以在其中检查为每个网页请求哪些资源。如果查询字符串包含一个新的号码,浏览器应该检索新的更新文件,而不是使用缓存的一个...(顺便说一句,堆栈溢出利用这一技术,太) –

+0

我将与Net标签一看。但是,这是我的观点,假设pagea.html,即使在html标签上有新的数字,浏览器缓存pagea.html也是如此,所以即使你上传了版本号改变的新版本,pagea.html仍然是与前一个号码缓存? –

回答

1

您可以使用window.applicationCache为此3.

感谢。大多数人从问题的另一面考虑Application Cache:如何在客户端上缓存数据?但是,当缓存清单文件发生更改时,它会更新CACHE部分中的所有文件,完全忽略任何服务器缓存。您还将获得客户端缓存的好处。

这消除了版本号和查询字符串的需要,试图说服您的浏览器刷新。

manifest="cache.manifest"加到<html>cache.manifest是您将用来定义缓存内容的文件的名称。它可以被命名为任何东西,但我实际上称之为我的cache.manifest

<html lang="en" manifest="cache.manifest"> 

然后确保你的Web服务器有的MIME类型设置为:

文本/缓存清单

然后创建一个名为cache.manifest文件,把它放在你的应用程序根。在CACHE部分下,放置要缓存的文件(或者在本例中刷新)。在NETWORK部分下放置任何您不想缓存的文件,或者简单地将*用于“其他”。

每当您推送发行版时,都会更改缓存清单中的版本号。文件中的任何更改都可以正常工作,但版本号是完美的机制。

CACHE MANIFEST 
#ver 1.0.0 

CACHE: 
app.html 
app.css 
app.js 

NETWORK: 
* 

然后把它放在onload或同等版本的脚本的顶部。请注意,当你第一次添加到您的代码,刷新将不会在第一次更新发生(因为这功能不可用),但在。初步更新后,它将按预期工作。

function updateVersion(event) { 

    window.applicationCache.removeEventListener('updateready', updateVersion, false); 

    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) { 
     //perhaps notify user here 
     window.applicationCache.swapCache(); 
     window.location.reload(); 
    }; 

}; 

if (window.applicationCache) { 
    window.applicationCache.addEventListener('updateready', updateVersion, false); 
}; 
+0

谢谢,这是我正在寻找的,对于延迟感到抱歉,我需要时间才能测试它。 –

相关问题