2012-01-22 10 views
23

私はnodejを使い始めました。私はアプリで一度だけファイルを "必要とする"方法があるのだろうかと思います。 JSプロジェクトで古典的なOOPSを取得するためのクラスフレームワークを使用しています。それぞれの "クラス"はそれ自身のJSファイルに含まれています。独立して機能するが、フレームワークのinitコードを一度しか実行させたくないように、各ファイルでクラスフレームワークを「要求」したい。nodejsでJSファイルを1回だけ "require"する方法はありますか?

これを実装するためにフラグを使用できますが、組み込みの方法はいいと思います。 "once once"を検索すると、すべてのPHP関連の質問につながります。

答えて

59

requireは常に「一度」必要です。最初にrequireを呼び出すと、requireはキャッシュを使用し、常に同じオブジェクトを返します。

モジュール内で浮動する実行可能コードは、一度しか実行されません。

一方、初期化コードを複数回実行する場合は、そのコードをエクスポートされたメソッドにスローするだけです。

編集:あなたは本当にあなたができる複数回実行するようにモジュール内のトップレベルのコード(あなたのモジュール内のメソッドや関数の中に含まれていないコードを)したい場合はhttp://nodejs.org/docs/latest/api/modules.html#modules

+1

素晴らしい!早速のお返事ありがとうございます。 – atlantis

+0

'初期化コードを何度も実行し、そのコードをエクスポートされたメソッドに投げるだけでいいのか説明したり、例を挙げることができますか?' –

+1

@sudoモジュールの本体にコードを残すのではなく、エクスポートする関数。モジュールを必要とするモジュールは、初期化コードを再実行するためにこの関数を実行できます。 '' 'js var db = connect();ノードモジュールは常にシングルトンです: module.exportsは VS =デシベル '' ' は' ''のJS module.exportsはの=は、それを考えるための別の方法がある '' ' を接続します。あなたのシングルトンは、コンストラクタ/ファクトリを公開してインスタンスを作成できます。 – timoxley

1

の「キャッシュ」セクションを読みますそれは、このようなrequire.cacheオブジェクトにキャッシュされているモジュールオブジェクトの削除:

delete require.cache[require.resolve('./mymodule.js')]; 

あなたが二回目用のモジュールを必要とする前にこれを行います。

ほとんどの場合、おそらくモジュールの最上位レベルのコードを1回だけ実行し、モジュールを必要とする場合は、そのモジュールがエクスポートするものにアクセスしたいだけです。

var myMod = require("./mymodule.js"); //the first time you require the 
             //mymodule.js module the top level code gets 
             //run and you get the module value returned. 


var myMod = require("./mymodule.js"); //the second time you require the mymodule.js 
             //module you will only get the module value 
             //returned. Obviously the second time you 
             //require the module it will be in another 
             //file than the first one you did it in. 
関連する問題