我无法理解这是如何工作的:据我所知,在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');
我想这是一个非常小便的问题,但我似乎无法在任何地方得到一个好的答案。
答案 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"
获取其中包含的课程