0

我只是无法理解它应该如何工作:据我了解,在 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 重新定义为仅包含它自己。

Foo = require('foo');

我想这是一个相当菜鸟的问题,但我似乎无法在任何地方得到一个好的答案。

4

1 回答 1

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"

获取其中包含的类

于 2012-12-06T07:04:54.263 回答