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

Javascript 如何在节点js中缓存客户端的.js文件,javascript,node.js,caching,express,Javascript,Node.js,Caching,Express,我有一个节点服务器,它向客户端提供响应(.js文件)和其他详细信息。我希望它应该发送一次.js文件。在客户端,.js文件应该保存在缓存中。 所以,当任何一个请求到达服务器时,若该.js文件已经有可用的缓存,那个么它就不应该再次下载它。 为此,我面临着高CPU使用率 提前感谢。您可以使用express.static指向项目中的文件夹,使用express提供静态文件(html、css或js),如下所示: app.use(express.static(__dirname + '/public'));

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


提前感谢。

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

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

有关更多信息,请参阅此链接:

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

  • 您需要一个方法来保存缓存项
  • 您需要一个缓存策略(例如何时取消缓存等)
对于第一个问题,我建议使用浏览器端持久化,我不建议使用localStorage、cookie或类似工具,因为它不是100%跨浏览器的,相反,我建议使用类似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的端点。如果您的浏览器没有缓存响应对象,则可能没有正确实现HTTP缓存头

这些人对HTTP缓存有一个非常深入的回答:


当然,谷歌上还有很多其他浏览器。

浏览器不会自动缓存JS文件吗?不,在我的场景中,它不会缓存它。太棒了:)很高兴我能帮上忙!