jQuery和缓存 - 它如何工作,检测当前缓存和&版本等

时间:2012-06-09 05:33:49

标签: jquery browser-cache

The Crux:浏览器如何利用缓存,加载特定于网页的缓存内容,还是从其他页面访问脚本?

具体案例 如果我正在加载jQuery,我会假设在加载之前检查它是否在用户缓存中是最佳做法,对吗?但是,如果我运行缓存副本,我需要确保它是兼容版本。如果没有,我加载我的jquery版本,但现在还没有加载两个副本?除非没有冲突模式,否则自然会带来很多问题。

广泛的Concetp: 所以我想我的问题主要与浏览器缓存的工作方式有关。如果用户已经从另一个网站上的Google CDN加载了jQuery,并且我正在使用Google CDN版本,那么它会再次从Google加载吗?或者来自其他CDN的相同jQuery版本,例如Microsoft或jQuery CDN?或者浏览器是否只访问其获取的特定页面的缓存?

类似情况: 最后但并非最不重要的。我们假设我在超低带宽上运行,或者和平核心中的朋友需要充分利用她有限的访问权限。如何将所有公共脚本库存储在本地并访问,而不是每次都在线加载?当然,完全阻止javascript会更好,但是如果它对功能有必要的话。对我来说,opera用户脚本函数,greasemonkey,html5本地存储或一些缓存工具都是可能的,但在我的搜索中,我没有找到任何我知道如何运行的东西。而且我非常确定我并不是真的完全理解所有这些都知道如何继续下去。

非常感谢你!

1 个答案:

答案 0 :(得分:2)

  

浏览器如何利用缓存,加载特定于网页的缓存内容,还是从其他页面访问脚本?

然而,每个浏览器都希望它能够运行。通常,托管的每个文件(无论是脚本,html,图像)都有一个过期时间来告诉浏览器何时重新下载文件。有时浏览器会按配置覆盖(默认情况下或由用户覆盖)。

当您说来自其他页面的脚本时,您的意思是:

//Option 1 - remote script
<script src="somesource" type="javascript/text"></script>

//Option 2 - inline script
<script type="javascript/text">
$(document).ready(function()....);
</script>

使用选项1,如果网址完全匹配,浏览器通常会重复使用已下载的 somesource 。使用选项2,代码是页面的一部分,每次都必须下载,因为它是HTML代码。

  

如果我正在加载jQuery,我假设在加载之前检查它是否在用户缓存中是最佳做法,对吗?

我假设您只是从远程主机编写页面并使用标准Web浏览器(例如Chrome,IE,FireFox等)。在这种情况下,您无权访问缓存,也无法检测浏览器是否已缓存脚本。不仅无关紧要,浏览器还是会决定是否重新下载(选项1)。

此外,您似乎对浏览器的工作方式感到困惑。在页面的每个请求中,通常,浏览器清空任何图像,html,css,javascript或任何其他资源,并抓取指定的URL。如果指定的主请求指向另一个辅助+请求(脚本/ img / css等),则它返回到选项1并根据需要/配置加载该辅助+请求。据我所知,网页浏览器不会为每个请求加载二级请求,因为它会为任何请求加载它,因为这会导致大量问题。

  

所以我想我的问题主要与浏览器缓存的工作原理有关。如果用户已经从另一个网站上的Google CDN加载了jQuery,并且我正在使用Google CDN版本,那么它会再次从Google加载吗?或者来自其他CDN的相同jQuery版本,例如Microsoft或jQuery CDN?

这又取决于每个浏览器。一般来说,如果两个独立的网站使用相同的请求网址(例如,谷歌CDN上的jquery),那么浏览器很可能会使用缓存版本(选项1)。

如果两个独立的网站请求一个名称相同的文件名但使用不同的URL,则很可能(通常)每个网站都会被下载,因为网络浏览器不能100%确定文件是否相同只是基于名字。

  

如何将所有公共脚本库存储在本地并访问,而不是每次都在线加载?

我不相信你可以手动告诉网页浏览器使用开箱即用的本地资源(参见我的最终评论)。如果您真的打算创建小带宽应用程序,我建议在谷歌上查找如何做到这一点的资源(主要是搜索移动内部产品和解决方案,如jquery mobile)。

在本地加载资源

你当然可以这样做,虽然我仍然不会推荐它。您可以做的是在PC上本地加载Web服务器(IIS Express,ISS,Apache,等等)。然后,您可以在本地加载DNS服务器或编辑主机文件。如果您将主机文件更改为:

127.0.0.1 ajax.googleapis.com

这将使https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js的请求实际从本地Web服务器请求该文件。您在本地Web服务器上运行的应用程序可以确定该文件是否为本地文件并使用本地版本,如果不使用外部DNS来确定IP并下载它。

这一切都很好,但它几乎就是网络浏览器的功能。这个唯一的优点就是在本地计算机上预加载脚本,但这似乎是一些不必要的额外工作。