在讨论我正在研究的最小型AMD加载器的切向相关方面时,James Burke写道:
除了define()之外,应该有一些方法来启动模块的解决方案。 define()调用本身应该只注册模块定义的存在,但不能立即执行工厂函数。这将更接近人们对其他加载器的期望以及它如何更紧密地匹配动态加载模块的行为,其工厂函数仅因为它们是顶级加载依赖树的一部分而被调用。
如果有人知道AMD,那就是这个人。但是,我想知道他是否可能误解了我的装载机是如何工作的。它不会立即执行工厂,但会在调用define
时立即开始解析依赖项。
基本上,我的加载器使用define
来表示同样的事情,RequireJS使用全局require
,这对我来说很有意义,因为函数的功能非常相似,而且它们的签名几乎相同。
在new thread的AMD implementers mailing list我回复了:
我正在开发的AMD加载器没有特殊的方法来启动模块解析。整个API是全局
define
函数。调用define
时,会立即加载任何依赖项(如果它们尚未开始加载)。当链中的所有依赖项都加载完毕后,工厂就会执行。到目前为止,这对我的目的来说已经足够好了,但是有一些警告我错过了吗?有一个单独的函数来启动模块解析的原因是什么,而不是在遇到所有依赖关系后立即解决依赖关系并立即运行工厂?
该列表没有获得大量流量,所以我在这里交叉。我想从定期使用AMD加载器的任何人那里得到一些意见。您是否可以预见使用define
而不是单独的功能来解决问题?我完全尊重詹姆斯对此的看法,但我不知道他是否已经习惯了那种做任何其他看似错误的问题的方法,即使它在实践中运作良好。
回顾:
调用define
时,列表中的所有依赖项都会开始加载(如果尚未启动)。
当所有依赖项都准备就绪(具有导出值)时,工厂运行。
这是整个API,没有全球require
。
除了来自RequireJS的人不熟悉之外,这种方法有什么问题(如果有的话)?
更新:thread上发生了一些活动。到目前为止,它看起来像是一个急切加载与延迟加载的场景。我仍然认为急切加载可能是一种可行的方法,但希望得到更多来自其他人的意见。
针对此问题的回答:如果问题可以改进,请告诉我如何可以改进。我尽可能地清楚;如果还有其他需要澄清的东西,或者其他原因,这个问题看起来质量很差,请引起我的注意,我会解决它。
答案 0 :(得分:2)
有一个单独的函数来启动模块解析的原因是什么,而不是在遇到所有依赖项后立即解决依赖关系并立即运行工厂?
是的,正如在该线程中已经提到的那样,它是用于延迟加载的。 define
注册回调来创建模块,而require
实际上会触发加载并创建模块实例。
全局
require()
函数是全局可用的函数 范围,如define()
。实施不需要实施 全局require
,但如果确实如此,则全局require
的行为是 类似于本地require()
函数的行为,与 以下资格:[...]通常会有依赖于实现的API 模块加载;如果需要与几个加载器的互操作性, 全局
require()
应该用于加载顶级模块 代替。
构建一个热切的加载器很好,并且符合规范。
答案 1 :(得分:1)
在我编写的AMD加载器中,我只使用了require()的以下(可选)定义:
Running "flutter packages get" in flutterfoodorderingapp...
The current Dart SDK version is 2.1.0-dev.4.0.flutter-050561fd82.
Because food_ordering_app depends on flutter_map <0.1.0 which requires
SDK version >=1.8.0 <2.0.0, version solving failed.
pub get failed (1)
由于在lockandload AMD-loader中使用function require(deps, callback) {
define(1, deps, callback);
}
作为1
的第一个参数的实现细节,导致与define()
的功能等效。
IOW:如果人们想要一个require()
,那么一旦拥有require()
时创建它很便宜。我无法想象其他装载机之间的差异会更大。这也意味着没有紧迫的需要用另一个函数来污染全局空间,除非您认为它可以提高代码的可读性。