2012-12-04 25 views
0

我只是無法弄清楚這應該如何工作:據我所知,在CoffeeScript中定義類/模塊的一種非常常見的方式是使用module.exports = class MyClass文件的頂部。我也猜想,咖啡編譯器會促進這種模式。藉此極簡例如:coffee -cj覆蓋每個類的module.exports

# 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模塊cound找不到,正確,因爲最後一個模塊(這裏:Bar)已將module.exports重新定義爲僅包含在自身。

Foo = require('foo'); 

我想這是相當的noob問題,但我似乎無法在任何地方得到一個很好的答案。

+1

是的,y ou無法真正使用'--join'選項。如果你需要使用'--join',我建議你以不同的方式構建你的代碼。 –

回答

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" 

得到的類包含在其中