RequireJSを使用します。
「my-classes.coffee」という1つのファイルで、名前空間を定義します。
define [], ->
# You need this if you want it to work in multiple environments.
# Otherwise just use `window` to work in the browser.
root = exports ? this
root.MyClasses = {}
「aa.coffee」という別のファイルでクラスを定義できます。
define ['my-classes'], (MyClasses) ->
class MyClasses.Aa
@someProp: true
別のファイル:
define ['my-classes'], (MyClasses) ->
class MyClasses.Bb
@someProp2: false
MyClasses
これで、必要に応じて、を含むエクスポートを行う必要がありますMyClasses.Aa
。
require ['my-classes', 'aa'], (MyClasses, _) ->
console.log MyClasses.Aa.someProp
require
このようにすることの問題の1つは、ステートメントの「my-classes」だけに依存できないことです。あなたがそれをした場合、MyClasses.Aa
未定義になります。ただし、「aa」はMyClassesに追加する以外は何もエクスポートしないため、「aa」だけに依存することはできません。上記のコードスニペットでは、MyClasses.Bb
明示的に依存していないため、は未定義です。これが、多くの人が1つの巨大なファイルを使用するか、名前空間を再エクスポートするという定型文を複製する理由です。
誰かがこれを修正する方法を知っているなら、私に知らせてください。
個人的には、RequireJSの使用は複雑であり、設定にはさまざまな方法があります。私がジャスミンでそれを使用した1つの方法は、ケーキタスクを使用してCoffeeScriptをJavaScriptにプリコンパイルし、このようなスペックファイルを作成することです。
requirejs = require('requirejs')
# Set the baseURL to your compiled JS dir.
requirejs.config { baseUrl: __dirname + '/../lib' }
requirejs ['my-classes', 'aa'], (MyClasses, _) ->
describe "someProp", ->
it "should be true", ->
expect(MyClasses.Aa.someProp).toEqual true
これは最善の方法ではないかもしれませんが、ブラウザー、ノードサーバー、およびジャスミンノードテストでモジュールを実行するために使用できました。また、スペックファイルの定型文を避けるためにカスタムランナーを使用する人もいます。
RequireJSを使用したくない場合は、この質問が役立つ場合があります。これは、 CoffeeScriptFAQnamespace
で定義されている関数を使用して機能します。