requirejs:缓存本地存储?

requirejs: cache with local storage?

你知道有没有一个框架可以添加由requirejs加载的脚本的本地存储缓存?我一直在努力使它自己工作,但回退路径功能本质上很难实现。

这是我得到的,它不适用于那些使用相对模块引用的文件。

// Inspired by https://github.com/andrewwakeling/requirejs-basketjs/blob/master/basket-loader.js
(function (rjs) {
  rjs.load = function (context, moduleName, url) {
    var storage = window.localStorage;
    var hash = computeHash(moduleName);
    var key = 's' + hash;
    console.log(url);
    if (storage && storage[key] !== undefined) {
      complete(context, moduleName, storage[key]);
    }

    fetch(context, moduleName, url);
  }

  function complete(context, moduleName, data) {
    var hash = computeHash(moduleName);
    var node = document.getElementById('rjs-mod-' + hash);

    if (!node) {
      node = document.createElement('script');
      node.id = 'rjs-mod-' + hash;
      node.type = 'text/javascript';
      node.charset = 'utf-8';
      node.defer = true;
      node.text = data;
      document.head.appendChild(node);
    }

    window.setTimeout(function() {
      context.completeLoad(moduleName);
    }, 0);
  }

  function fetch(context, moduleName, url) {
    var hash = computeHash(moduleName);
    var tmp = complete;

    // alas, hackish...
    $.get(url).done(function (data) {
      window.localStorage['s' + hash] = data;
      tmp(context, moduleName, data);
    }).fail(function (err) {
      // fallback ...
      context.onError(err);
    });
  }

  function computeHash(moduleName) {
    var pos = moduleName.lastIndexOf('/');
    if (pos !== -1)
      moduleName = moduleName.substr(pos, 1);

    return moduleName.hashCode();
  }

} (requirejs));

所以我的问题不是有人纠正我的代码,而是你们是否知道一个将 requirejs 封装在本地存储功能中的框架!

我在 Twitter 上问了 James Burke,这是他的回复:

@parmaeldo not off the top of my head, but have heard of it. Override requirejs.load to do it. Or, if an option for the site, use appcache

— James Burke (@jrburke) 31 januari 2015