javascript(DOJO)文件缓存 - 客户端

时间:2014-05-27 15:59:18

标签: javascript dojo cache-control

我想实现javascript文件(Dojo工具包)的缓存,这些文件不会改变。目前我的主页需要大约15-17秒才能加载,刷新后需要5-6秒才能加载..但是当我们在新的浏览器会话中加载缓存文件时,有没有办法再次使用缓存文件..我不希望浏览器在新浏览器会话中加载应用程序主页时向服务器发出请求?还有一个选项可以将到期时间设置为特定天数。我尝试使用META标签并没有多大帮助。要么我做错了,要么我没有正确实现..

我已经实现了dojo压缩工具包,看到性能稍有改善但不显着..

2 个答案:

答案 0 :(得分:0)

通常你的浏览器应该已经这样做了。请检查是否真正启用了缓存,而不仅仅是会话。

但是,使用您的应用程序配置文件创建自定义dojo构建,使用dojo构建层,构建将所有代码放在一起并将其与dojo.js捆绑在一起(文件仍可独立使用)。结果只是对所有代码的一个http请求(更大的文件,但只有一次)。由于减少的http请求而获得的速度远远超过了缓存所能提供的速度。

有关详细信息,请参阅教程:http://dojotoolkit.org/documentation/tutorials/1.8/build/

答案 1 :(得分:0)

缓存是由浏览器完成的,其行为受 Cache-Control HTTP标头的影响(请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)。通常,浏览器会询问,如果有更新版本的资源可用,那么无论如何您都会获得每个资源的1个简短请求。

根据我的经验,即使是非常有侵略性的缓存,当指示浏览器在给定的时间段内不要求服务器上的资源版本时,在浏览器缓存中检查如此大量的资源是一个代价高昂的过程。

真正的解决方案是自定义构建。你已经写了一些关于" dojo compression"的东西,我假设你已经熟悉了Dojo build profiles。这是非常讨厌的文件,但是一旦你成功了,你应该有一些带有图层的大文件,格式如下:

require({cache:{
    "name/of/dojo/resource": function() { ... here comes the content of JS file ... }
    , ...
}});

它是一个多定义文件,用于内联单层内所有模块的定义。因此,加载此类文件将在单个请求中加载许多模块。但您必须加载图层。

为了让层运行,我必须为每个条目JS文件(HTML文件头中引用的那些文件)添加额外的需求:

require(["dojo/domReady!"], function(){
// load the layers
require(['dojo/dojo-qm',/*'qmrzsv/qm'*/], function(){

  // here is your normal dojo code, all modules will be loaded from the memory cache
  require(["dojo", "dojo/on", "dojo/dom-attr", "dojo/dom-class"...], 
  function(dojo,on,domAttr,domClass...){
    ....
  })
})
})

它显着改善了性能。瓶颈是加载大量的小javascript模块,而不是解析它们。一次加载和解析所有模块比按需加载数百个模块要便宜得多。