cachingJavaScript文件

使浏览器使用js文件的caching版本(从服务器端)是最好的方法?

看看雅虎! 提示: http : //developer.yahoo.com/performance/rules.html#expires 。

还有Google提示: https : //developers.google.com/speed/docs/best-practices/caching

或在.htaccess文件中

AddOutputFilter DEFLATE css js ExpiresActive On ExpiresByType application/x-javascript A2592000 

从PHP:

 function OutputJs($Content) { ob_start(); echo $Content; $expires = DAY_IN_S; // 60 * 60 * 24 ... defined elsewhere header("Content-type: x-javascript"); header('Content-Length: ' . ob_get_length()); header('Cache-Control: max-age='.$expires.', must-revalidate'); header('Pragma: public'); header('Expires: '. gmdate('D, d MYH:i:s', time()+$expires).'GMT'); ob_end_flush(); return; } 

为我工作。

作为一名开发人员,您可能很快就会遇到想要文件caching的情况,在这种情况下,请参阅“ 积极进行JavaScriptcaching的帮助”

我刚刚完成了我的周末项目cached-webpgr.js ,它使用localStorage / web存储来cachingJavaScript文件。 这种方法非常快。 我的小testing显示

  • 从CDN加载jQuery:Chrome 268ms ,FireFox: 200ms
  • 从localStorage加载jQuery:Chrome 47ms ,FireFox 14ms

实现这个代码很小,你可以在我的Github项目https://github.com/webpgr/cached-webpgr.js查看;

这里是一个完整的例子如何使用它。

完整的库:

 function _cacheScript(c,d,e){var a=new XMLHttpRequest;a.onreadystatechange=function(){4==a.readyState&&(200==a.status?localStorage.setItem(c,JSON.stringify({content:a.responseText,version:d})):console.warn("error loading "+e))};a.open("GET",e,!0);a.send()}function _loadScript(c,d,e,a){var b=document.createElement("script");b.readyState?b.onreadystatechange=function(){if("loaded"==b.readyState||"complete"==b.readyState)b.onreadystatechange=null,_cacheScript(d,e,c),a&&a()}:b.onload=function(){_cacheScript(d,e,c);a&&a()};b.setAttribute("src",c);document.getElementsByTagName("head")[0].appendChild(b)}function _injectScript(c,d,e,a){var b=document.createElement("script");b.type="text/javascript";c=JSON.parse(c);var f=document.createTextNode(c.content);b.appendChild(f);document.getElementsByTagName("head")[0].appendChild(b);c.version!=e&&localStorage.removeItem(d);a&&a()}function requireScript(c,d,e,a){var b=localStorage.getItem(c);null==b?_loadScript(e,c,d,a):_injectScript(b,c,d,a)}; 

调用图书馆

 requireScript('jquery', '1.11.2', 'http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js', function(){ requireScript('examplejs', '0.0.3', 'example.js'); }); 

在你的Apache .htaccess文件中:

 #Create filter to match files you want to cache <Files *.js> Header add "Cache-Control" "max-age=604800" </Files> 

我也在这里写过:

http://betterexplained.com/articles/how-to-optimize-your-site-with-http-caching/

我非常想要把它作为一个副本来closures它。 这个问题似乎在整个网站上以许多不同的方式回答:

  • 将扩展PHP的HTML脚本标记脚本将被caching?
  • 浏览器什么时候自动清除外部JavaScript文件的caching?
  • 帮助积极的JavaScriptcaching
  • 如何在所有浏览器上控制网页caching?
  • 如何让浏览器看到CSS和Javascript的变化?

但对于现代浏览器,你可以使用这样的新东西: http : //www.w3schools.com/html/html5_app_cache.asp

最好的(也是唯一的)方法是设置正确的HTTP头,特别是“Expires”,“Last-Modified”和“Cache-Control”。 怎么做取决于你使用的服务器软件。

在提高性能…寻找“优化在服务器端”的一般考虑和相关的链接和“客户端caching”为Apache的具体build议。

如果你是像我这样的nginx (或简单英语的nginx)的粉丝,你也可以轻松configuration它:

 location /images { ... expires 4h; } 

在上面的例子中,来自/ images /的任何文件都将被caching在客户端上4个小时。

现在当你知道正确的词语(HTTP头文件“Expires”,“Last-Modified”和“Cache-Control”)时,只需仔细阅读所使用的Web服务器的文档即可。

我有一个简单的系统是纯粹的JavaScript。 它检查从不caching的简单文本文件中的更改。 当您上传新版本时,此文件已更改。 只要把下面的JS放在页面的顶部。

  (function(url, storageName) { var fromStorage = localStorage.getItem(storageName); var fullUrl = url + "?rand=" + (Math.floor(Math.random() * 100000000)); getUrl(function(fromUrl) { // first load if (!fromStorage) { localStorage.setItem(storageName, fromUrl); return; } // old file if (fromStorage === fromUrl) { return; } // files updated localStorage.setItem(storageName, fromUrl); location.reload(true); }); function getUrl(fn) { var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", fullUrl, true); xmlhttp.send(); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState === XMLHttpRequest.DONE) { if (xmlhttp.status === 200 || xmlhttp.status === 2) { fn(xmlhttp.responseText); } else if (xmlhttp.status === 400) { throw 'unable to load file for cache check ' + url; } else { throw 'unable to load file for cache check ' + url; } } }; } ; })("version.txt", "version");