2012-02-15 8 views
32

私は新しいcoffeescriptファイルを作成するときに、コンパイルされたコードのコードを別のファイルからアクセスすることができません。複数のファイルとcoffeescriptとの通信

のCoffeeScript:Javascriptを生成

class ChatService 
    constructor: (@io) -> 

:たとえば

(function() { 
    var ChatService;  
    ChatService = (function() {  
    function ChatService(io) { 
     this.io = io; 
    }  
    return ChatService;  
    })();  
}).call(this); 

別のファイルにChatServiceを呼び出そうと、それが定義されていません。 coffeescriptで複数のファイルを処理するにはどうすればよいですか?

+0

Railsを使用している場合は、依存するcoffeescriptファイルを*試して参照しようとしていることを確認する必要があります。実際に他のものが必要なファイルに "require"ディレクティブを設定すると、変数などにアクセスできるようになります。 –

答えて

56

これがクライアント側コードかサーバー側コードかによって、わずかに異なる2つのアプローチがあります。

クライアント側:別のファイルの両方ChatServicewindow.ChatServiceはクラスへのアクセスを許可します、そして、

class window.ChatService 
    constructor: (@io) -> 

:ここでは、次のようにグローバル名前空間(window)へのファイル間利用可能であるべきものを添付。


サーバー側:ここでは、exportsrequireを使用する必要があります。あなたが使用することができ、別のファイルからそれを得るために、そして、

class exports.ChatService 
    constructor: (@io) -> 

ChatService.coffeeファイルでは、次のを持っているでしょう

ChatService = require('ChatService.coffee').ChatService 

注:あなたから取得している複数のクラスがある場合

{ChatService, OtherService} = require('ChatService.coffee') 

:ChatService.coffeeが、これは本当に開梱のCoffeeScriptの辞書のような、輝く一つの場所であります

両方:基本的には、現在の環境に基づいてサーバー側コードまたはクライアント側コードを実行するかどうかを選択します。

class ChatService 
    constructor: (@io) -> 

if typeof module != "undefined" && module.exports 
    #On a server 
    exports.ChatService = ChatService 
else 
    #On a client 
    window.ChatService = ChatService 

それを取得するには:それを行うための一般的な方法ChatServiceが既にwindowに添付参照を参照しているので

if typeof module != "undefined" && module.exports 
    #On a server 
    ChatService = require("ChatService.coffee").ChatService 
else 
    #On a client 
    ChatService = window.ChatService 

第2ブロックのelse節は、スキップすることができます。 (

self = {} 

class self.ChatService 

そして、クライアントにサーバー上のmodule.exports = self_.extend(window, self)ようにそれらを添付:このファイル内のクラスの多くを定義するつもりなら

、次のように定義する方が簡単かもしれ_.extendを別のextend機能に置き換えてください)。

+1

+1は物事のnode.js側です。 –

+2

node.jsとクライアント側の両方のアプローチをお寄せいただき、ありがとうございました。 –

+0

「mu is too short」の回答と同様に、exports.App.ClassNameも実行できます。私はあなたがその "名前空間"のApp部分を呼び出すことができると思います。私が間違っているなら、私を修正してください。 – Chris

23

通常のアプローチは、windowでグローバルな名前空間を定義することです:何も前に、アプリケーションの初期化コードのどこかに行くだろう

window.App = { } 

は他に起こります。そして、あなたのクラスのために:

class App.ChatService 
    constructor: (@io) -> 

あなたはどこでもあなたが望むAppを通して、あなたのクラスを参照することを可能にすることと、あなたはグローバルな名前空間を汚染を心配する必要はありません。

chatter = new App.ChatService 

あなたが望んでいた場合あなたのChatServiceを本当にグローバルにするには、class window.ChatServiceを使用することができますが、私はそれを最も些細なアプリケーションを除いてお勧めします。

AFAIK、node.jsにはwindowと似たものがありますが、node.jsにはそれが何であるかを説明するのに十分なものではありません。

+1

node.jsでは、シンボルを 'exports 'に添付してエクスポートします。 1つのモジュールで:exports.ChatService = ChatService;もう1つは:ChatService = require( "./ chat")。ChatService。 –

+0

@Linus:ありがとう、私はそれに着く前にAaron Dufourがそれをカバーしたと思う。 –

0

クラスを名前空間で区切り、cakeを使用して、それらをすべて1つ(またはそれ以上)の結果の.jsファイルにコンパイルします。 Cakefileは、あなたのコーヒースクリプトがどのような順序でコンパイルされるかを制御する設定として使用されます。大きなプロジェクトでは非常に便利です。

ケーキは、あなたのプロジェクトを編集している間、VIMからケーキを呼び出すと、単に

:!cake build 

であり、あなたは、ブラウザを更新して結果を見ることができ、非常に簡単にインストールとセットアップです。

私はファイルを構造化し、coffeescriptをバックボーンとケーキと組み合わせて使用​​する最善の方法を学ぶためにも忙しくて、small project on githubを作成して自分自身の参考にしておいてください。ケーキといくつかの基本的なもの。すべてのコンパイルされたファイルはwwwフォルダにあり、ブラウザで開くことができます。ケーキの設定を除くすべてのソースファイルはsrcフォルダにあります。この例では、すべての.coffeeファイルが出力.jsファイルにコンパイルされ、結合され、htmlに含まれます。

関連する問題