处理多个requirejs上下文之间的公共依赖关系的实践?

时间:2013-02-15 19:49:38

标签: javascript module requirejs single-page-application

我已经开始使用requirejs上下文作为一种分区大型单页面应用程序的方法,该应用程序由具有各自依赖关系的各个独立SPA组成。

James Burke描述了我在github上关于多个上下文及其共同依赖关系未被共享的评论中遇到的问题https://github.com/aurajs/aura/pull/170#issuecomment-10973485

如何在不对同一文件造成重复请求的情况下共享不同requirejs上下文之间的公共依赖项?

2 个答案:

答案 0 :(得分:1)

我遇到了和你描述的问题相同的问题。我写了一个插件,负责共享嵌套上下文之间的公共依赖项。

Requirejs有一个包含所有上下文的映射,它定义了依赖项:

requirejs.s.contexts

{
  _: {
    defined: {
      commondep: {},
      main: undefined
    }
  }
  plugin: {
    defined: {
      commondep: {},
      plugin: {}
    }
  }
}

_ context是主要的上下文。我们可以使用此上下文来确定所有全局模块定义。可以通过预加载插件脚本并将依赖项与全局依赖项进行比较来确定共享依赖项。可以将共享模块注入沙箱上下文:

function injectDependency(dependencyName, contextName) {
  var ctx = getContext(contextName);
  var dependencyInstance = require(dependencyName);

  ctx.defQueue.push([ dependencyName, [], function() { return dependencyInstance; }]);
}

function getContext(contextName) {
  return requirejs.s.contexts[contextName];
}

在这个片段中,我们以非异步方式调用require来获取模块的全局实例。通过将模块推送到定义队列中,将模块注入沙箱中。

可以从https://github.com/igsp/requireplug下载插件加载器的此解决方案的实现。

我在博客上发布了有关此解决方案机制的更详细说明: https://intergalacticspacepocket.wordpress.com/2014/08/07/nesting-requirejs-contexts-with-shared-dependencies/

答案 1 :(得分:0)

您可能希望查看browserify以收拾大型多模块js应用程序。