使用requireJS的模块定义的差异
Difference of module definitions using requireJS
requireJS让我头疼。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到底是如何工作的,以及第二种风格是否真的是同步的,那就太好了。
感谢
您误解了它的工作原理。
在您在问题中给出的两个示例中,执行顺序为:
-
有些东西需要名为
some_Name
的模块。(我认为RequireJS不喜欢有空格的模块名称,所以我假设模块名称带有下划线。) -
RequireJS查找模块
some_Name
的依赖项和工厂函数。工厂是定义模块时给define
的函数。a。如果碰巧
define("some_Name"...
在这一步骤之前被调用,那么RequireJS只获取给define
的依赖项和工厂函数。b。如果
define("some_Name"...
尚未执行,RequireJS将进入网络,尝试获取一个包含define
调用的文件并执行它。按照惯例,这将是一个与模块名称+.js
扩展名同名的文件,但这可以在RequireJS的配置中被覆盖。 -
RequireJS检查依赖项是否已加载。如果没有,那么它会为每个尚未加载的依赖项发出
require
调用。 -
RequireJS调用具有已解析依赖关系的工厂函数。
请注意,我没有在这里讨论所有可能的场景。我坚持使用最常见的案例来保持简单。
所以。。。
好吧,我知道我不能直接使用moduelOne.whatever,因为它是异步加载的,如果调用回调,它就不在那里。
第一个问题,这是正确的吗?
不,这是不对的。执行moduleOne.whatEver();
时,模块moduleOne
必须已加载。如果moduleOne
是undefined
,则这是而不是,因为RequireJS的异步性质,而是因为moduleOne
的定义方式存在错误。例如,如果它导出值undefined
,那么moduleOne
将是未定义的。或者,您可能会为moduleOne.whatEver
获得一个undefined
值,然后在尝试调用它时会导致错误,但这可能是由于忘记导出whatEver
等原因造成的。
第二种情况与第一种情况的区别在于,第二种使用CommonJS sugar语法,这导致上面的步骤2需要一些额外的处理。在RequireJS执行工厂之前,它解析函数(正如您所提到的),然后处理工厂函数,就好像定义的函数被这样调用一样:
define("some_Name", ['require', 'exports', './moduleOne'], function (require, exports) {
require
和exports
模块是RequireJS内部定义的特殊模块。请注意RequireJS是如何在依赖项列表的末尾添加./moduleOne
的。一旦完成,过程与第一种情况完全相同。
当执行var moduleOne = require("./moduleOne");
时,模块已经加载。因此,这行所做的只是返回对模块的引用。
- 摩卡+柴+jsdom Can't加载自定义模块目录
- 如何测试运行 node-fluent-ffmpeg(异步模块)的自定义模块
- SugarCRM 7.5.0.1 中自定义模块的 docusign
- 使用CDN的自定义模块
- 将字段从自定义模块导入Odoo(V9)POS模块
- 我没有'我不了解require.js是如何处理加载路径的.每次定义模块时是否需要使用require.config
- 在Drupal自定义模块中点击3次后,Drupal禁用按钮
- $injector:modulerr将自定义模块注入Angular应用程序
- angularjs自定义模块与$http注入
- Drupal7.x:在复杂地图的自定义模块中使用GoogleMapsJS
- 如何从自定义模块获取Magento中的字段数据
- 如何在 ExpressJS 中定义模块或类
- 自定义模块:未捕获类型错误:未定义不是一个函数
- 未捕获的引用错误:未定义模块 A
- 需要 JS 未定义模块
- 使用 DOH 测试自定义模块
- 节点.js自定义模块
- 节点/快速,包括自定义模块
- 可以'无法在Firefox插件SDK中导入带有require()的自定义模块
- 需要重新定义模块