假设我有一个围绕AMD模块构建的大型单页应用程序。当用户第一次访问此应用程序的首页时,我们希望初始JS有效负载相当轻,因此我们只加载最小的JS来设置应用程序并加载首页。用户可以从那里做“动作A”或“动作B”。每个“操作”都需要加载新模块("module_a"
和"module_b"
)。
module_a
的依赖关系是module_a_1
,module_a_2
,module_a_3
和module_X
module_b
的依赖关系是module_b_1
,module_b_2
,module_b_3
和module_X
请注意,这两个模块都依赖于module_X
。
现在,如果用户执行“操作A”,我们会告诉我们想要的服务器module_a
。服务器将module_a
及其所有依赖项捆绑到响应中。如果用户再次执行“操作A”,则客户端知道我们已经拥有module_a
,因此不必下载任何新内容。这很容易。
但是假设用户执行“动作A”,不久之后,执行“动作B”。显然,我们需要下载module_b
,module_b_1
等,但客户已经有module_X
。如果module_X
与module_b
请求捆绑在一起,那将是一种耻辱,因为我们已经有module_X
。
是否有支持请求AMD模块及其依赖关系的系统/框架/模式,但不支持客户端已经拥有的依赖关系,可能通过某种方式与服务器通信客户端所拥有的模块?
答案 0 :(得分:1)
是否有支持请求AMD模块及其依赖关系的系统/框架/模式,但不支持客户端已经拥有的依赖关系,可能通过某种方式与服务器通信客户端所拥有的模块?
似乎你错过了AMD的观点,因为它正是它的作用 - 如果module_X
已经加载,那么module_X
将不再有require
的请求1}}。
在问题的界限之间阅读,我认为你没有正确地陈述它。我认为情况是这样的:
您未在模块定义的开头指定所有模块依赖项。使用嵌套的内部需求,您可以延迟加载某些依赖项,直到它们需要它为止。因此,您发现内部需要加载已经声明为外部依赖项的一部分的依赖项,或者作为另一个内部需求依赖项的一部分。
如果这是问题,那么简短的回答是嵌套的需要需要外部需求的加载上下文。这是通过将require(["require", /* other deps */], function(require, ...){
require(["module_a_1","module_X"], function(moda1,modx){ /*... */});
require(["module_b_1","module_X"], function(modb1,modx){ /*... */});
}
本身指定为依赖
{{1}}
这在RequireJS自己的文档中没有很好地记录。有关详细信息,请参阅https://github.com/jrburke/requirejs/issues/173。