2016-08-16 3 views
3

モジュールの関数/クラスをモジュール自体を呼び出す/呼び出す必要がある別のモジュール別のモジュールにインポートする前に、独自の関数/クラスを初期化しますか?私は十分に私の質問をすることができますか分からない!だから例を挙げてみましょう。インポートする前に関数/クラスを呼び出す/初期化する必要があるモジュールをインポートする方法

これは私のモジュールです:

// myModule.js 
class MyModule { 
    constructor() { 
    // do sth 
    } 
} 

let myModule = new MyModule(); 

そして、これは私が別のモジュールでそれをインポートする方法です:

import MyModule from './myModule'; 

この実際に正常に動作します!しかし、あなたが見ることができるように、myModule.jsファイルでは、export default私のMyModuleクラスではありませんでした。それはmyModule.jsファイルで起こっている唯一の事柄ではないからです!私はそれを定義した後でもクラスを初期化しています...(私がクラスをexport defaultとして設定しても、モジュールが別の場所にインポートされている間も初期化は正常に機能します...)

モジュール内にエクスポートされたものを設定するか、またはクラスをexport defaultとして設定すると、モジュールが他の場所にインポートされたときにすべて正常に動作します。しかし、私はベストプラクティスを探しています!

だからここに私の質問はに関するされているような場合:

  1. それは輸出のために何を持っていないモジュールをインポートするには、[OKですか?
  2. このクラスをexport defaultとして設定しますか?モジュール内のクラス外でいくつかの作業を行っていますが(クラスを定義した後で起きている初期化ジョブ)
  3. また、別の関数で初期化ジョブを実行し、クラスと関数の両方をエクスポートしてから、インポートしたモジュールで初期化ジョブを実行する関数を呼び出すとよいでしょうか?

ありがとうございます!私はこれに関してどんな助けにも本当に感謝しています:)

+0

「*これは唯一のことではないため*」は、何かをエクスポートする(デフォルトの)状態から離してはいけません。 – Bergi

+0

クラスのインスタンスが複数必要ですか? – Bergi

+0

私は自分自身が呼び出されるのが好きなように、ファクトリ関数(クラスのインスタンス化だけでなく、他のいくつかの作業も行っています)を持っていればどうでしょうか?自己呼び出し関数をどのようにエクスポートできますか? – Ali

答えて

-1

お返事ありがとうございました。私は本当にそれを感謝します。実際には私が取り組んでいるプロジェクトに本当に混乱していたので、私がしようとしていることを表現できなかったかもしれません...

しかし、とにかく、私は自分の質問に、他に有用見つける:

  1. それは常に私たちが書くつもりモジュールのexport defaultexport持ってすることをお勧めします。すべてのコードには何らかの結果が出る傾向があるので、そうですか?したがって、モジュールでは、最終的に達成しようとしていることを検討し、それをエクスポートする必要があります。アウトプットをエクスポートして、他の場所にインポートするときにモジュールが提供することを期待するものをエクスポートします。

  2. あなたのモジュールが単一のクラスの場合、それはexport defaultに適しています。さもなければ、私が最初の答えで言ったように、それはあなたがあなたのモジュールで達成しようとしているものと結果が何であるかにかかっています。すべての結果、ユーティリティ関数などをエクスポートしてください。

  3. あなたもそうしたいと思うかもしれません!しかし、まずあなたのユースケースについて考えてみてください。モジュールがどこか別の場所にインポートされるとすぐに、そのモジュール内のすべてのコードが実行されます。だから、あなたがやりたいことを何でもして、最終結果をエクスポートしてください。

9

クラスまたはそのインスタンスをインポートする方法はありますか?同様:

// export class itself 
export class MyModule { 
    constructor() { 
    // do sth 
    } 
} 

// export instance of MyModule directly 
export default new MyModule(); 

// export a factory function if you need more work to be done 
// before the instance is created 
export function myModuleFactory(...args) { // define e.g. arguments to be passed to constructor 
    // ... do stuff 
    const myModule = new MyModule(...args); 
    // ... do more stuff 
    return myModule; 
} 

だからあなたが行うことができます:何をするか

// import instance 
import instance from './myModule'; 
// or class 
import { MyModule } from './myModule'; 
// or import factory 
import { myModuleFactory } from './myModule'; 

は、あなたがあなたのモジュールを達成したいかにdepeneds。アプリでMyModuleクラスオブジェクトの共有インスタンスを使用する場合は、exportimportのようになります。別のコンテキストで複数のインスタンスを作成する場合は、クラス自体またはファクトリ関数をエクスポートして新しいインスタンスを返します。

クラスをさらにきれいにするために、クラスをさらに別のファイルに保存し、ファクトリ/インスタンス化を提供するモジュールにimportを格納します。

更新

あなたの最初の質問に答えるために:あなたはどのexportが定義されていないimportモジュールをすることができます。モジュールがロードされ、そのロジックが実行されます。問題は、グローバル変数(Web開発のwindowなど)を変更しない限り、モジュール内のすべてが独立したスコープ内で発生するため、何の効果もないことです。あなたが推測しているように、モジュールをグローバル変数に変更することは、ベストプラクティスから遠いです。

+0

あなたのソリューションは、クラスのインスタンスをインポートしたいときにうまくいくかもしれません...しかし、ファクトリ関数を呼び出してエクスポートするとどうなりますか?私にはわからないことがありますか? – Ali

+0

インポートするモジュール内でファクトリ関数を呼び出し、作成したインスタンスをエクスポートすることを意味しますか?それで、モジュール自体にすべてのものを書き込むことができ、別の関数( 'MyModuleのインスタンスを直接エクスポートする'のように)を別の関数にカプセル化する必要はないので、ファクトリは必要ありません前)。あなたは引数を渡すことはできません。 – Oliver

+0

もちろん、問題なくクラスのインスタンスを簡単に書き出すことができます...それについて心配する必要はありません! instatiationについて忘れてみましょう...ここに私の質問です:自己呼び出し関数をどのようにエクスポートできますか? – Ali

関連する問題