2012-02-27 26 views
9

mam pliki 2 Klasa:Węzeł klasy coffeescript pliki i dziedziczenie

foo.coffee: class Foo

bar.coffee: class Bar extends Foo

Jak definiować tych klas są więc dostępne na całym świecie? Otrzymuję komunikat o błędzie w Bar, który nie jest zdefiniowany Foo.

Mam plik index.js, który nazywam node, aby uruchomić skrypty. Oto treść index.js, że najprawdopodobniej zrobił to źle też:

exports.Foo = require("./foo") 
exports.Bar = require("/bar") 

Odpowiedz

19

foo.coffee:

class Foo 
    // ... 

module.exports = Foo 

bar.coffee:

Foo = require "./foo" 

class Bar extends Foo 
    // ... 

module.exports = Bar 

index.coffee:

exports.Foo = require "./foo" 
exports.Bar = require "./bar" 

AKTUALIZACJA: Należy również uruchomić pliki .coffee z coffee, chyba że najpierw je skompilujecie.

AKTUALIZACJA 2: W jaki sposób modelujesz swoje modele, zależy od Ciebie. Lubię wzór powyżej (gdzie proste moduły eksportować tylko funkcja - to jest, gdy trzeba przypisać do module.exports ponieważ nie można po prostu przypisać do exports), ale inni wolą strukturę takiego:

foo.coffee:

class Foo 
    // ... 

exports.Foo = Foo 

bar.coffee:

Foo = require("./foo").Foo 

class Bar extends Foo 
    // ... 

exports.Bar = Bar 

index.coffee:

exports.Foo = require("./foo").Foo 
exports.Bar = require("./bar").Bar 

Gdzie każdy moduł eksportuje obiekt z jedną lub większą liczbą właściwości.

+0

Chciałem dostroić się i powiedzieć, że zgadzam się z Linus i jak moduł powinien eksportować tylko klasę. Oczywiście są pewne wyjątki, ale ogólnie to dobra praktyka. –

+0

(Przeprosiny za OT!) - @Linus: Czy możesz polecić podejście do korzystania z tej samej techniki po stronie klienta? RequireJS (wydaje się, że lubisz dużo narzutów)? – polarblau

+1

@polarblau: Oczywiście, używam [ściegu] (https://github.com/sstephenson/stitch), który działa bardzo dobrze dla mnie. Mały, lekki i daje 'wymaganie' na kliencie. –

3

Można również napisać:

class @MyClass 
    [...] 

{MyClassName} = require './myclassFile' 
myClass = new MyClassName