我正在使用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检测到问题。模块不能命名为“模块”。这帮我修复了这个例子,但没有解决我的真正问题。下面我将介绍解决方案。
SOLUTION:
我的问题与名为Ace(HTML编辑器)的库有关。这是帮助我解决问题的链接:https://github.com/josdejong/jsoneditor/issues/173
答案 0 :(得分:2)
通过编辑,现在可以诊断问题。 请勿使用名称module
为您写的任何模块命名,问题就会消失。
名称module
是三个保留模块名称之一:module
,require
和exports
。您永远不应该使用这些名称命名任何自己的模块。
当您要求RequireJS加载module
时,它不会加载您的模块。相反,它只返回一个内部结构,用于提供有关当前模块的信息。它有像id
这样的字段,它给出了当前的模块ID(即模块名称)和url
,它给出了加载模块的URL,依此类推。
答案 1 :(得分:1)
好的,所以阅读后
属性:exports,id,packed和uri。
我猜,就像@Louis所说的那样,OP问题中的例子不是OP(测试)项目中的例子。
定义模块时,有两种(以及更多)一般方法。
在标题为CommonJS
的{{3}}中解释了它们。
如果使用
定义模块define(function(require, exports, module) {
console.log(module);
});
然后第3个参数module
确实包含exports, id and uri
,如。
{
config: function config()
exports: Object { }
id: "js/modules/handgrip/index.js?bust=1512509846564"
uri: "js/modules/handgrip/index.js?bust=1512509846564&bust=1512509846564"
}
为了&#34;返回&#34;在给定的上下文中您的模块,您可以export
与
define(function(require, exports, module) {
// require a depedency already loaded in context
var someDep = require('someDep1');
module.exports = {
// whatever this module is about ..
}
});
仅当您使用名称定义模块时,后跟依赖项,如
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);
});