开发者问题收集

RequireJS - 定义函数未正确返回依赖项

2017-12-04
1458

我正在使用 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

2个回答

通过您所做的编辑,现在可以诊断问题。 不要将您编写的任何模块命名为 module ,这样问题就会消失。

名称 module 是三个保留模块名称之一: modulerequireexports 。您永远不应使用这些名称命名您自己的任何模块。

当您要求 RequireJS 加载 module 时,它不会加载您的模块。相反,它只是返回一个内部结构,旨在提供 有关当前模块 的信息。它具有 id 等字段,它提供当前模块 id(即模块名称)和 url ,它提供加​​载模块的 URL,等等。

Louis
2017-12-06

好的,阅读后

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 所写,这很清楚。

moduleexportsrequire 是保留字。

以下具有相同的结果

define(['require', 'exports', 'module'], function(require, exports, module) {
  console.log(module);
});

define(function(require, exports, module) {
  console.log(module);
});
dbf
2017-12-05