Requirejs 对于AMD模块,何时(或为什么)可以在define()中使用require()?

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()'

我对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()'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
。)


使用本地
的原因要求

  • 由于运行时的条件,您不知道在构建时(或加载时)需要哪些模块
  • 您明确希望延迟加载某些模块,直到需要它们
  • 您希望根据功能检测的结果加载模块的变体(尽管类似dojo的“has!”插件可能是更好的解决方案(对不起,链接避开了我))
  • 最后,AMD定义了
    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”调用入口点。