【发布时间】:2017-12-04 21:03:22
【问题描述】:
我正在使用 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 { 参数:null,调用者:null,长度:0,名称:“config”}
-exports { id: "@r5", uri: "../Scripts/@r5.js" }
在define函数中设置模块名也一样。
注意:在示例中,@Louis 检测到了一个问题。模块不能命名为“模块”。这帮助我修复了示例,但没有解决我的真正问题。下面我描述一下解决方案。
解决方案:
我的问题与名为 Ace(HTML 编辑器)的库有关。这是帮助我解决它的链接:https://github.com/josdejong/jsoneditor/issues/173
【问题讨论】:
-
你需要的配置是什么样的?你为什么在一个地方使用
bConfig而在另一个地方使用builderConfiguration?它们是一样的吗? -
那是问题中的错字,我已经修正了。我没有要求配置,这是强制性的吗? require 函数可以正确解析依赖关系,因此 define 应该以同样的方式进行。我正在使用捆绑包来加载文件。
-
不,
define不应该,因为require可以。您必须了解require.js如何通过设置path(绝对或相对)来定位模块。如果您没有收到无法加载bConfig模块的故障,或者根据您的require.config设置规范化为模块,那么我能想到的唯一问题是您的项目中有多个bConfig.js文件目录。否则没有意义。 -
我没有多个 bConfig.js 文件。没有错误,问题是如何使用我在问题中指定的属性将对象解析为其他内容。
-
在您使用minimal reproducible example 编辑问题之前,您只会得到猜测。我使用 RequireJS 多年,但从未见过您描述的行为,目前问题中的代码中没有任何内容可以解释 为什么 您会得到您描述的行为。 (回答前面评论中的一个问题:如果默认值恰好是您所需要的,您绝对可以在不显式设置配置的情况下运行 RequireJS。)
标签: javascript requirejs amd