2012-02-27 2 views
9

У меня есть два класса файлов:Node CoffeeScript файлы классов и наследование

foo.coffee: class Foo

bar.coffee: class Bar extends Foo

Как определить эти классы, чтобы они доступны по всему миру? Я получаю ошибку в Bar, что Foo не определен.

У меня есть файл index.js, который я вызываю node для запуска скриптов. Вот содержание index.js, я, скорее всего, сделал это неправильно также:

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

ответ

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" 

UPDATE: Вам также нужно запустить .coffee файлов с coffee, если только вы их не скомпилируете.

ОБНОВЛЕНИЕ 2: Как вы структурируете свои модели, зависит от вас. Мне нравится рисунок выше (где простые модули экспорта только функция - это когда вам нужно назначить module.exports, потому что вы не можете просто назначить exports), но другие предпочитают структуру, как это:

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 

Где каждый модуль экспортирует объект с одним или несколькими свойствами.

+0

Я хотел куранты и сказать, что я согласен с Линусом и как модуль должен экспортировать только класс. Конечно, есть некоторые исключения, но в целом это хорошая практика. –

+0

(Извинения для OT!) - @Linus: Можете ли вы порекомендовать подход к использованию той же техники на стороне клиента? RequireJS (похоже, много накладных расходов)? – polarblau

+1

@polarblau: Конечно, я использую [stitch] (https://github.com/sstephenson/stitch), который отлично работает для меня. Маленький, легкий и дает вам «требовать» на клиенте. –

3

Вы также можете написать:

class @MyClass 
    [...] 

{MyClassName} = require './myclassFile' 
myClass = new MyClassName 
Смежные вопросы