2012-02-27 10 views
9

Tengo archivos de clase 2:archivos de clase CoffeeScript nodo y la herencia

foo.coffee: class Foo

bar.coffee: class Bar extends Foo

¿Cómo definir estas clases por lo que están disponibles a nivel mundial? Me sale el error en Bar que Foo no está definido.

Tengo un archivo index.js al que llamo node para ejecutar los scripts. Aquí está el contenido de index.js, lo más probable es que hice mal también:

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

Respuesta

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" 

ACTUALIZACIÓN: También necesita ejecutar archivos .coffee con coffee, a menos que los compile primero.

ACTUALIZACIÓN 2: Cómo usted estructura sus modelos depende de usted. Me gusta el patrón anterior (donde los módulos simples exportar sólo una función - que es cuando tiene que asignar a module.exports porque no se puede simplemente asignar a exports) pero otros prefieren una estructura como esta:

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 

Donde cada módulo exporta un objeto con una o más propiedades.

+0

quería meter su cuchara y decir que estoy de acuerdo con Linus y cómo un módulo debe exportar sólo la clase. Por supuesto, hay algunas excepciones, pero en general es una buena práctica. –

+0

(¡Disculpas por OT!) - @Linus: ¿Puede recomendar un enfoque para utilizar la misma técnica en el lado del cliente? RequireJS (parece que le gusta un montón de sobrecarga)? – polarblau

+1

@polarblau: Claro, yo uso [puntada] (https://github.com/sstephenson/stitch) que funciona muy bien para mí. Pequeño, liviano y le da 'require' al cliente. –

3

También puede escribir:

class @MyClass 
    [...] 

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