如何在节点js中缓存客户端的.js文件

时间:2014-09-09 12:56:50

标签: javascript node.js caching express

我有一个节点服务器,它将响应(.js文件)以及其他详细信息提供给客户端。我希望它应该发送一次.js文件。在客户端,.js文件应保存在缓存中。 因此,当有任何请求来到服务器时,如果已经有可用于该.js文件的缓存,则不应再次下载它。 为此,我面临着高CPU使用率。

提前致谢。

3 个答案:

答案 0 :(得分:0)

您可以使用express.static提供静态文件(html,css或js),指向项目中的文件夹,如下所示:

app.use(express.static(__dirname + '/public'));

有关详细信息,请参阅此链接:http://blog.modulus.io/nodejs-and-express-static-content

答案 1 :(得分:0)

浏览器应该为您执行此缓存工作,但似乎您需要自己实现此功能。如果您仍需要实现自己的缓存,请考虑到这一点:

  • 您需要一种方法来保存缓存条目
  • 您需要一个缓存政策(例如何时退课等)

对于第一个问题,我建议使用浏览器端持久性,我建议使用localStorage,cookie或类似的,因为它不是100%跨浏览器,相反,我建议使用像 persist.js https://github.com/jeremydurham/persist-js

这样的填充程序

为解决第二个问题,我建议使用文件ID,这些ID可以在服务器端从内容计算(使用SHA摘要),这样可以在需要时更改JS文件(基于内容的身份,像GIT)

例如,你可以这样做

store = new Persist.Store('My Application');
function loadCachedJs(sha, loadedCallback) {
  var jsCode = store.get(sha);
  if (jsCode) {
    // the js is on cache!, you can load it without going to server
    setTimeout(
      function() {
        eval(jsCode);
        loadedCallback();
      }
    );
  } else {
    // the js is not on cache, you need to go to server
    // but is only for this first time
    $.get("/.../.../" + sha + ".js", function(res) {
      // store the result on cache
      storeJsOnCache(sha, res.data);
      eval(res.data);
      loadedCallback();
    });
  }
}
function storeJsOnCache(jsCode) {
  store.set(sha, jsCode);
}

然后,在你的代码的某些部分,你得到"加载某些sha"的js文件,你调用loadCachedJs:

...
loadCachedJs(sha, function() {
  // JS loaded, do what you need to do with this js file
});

并且,在服务器端,您将需要实现返回与SHA

对应的JS的端点

答案 2 :(得分:0)

如果您的浏览器没有缓存响应对象,则可能无法正确实现HTTP缓存标头。

这些人对HTTP缓存有一个非常深入的答案:http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/

当然,谷歌还有很多其他人。