除了“定义”之外,AMD加载器是否需要一种启动模块解析的方法?

问题描述 投票:4回答:2

在讨论我正在研究的最小AMD加载器的切向相关方面时,James Burke写道:

应该有一些方法来启动模块的解决,除了define()。 define()调用本身应该只注册模块定义的存在,但不能立即执行工厂函数。这将更接近人们对其他加载器的期望以及它如何更紧密地匹配动态加载模块的行为,其工厂函数仅被调用,因为它们是顶级加载依赖关系树的一部分。

如果有人知道AMD,那就是这个人。但是,我想知道他是否可能误解了我的装载机是如何工作的。它不会立即执行工厂,但会在调用define时立即开始解析依赖关系。

基本上,我的加载器使用define来做同样的事情,RequireJS使用全局require,这对我来说很有意义,因为这些函数的功能非常相似,而且它们的签名几乎相同。


new threadAMD implementers mailing list,我回答说:

我正在研究的AMD加载器没有特殊的方法来启动模块解析。整个API是全球define功能。调用define时,会立即加载任何依赖项(如果它们尚未开始加载)。当链中的所有依赖项都完成加载时,工厂将执行。

到目前为止,这对我的目的来说已经足够好了,但有一些警告我不知道了吗?有一个单独的函数来启动模块解析的原因是什么,而不是在遇到所有依赖关系后立即解决依赖关系并立即运行工厂?


那个列表没有大量的流量,所以我在这里交叉。我想从定期使用AMD加载器的任何人那里得到一些意见。你能预见到使用define而不是单独的功能来解决问题吗?我完全尊重詹姆斯对此的看法,但我不知道他是否已经习惯了那种做任何其他看似错误的问题的方法,即使它在实践中运作良好。

概括:

  • 调用define时,列表中的所有依赖项都会开始加载(如果尚未启动)。
  • 当所有依赖项都准备就绪(具有导出值)时,工厂将运行。
  • 这是整个API,没有全球require

除了来自RequireJS的人不熟悉之外,这种方法有什么问题(如果有的话)?


更新:thread上发生了一些活动。到目前为止,它看起来像是一个急切加载与延迟加载的场景。我仍然认为急切加载可能是一种可行的方法,但希望得到更多来自其他人的意见。


针对这个问题的回答:如果问题可以改进,请告诉我如何改进。我尽可能地清楚;如果有其他需要澄清的东西,或者其他原因这个问题看起来质量很差,请引起我的注意,我会解决它。

javascript amd loader
2个回答
2
投票

有一个单独的函数来启动模块解析的原因是什么,而不是在遇到所有依赖关系后立即解决依赖关系并立即运行工厂?

是的,正如在该线程中已经提到的那样,它是用于延迟加载的。 define确实注册了一个回调来创建一个模块,而require实际上触发了加载并创建了模块实例。

AMD是围绕这个想法而建立的,但并不需要它。 From the spec

全球require()函数是全球范围内可用的函数,如define()。实现全局require不需要实现,但如果确实如此,全局require的行为类似于本地require()函数的行为,具有以下资格:[...]

通常有依赖于实现的API将启动模块加载;如果需要与多个加载器的互操作性,则应使用全局require()来加载顶级模块。

建立一个热切的装载机很好,并且符合规范。


1
投票

在我编写的AMD-loader中,我只使用了require()的以下(可选)定义:

function require(deps, callback) {
  define(1, deps, callback);
}

由于lockandload AMD-loader中的实现细节使用1作为define()的第一个参数导致与require()的功能等价。

IOW:如果人们想要一个require(),一旦你拥有define()就很便宜。我无法想象其他装载机的差异会大得多。它还意味着没有迫切需要用另一个函数来污染全局空间,除非你认为它提高了代码的可读性。

© www.soinside.com 2019 - 2024. All rights reserved.