requirejs优化器命名模块bug

时间:2014-07-16 14:14:02

标签: javascript ruby-on-rails node.js requirejs amd

我想定义一个模块,它只需要其他模块,以确保它们被包含在内。像这样:

File: common.js
define(['routes/index_route', 'routes/guides_route']);```

r.js输出是:

define(['routes/index_route', 'routes/guides_route']);

这是错误的,因为它应该输出一个命名模块。

但是如果我用这样的虚函数回调定义它:

File common.js
define(['routes/index_route', 'routes/guides_route'], function() {});

r.js输出正确。

define('routes/common',['routes/index_route', 'routes/guides_route'], 
      function() {});

是否可以定义一个模块,其唯一目的是要求其他类似的模块?

为什么r.js会像这样?

修改

我遇到了amd lingo的麻烦,所以我将定义我的问题。

我有一个包含所有模块的router.js。

File: router.js
define(['routes/index_route', 'routes/guides_route', 'routes/other_route'], 
       function() {

       });

我包含所有这些routes('index_route,guides_route'),但我真的不需要任何引用。所以不要包括一堆 像这样的router.js中的routes,我希望将所有这些routes包含在一个单独的文件中,并在router.js中包含该文件。

File: router.js 
define(['routes/common'], function() {});

File: routes/common.js
define(['routes/index_route', 'routes/guides_route', 'routes/other_route']);

然后出现上述问题。

TL; DR 我认为你很困惑什么需要和定义是。和r.js用于什么。

我虽然require(['module'], function() {})define(['module'], function() {})之间存在差异 要求函数立即调用,只有当其他模块需要时才调用define函数。

所以 if you want to request modules you need to use require insead of define毫无意义。

TL; DR 请告诉我区别:

define(['module']);
define(['module'], function() {})

就优化器如何对它们进行操作而言。这将告诉我为什么优化器在两种情况下输出不同。

define(['module']);
define('filename', ['module']);

如果我遇到某种陷阱,请多点亮一点,否则不要再混淆我的噪音。

2 个答案:

答案 0 :(得分:1)

r.js行为正常。如果您想申请模块,则需要使用require代替define

require(['routes/index_route', 'routes/guides_route']);

答案 1 :(得分:0)

如果我没有正确地解决您的问题,请使用'套餐' require.config的属性可以帮助你,

保持您的公共文件不变,即

File common.js
define(['routes/index_route', 'routes/guides_route'], function() {});

像,

options: {
    paths: ...,
    packages: [{
        name: 'routes/common', // or 'routes' or anything
        location: 'routes',
        main: 'common'
    }],
    ....
}

然后,您可以直接在您的' router.js'中使用该模块的名称。文件。

我这样做是为多个文件创建一个命名模块,包括加载包主文件中的所有子模块。

编辑:

您也可以省略'名称'包的属性如果你想要的话。在这种情况下,您可以重命名' common.js' to' main.js'因为它是包的入口点的标准名称。因此,重命名& common.js' to' main.js'它可以成为,

options: {
    paths: ...,
    packages: ['routes'],
    ....
}

有关更多说明/选项,请参阅以下网址

http://requirejs.org/docs/api.html#packages