我已经开始使用 requirejs 上下文作为对大型单页应用程序进行分区的一种方式,该应用程序由具有自己的一组依赖项的独立 SPA 组成。
James Burke 描述了我现在在 github 上的此评论中遇到的关于多个上下文及其共同依赖项未共享的问题,https://github.com/aurajs/aura/pull/170#issuecomment-10973485
如何在不同的 requirejs 上下文之间共享公共依赖项,而不会导致对同一文件的重复请求?
我已经开始使用 requirejs 上下文作为对大型单页应用程序进行分区的一种方式,该应用程序由具有自己的一组依赖项的独立 SPA 组成。
James Burke 描述了我现在在 github 上的此评论中遇到的关于多个上下文及其共同依赖项未共享的问题,https://github.com/aurajs/aura/pull/170#issuecomment-10973485
如何在不同的 requirejs 上下文之间共享公共依赖项,而不会导致对同一文件的重复请求?
我遇到了和你描述的一样的问题。我编写了一个插件,负责在嵌套上下文之间共享公共依赖项。
Requirejs 有一个包含所有上下文的映射,它定义了依赖项:
需要js.s.contexts
{
_: {
defined: {
commondep: {},
main: undefined
}
}
plugin: {
defined: {
commondep: {},
plugin: {}
}
}
}
_ 上下文是主要上下文。我们可以使用此上下文来确定所有全局模块定义。可以通过预加载插件脚本并将依赖项与全局依赖项进行比较来确定共享依赖项。共享模块可以注入沙箱上下文:
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下载此插件加载器解决方案的实现。
I posted a more detailed description of the mechanics of this solution on my blog: https://intergalacticspacepocket.wordpress.com/2014/08/07/nesting-requirejs-contexts-with-shared-dependencies/
您可能想查看browserify以打包大型多模块 js 应用程序。