1

クラス コンストラクター パターンに従って node.js プロジェクトを作成しています。

function my_class(x,y){
    this.x = x;
    this.y = y;
}

プロジェクトの出発点はmain.jsファイルです。プロジェクトのどのクラスも、 で定義されているグローバル オブジェクト (「ワールド」や「ソケット」など) にアクセスできる必要がありますmain.js。私は4つのオプションを見つけました:

  1. 内でクラスを定義しますmain.js。彼らはmain.jsの閉鎖のために のグローバルにアクセスできますが、main.js肥大化します。

  2. my_class.jsクラスをand itなどの別のファイルに移動しますrequire()main.jsmy_class のインスタンスはクロージャ コンテキストを失い、のグローバルにアクセスできなくなるため、これは機能しません。

  3. クラスを別のファイルに移動し、依存関係をそのコンストラクター (例: ) に手動で注入しますmy_class(world,socket)。問題は、コードがはるかに複雑になり、「my_instance.world」がソースにポップするなどの奇妙なセマンティクスになることです。「world」は のプロパティではないため、これはナンセンスですmy_class

  4. クラスを別のファイルに移動し、my_class = eval(fs.readFileSync(())代わりにrequire. my_class がmain.jsのクロージャ コンテキストを取得するため、これは問題なく機能します。これは私が使用しているソリューションですが、ハックのようです。

そのような node.js プロジェクトをモジュール化する正しい方法はどれですか?

4

3 に答える 3

1

の機能に依存し、のデータに依存する循環依存関係があるため、問題は難しいようです。main.jsmy_classmy_classmain.js

のデータをオブジェクトに入れるmain.jsことglobalで、循環依存を解決します。

  • main.jsの機能に依存します。my_class.js
  • main.jsglobalオブジェクト内のデータに依存
  • my_class.jsglobalオブジェクト内のデータに依存

ここで、データをオブジェクトに入れることを取り除くためにglobal、3 番目のモジュールを実装しますdata.js。次に、次のようなソースが必要です。

  • main.js必要data.js
  • main.js必要my_class.js
  • my_class.js必要data.js

node.js のモジュールは両方ともシングルトンであるmain.jsためmy_class.js、 の同じインスタンスを取得しますdata.js

于 2014-04-23T22:25:57.277 に答える