javascript - 是否有一个设计模式/系统可以延迟加载捆绑的 AMD 模块而不加载我已经下载的模块?

标签 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 模块及其依赖项,但不支持客户端已有的依赖项,也许通过某种方式与服务器通信客户端拥有的模块?

最佳答案

Is there a system/framework/pattern that supports the requesting AMD modules and their dependencies but not the dependencies the client already has, perhaps by somehow communicating to the server the modules the client has?

您似乎忽略了 AMD 的要点,因为这正是它的作用 - 如果 module_X 已经加载,则不会再向服务器请求 module_X.

从问题的字里行间看,我认为你没有正确地表达它。我想情况是这样的:

您没有在模块定义的开头指定所有模块依赖项。使用嵌套的内部需求,您可以延迟加载一些依赖项,直到需要它们为止。结果,您发现内部 require 加载您已经声明为外部依赖项的一部分或另一个内部 require 依赖项的一部分的依赖项。

如果这是问题所在,那么简短的答案是嵌套的 require 需要外部 require 的加载上下文。这是通过将 require 本身指定为依赖项来完成的

require(["require", /* other deps */], function(require, ...){
   require(["module_a_1","module_X"], function(moda1,modx){ /*... */});
   require(["module_b_1","module_X"], function(modb1,modx){ /*... */});
}

这在 RequireJS 自己的文档中没有得到很好的记录。请参阅https://github.com/jrburke/requirejs/issues/173了解更多详情。

关于javascript - 是否有一个设计模式/系统可以延迟加载捆绑的 AMD 模块而不加载我已经下载的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24583465/

相关文章:

javascript - Jquery,当屏幕宽度为 1050px 时删除类

javascript - 尝试替换输入值会导致 TypeError : input. 替换不是函数

android - 如何在惰性列表中使图像更大(高度)

ajax - 从 LazyDataModel#load() 抛出的异常不会被 ExceptionHandler 捕获

java - 无法写入 JSON : failed to lazily initialize a collection of role: com. Managem.model.Region.pays,无法初始化代理 - 无 session

javascript - 使用 slider 更新 D3 热图颜色范围

javascript - Angular.noop 有什么用?

javascript - 使用 require.js 实现 jQuery 的正确方法

linux - AMD GPU 无法在 Linux 上使用 Blender 的 "Cycles Render"

javascript - 如何以 AMD/RequireJS 风格定义 "type"