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

时间:2017-12-04 21:03:22

标签: javascript requirejs amd

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

2 个答案:

答案 0 :(得分:2)

通过编辑,现在可以诊断问题。 请勿使用名称module为您写的任何模块命名,问题就会消失。

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

当您要求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写的那样。

moduleexportsrequire是保留字。

以下结果相同

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

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