是否有一个设计模式/系统用于延迟加载捆绑的AMD模块而没有加载模块我已经下载了?

时间:2014-07-05 05:55:48

标签: javascript lazy-loading amd

假设我有一个围绕AMD模块构建的大型单页应用程序。当用户第一次访问此应用程序的首页时,我们希望初始JS有效负载相当轻,因此我们只加载最小的JS来设置应用程序并加载首页。用户可以从那里做“动作A”或“动作B”。每个“操作”都需要加载新模块("module_a""module_b")。

module_a的依赖关系是module_a_1module_a_2module_a_3module_X module_b的依赖关系是module_b_1module_b_2module_b_3module_X

请注意,这两个模块都依赖于module_X

现在,如果用户执行“操作A”,我们会告诉我们想要的服务器module_a。服务器将module_a及其所有依赖项捆绑到响应中。如果用户再次执行“操作A”,则客户端知道我们已经拥有module_a,因此不必下载任何新内容。这很容易。

但是假设用户执行“动作A”,不久之后,执行“动作B”。显然,我们需要下载module_bmodule_b_1,但客户已经有module_X 。如果module_Xmodule_b请求捆绑在一起,那将是一种耻辱,因为我们已经有module_X

是否有支持请求AMD模块及其依赖关系的系统/框架/模式,但不支持客户端已经拥有的依赖关系,可能通过某种方式与服务器通信客户端所拥有的模块?

1 个答案:

答案 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