gpt4 book ai didi

javascript - 使用 requireJS 的模块定义的区别

转载 作者:行者123 更新时间:2023-11-30 12:37:37 24 4
gpt4 key购买 nike

requireJS 让我在 atm 上头疼。 requireJS 是 AMD,根据定义它是异步的。通常我会像这样定义一个模块。

define("some Name", ["./moduleOne"],function(moduleOne){

//this would be undefined
moduleOne.whatEver();

var aMethod = function(){
//user aModule.whatever();
}

return {
method: aMethod;
}
});

好的,我知道我不能直接使用 moduelOne.whatever,因为它是异步加载的,如果正在调用回调,它就不存在。

第一个问题,这是正确的吗?

现在,如果我将模块定义更改为:

define("some Name", function(require, exports){

var moduleOne = require(".moduleOne");

//this is OK
moduleOne.whatEver();

var aMethod = function(){
//user aModule.whatever();
}

exports.method = aMethod;
});

我可以直接使用 aModule.whatever。正如我从文档中读到的那样,使用这种 (commonJS) 样式,需要使用 Function.prototype.toString 解析函数,查看 require 语句并直接加载模块。

我很确定,我在这里误解了一些东西,如果有人能解释一下 requireJS 究竟是如何工作的,以及第二种风格是否真的是同步的,那就太好了。

谢谢

最佳答案

您误解了它的工作原理。

在您在问题中给出的两个示例中,执行顺序是:

  1. 有些东西需要名为 some_Name 的模块。 (我认为 RequireJS 不喜欢带有空格的模块名称,所以我假设模块名称带有下划线。)

  2. RequireJS 查找模块 some_Name 的依赖项和工厂函数。工厂是定义模块时提供给 define 的函数。

    一个。如果碰巧 define("some_Name"... 在这一步之前 被调用,那么 RequireJS 只会获取给 define< 的依赖项和工厂函数.

    如果 define("some_Name"... 尚未执行,RequireJS 将进入网络并尝试获取包含 define 调用的文件并执行它。按照惯例,这将是一个与模块名称同名的文件 + .js 扩展名,但这可以在 RequireJS 的配置中被覆盖。

  3. RequireJS 检查是否加载了依赖项。如果没有,则它会为尚未加载的每个依赖项发出 require 调用。

  4. RequireJS 使用已解析的依赖项调用工厂函数。

请注意,我没有在这里讨论所有可能的情况。为了简单起见,我坚持使用最常见的情况。

所以...

Ok, I got that I can't directly use moduelOne.whatever because it is loaded asynchronous and it's not there if the callback is being called.

First Question, is this correct?

不,这是不正确的。在 moduleOne.whatEver(); 执行时,模块 moduleOne 必须已经加载。如果 moduleOneundefined不是,因为 RequireJS 的异步性质,而是因为 moduleOne 的方式存在错误被定义为。例如,如果它导出值 undefined,则 moduleOne 将是未定义的。或者您可能会得到 moduleOne.whatEverundefined 值,这将在您尝试调用它时导致错误,但这可能是由于例如忘记导出 whatEver

第二种情况和第一种情况的区别在于,第二种情况使用 CommonJS 糖语法,这导致上面的步骤 2 有一些额外的处理。在 RequireJS 执行工厂之前,它会解析函数(如您所提到的),然后处理工厂函数,就好像定义的函数是这样调用的:

define("some_Name", ['require', 'exports', './moduleOne'], function (require, exports) {

requireexports 模块是RequireJS 内部定义的特殊模块。请注意 RequireJS 如何在依赖项列表的末尾添加 ./moduleOne。完成后,过程与第一种情况完全相同。

var moduleOne = require("./moduleOne"); 被执行时,模块已经被加载。所以这一行所做的只是返回对模块的引用。

关于javascript - 使用 requireJS 的模块定义的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25573440/

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