RequireJS - 定义函数未正确返回依赖项
我正在使用 RequireJS,当我使用函数“define”定义新模块时,我看到依赖项已解析,但对象不是我定义的模块。
所有模块均以 AMD 格式定义,设置名称、依赖项数组和函数。导出通过返回对象完成。
通过“define”解析的依赖项具有以下属性:exports、id、packaged 和 uri。如果我随后调用 require 函数,依赖项就会正确设置。
更新:我创建了一个具有所述问题的测试示例
HTML:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Test</title>
<script src="/Scripts/require.js" data-main="../Scripts/main"></script>
<script src="/Scripts/module.js"></script>
</head>
<body>
<div>
</div>
</body>
</html>
main.js:
require(["module"], function (module) {
module.test();
});
module.js:
define([], function () {
function test() {
return "a";
}
return {
test: test
};
});
控制台:未捕获的 TypeError:module.test 不是函数
发生这种情况是因为模块未解析为实际模块,而是解析为具有属性的对象:
-config {arguments:null,caller:null,length:0,name:“config”
-exports {id:“ @r5”,uri:“../Scripts/ @r5.js”
在 define 函数中设置模块名称具有相同的结果。
注意:在示例中有一个问题,@Louis 检测到。模块不能命名为“module”。这帮助我修复了示例,但并没有解决我真正的问题。下面我描述了解决方案。
解决方案:
我的问题与一个名为 Ace(HTML 编辑器)的库有关。这是帮助我解决问题的链接: https://github.com/josdejong/jsoneditor/issues/173
通过您所做的编辑,现在可以诊断问题。
不要将您编写的任何模块命名为
module
,这样问题就会消失。
名称
module
是三个保留模块名称之一:
module
、
require
和
exports
。您永远不应使用这些名称命名您自己的任何模块。
当您要求 RequireJS 加载
module
时,它不会加载您的模块。相反,它只是返回一个内部结构,旨在提供
有关当前模块
的信息。它具有
id
等字段,它提供当前模块 id(即模块名称)和
url
,它提供加​​载模块的 URL,等等。
好的,阅读后
properties: exports, id, packaged, and uri.
我猜测,就像@Louis 所说的那样,OP 问题中的示例不是 OP 的(测试)项目中的示例。
定义模块时,有 2 种(以及更多)常规方法。
其中之一在标题为
CommonJS
的
文档
中进行了解释。
如果模块使用
define(function(require, exports, module) {
console.log(module);
});
定义,那么第三个参数
module
将确实包含
exports、id 和 uri
,如下所示。
{
config: function config()
exports: Object { }
id: "js/modules/handgrip/index.js?bust=1512509846564"
uri: "js/modules/handgrip/index.js?bust=1512509846564&bust=1512509846564"
}
为了在给定上下文中“返回”模块,您可以使用
define(function(require, exports, module) {
// require a depedency already loaded in context
var someDep = require('someDep1');
module.exports = {
// whatever this module is about ..
}
});
export
它
仅当您使用名称定义模块,后跟依赖项时,如
define('thename', [ 'someDep1', 'seomDep2', 'etc..' ], function(dep1, dep2, ..) {
// the arguments in this context are those listed in order as defined in the array (parameters)
}
您才能获得预期的结果..
-- 编辑后更新
在 Scrum 会议中,抱歉 ;) 因此,正如 @Louis 所写,这很清楚。
module
、
exports
和
require
是保留字。
以下具有相同的结果
define(['require', 'exports', 'module'], function(require, exports, module) {
console.log(module);
});
define(function(require, exports, module) {
console.log(module);
});