Requirejs 对于AMD模块,何时(或为什么)可以在define()中使用require()?
我对AMD模块(例如使用RequireJs或curl.js)的理解是:Requirejs 对于AMD模块,何时(或为什么)可以在define()中使用require()?,requirejs,js-amd,curljs,Requirejs,Js Amd,Curljs,我对AMD模块(例如使用RequireJs或curl.js)的理解是: require()用于异步加载不同的模块,加载后执行回调fn 要定义一个模块,您需要使用define() 但是我看到一些模块在其函数定义中使用require(),例如 define([a, b, c], function(i, ii, iii){ require([d, e, f], function(d, e, f) { // do some stuff with these require()'
require()
用于异步加载不同的模块,加载后执行回调fn
要定义一个模块,您需要使用define()
但是我看到一些模块在其函数定义中使用require()
,例如
define([a, b, c], function(i, ii, iii){
require([d, e, f], function(d, e, f) {
// do some stuff with these require()'d dependancies
})
/* rest of the code for this module */
})
但我觉得这很混乱,因为我认为如果模块具有依赖性,那么它们应该通过主define([dependencies],fnDefinition)
函数传递,而不是通过require()
传递,正如上面的示例所做的那样
这背后有什么原因吗?您可能希望在模块中使用
require()
但首先,请确保请求对正确的require
变量的引用。在您的示例中,对require
的引用是全局引用。您需要一个对require
的引用,该引用的作用域为模块的上下文(有时称为“本地require”)。这很简单:
define(["a", "b", "c", "require"], function(i, ii, iii, require){
require(["d", "e", "f"], function(moduleD, moduleE, moduleF) {
// do some stuff with these require()'d dependencies
})
/* rest of the code for this module */
});
这一点很重要的主要原因是确保正确解析相关模块ID(例如“/peerModule”或“/unclePath/cousinModule”)。(这是其中一个原因,curl.js默认情况下没有全局require
。)
使用本地
的原因要求
:
require
的第二种用法,以便与CommonJS模块/1.1中编写的模块兼容,然后将这些模块包装在define
中。这些看起来像这样:
define(function(require, exports, module){
var a = require("pkgZ/moduleA"), // dependency
b = require("pkgZ/moduleB"); // dependency
/* rest of the code for this module */
});
服务器端javascript开发人员可能会发现这种格式很吸引人。:)
一些AMD加载程序(如RequireJS 0.2+、dojo 1.7+、bdLoad和curl.js 0.6+)会检测到这种混合AMD/CJSM1.1格式,并通过扫描模块中的
require
调用来查找依赖项。我能找到的has.js的最佳链接:它没有解释插件,只是提到了它。如果有人有足够的点数来创建curljs标记,我会很感激的!:)因此,如果我有一个需要某些功能的模块,而这些功能在所有浏览器中都不可用,我可以将该模块定义为普通模块,然后在内部进行条件检查,然后要求()相关模块来填充缺少的功能,对吗?我假设在“构建时”,我仍然可以使用构建脚本缩小该模块,这样就不会像异步加载未缩小的模块脚本一样。正确,这就是has的目的!插件。目的是建立UA字符串*到功能配置文件的映射。您的服务器可以从预编译、连接的文件列表中为当前浏览器的UA字符串选择一个自定义优化的文件,也可以及时构建一个文件(并希望缓存以备将来使用)*应该注意的是,并不是每个人都“同意”重新引入UA嗅探!对于require.config()块之后指定的第一个入口点“require”,这是否成立?我将enforceDefine设置为true,这将配置块放在define()中,然后在config之后使用全局“require”调用入口点。