gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:41:40 25 4
gpt4 key购买 nike

我对 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([dependancies], fnDefinition) 传递。功能,而不是通过 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 的原因:
  • 由于运行时条件,您不知道在构建时(或在加载时)需要哪些模块
  • 您明确希望延迟加载某些模块,直到需要它们
  • 您想根据特征检测结果加载模块的变体(尽管类似 dojo 的“has!”插件可能是更好的解决方案(对不起,链接躲避我))

  • 最后,AMD 定义了 require 的第二种用法。为了与在 CommonJS Modules/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来电。

    关于requirejs - 对于 AMD 模块,何时(或为什么)可以在 define() 中使用 require()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7835116/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com