【问题标题】:requirejs optimizer named module bugrequirejs 优化器命名模块错误
【发布时间】:2014-07-16 14:14:02
【问题描述】:

我想定义一个模块,它除了需要其他模块之外什么都不做,以确保它们被包含在内。像这样:

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 术语时遇到问题,所以我将定义我的问题。

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

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

       });

我包括所有这些routes ('index_route, guides_route'),但我并不需要任何参考。所以而不是包括一堆 routes 像这样在 router.js 中,我想将所有这些 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 我认为您混淆了 require 和 define 是什么。以及 r.js 的用途。

虽然require(['module'], function() {})define(['module'], function() {}) 之间的区别是 require 函数被立即调用,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']);

如果我陷入某种陷阱,请提供更多信息,否则请不要进一步混淆我。

【问题讨论】:

  • 当你说“这是错误的,因为它应该输出一个命名模块。”,为什么这很重要?你是说当优化器没有将模块命名为routes/commondefine(['routes/common'], function() {}); 不起作用?
  • @sahbeewah 当优化器没有命名模块时,它在浏览器中找不到routes/common 模块并给出错误。如果我省略function() {},它将不起作用,否则它会正确命名模块。

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


【解决方案1】:

r.js 行为正常。如果你想请求模块,你需要使用require 而不是define

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

【讨论】:

    【解决方案2】:

    如果我没有正确理解您的问题,使用 require.config 的“packages”属性将对您有所帮助,

    保持您的公用文件原样,即

    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”文件中使用该模块名称。

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

    编辑:

    如果你愿意,你也可以省略 package 的 'name' 属性。在这种情况下,您可以将“common.js”重命名为“main.js”,因为它是包入口点的标准名称。所以,将 'common.js' 重命名为 'main.js' 就可以了,

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

    更多解释/选项请参考以下网址,

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

    【讨论】:

    • 如果我不使用packages 配置,并且像这样需要define(['routes/common'], function() {});,它应该在routes/common 中加载所有依赖项,我不明白为什么我必须使用额外的配置呢?
    • 将文件重命名为main.js 时优势更加明显,并且它还定义了使用该主文件的目的。通过查看您的 require 配置,您可以知道 routes 文件夹可能有一些内部使用的 JS 文件,但对于应用程序来说,整个文件夹充当单个实体(即包)。顺便说一句,如果你不想定义一个空函数,你也可以在那个主文件中使用require([]); 语法。
    • 你有一个真实的例子吗,我不清楚 main.js 文件中的内容,以及这与没有 packages 配置有何不同。这也不能回答我原来的问题,也就是说,如果这是一个优化器错误,还是我出错了?
    • 您面临的不是优化程序错误。从逻辑上讲,define 用于“定义”一个模块。如果你没有返回任何东西(如果你不使用 return 语句,包括 undefined 的隐式返回),则没有定义模块。所以,优化器认为,如果什么都没有出来,就没有什么可命名的!在这种情况下,它不会生成命名模块!但是在需要的情况下,不需要返回任何东西,所以它在那里工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多