coffee -cj覆盖每个类的module.exports

时间:2012-12-04 10:18:10

标签: javascript coffeescript commonjs

我无法理解这是如何工作的:据我所知,在CoffeeScript中定义类/模块的一种非常常见的方法是使用文件顶部的module.exports = class MyClass。我还猜想咖啡编译器会促进这种模式。拿这个极简主义的例子:

# src/Foo.coffee
module.exports = class Foo

# src/Bar.coffee
module.exports = class Bar

然后编译并加入两个:

coffee -cj all.js src

结果是all.js,其中module.exports被重新定义/覆盖每个模块:

// Generated by CoffeeScript 1.4.0
(function() {
  var Bar, Foo;

  module.exports = Bar = (function() {
    function Bar() {}
    return Bar;
  })();

  module.exports = Foo = (function() {
    function Foo() {}
    return Foo;
  })();

}).call(this);

如果我现在尝试这样做,结果将是一个错误,指出找不到Foo模块,这是正确的,因为最后一个模块(这里:Bar)重新定义了module.exports只包含它自己。 / p>

Foo = require('foo');

我想这是一个非常小便的问题,但我似乎无法在任何地方得到一个好的答案。

1 个答案:

答案 0 :(得分:1)

这几乎是理想的行为......你将两个模块合并为一个,他们都希望处于最高级别,因此其中一个必须获胜。

一种可能的解决方案如下:

# src/Foo.coffee
module.exports.Foo = class Foo

# src/Bar.coffee
module.exports.Bar = class Bar

产生:

# all.js
(function() {
  var Bar, Foo;

  module.exports.Bar = Bar = (function() {
    function Bar() {}
    return Bar;
  })();

  module.exports.Foo = Foo = (function() {
    function Foo() {}
    return Foo;
  })();

}).call(this);

然后你可以使用(在CoffeeScript中)

{Foo, Bar} = require "all"

获取其中包含的课程