[解決済み] nodejsのシングルトン・パターン - それは必要なのか?
質問
最近、私は
この記事
を見つけました。のドキュメントは知っています。
require
ステート
ということを
モジュールは最初にロードされた後にキャッシュされます。複数の呼び出しを
require('foo')
を複数回呼んでも、モジュールのコードは複数回実行されないかもしれません。
というわけで、すべての必要なモジュールは、シングルトン boilerplate-code なしで簡単にシングルトンとして使用することができるようです。
質問です。
上記の記事は、シングルトンを作成するための丸い解決策を提供していますか?
どのように解決するのですか?
これは基本的にnodejsのキャッシュに関係しています。単純明快です。
https://nodejs.org/api/modules.html#modules_caching
(v 6.3.1)
キャッシュ
モジュールは、最初にロードされた後にキャッシュされます。これは (とりわけ) すべての require('foo') の呼び出しは、同じオブジェクトに解決されるのであれば を呼び出すと、まったく同じオブジェクトが返されます。 ファイルに解決される場合、まったく同じオブジェクトが返されることを意味します。
require('foo')への複数の呼び出しは、モジュールのコードが複数回実行される原因にならないかもしれません。 が複数回実行されることはありません。これは重要な機能です。これを使うと 部分的に実行されたオブジェクトを返すことができます。 依存関係がサイクルを引き起こす場合でも、ロードすることができます。
もし、あるモジュールに複数回コードを実行させたいのであれば、関数をエクスポートし 関数をエクスポートし、その関数を呼び出します。
モジュールキャッシングの注意点
モジュールは、解決されたファイル名に基づいてキャッシュされます。モジュールは を呼び出す場所によって異なるファイル名に解決されることがあります。 モジュールは、呼び出したモジュールの場所によって異なるファイル名に解決されるかもしれないので (node_modules フォルダからロードする)、以下のことが保証されるわけではありません。 require('foo') が常に全く同じオブジェクトを返すという保証はありません。 が常に同じオブジェクトを返すという保証はありません。
さらに、大文字と小文字を区別しないファイル システムやオペレーティング システムでは、解決されたファイル名が異なる場合、そのファイルを指すことができます。 解決された異なるファイル名が同じファイルを指していても、キャッシュはそれらを異なるモジュールとして扱い はそれらを異なるモジュールとして扱い、そのファイルを何度も再読み込みします。 を複数回読み込むことになります。たとえば、require('./foo') と require('./FOO') では は ./foo と ./FOO が同じファイルであるかどうかにかかわらず、 二つの異なるオブジェクトを返します。 ./FOO が同じファイルであるかどうかに関係なく、2つの異なるオブジェクトを返します。
つまり、簡単に言えば
シングルトンが欲しい場合 オブジェクトをエクスポートする .
シングルトンが必要ない場合 関数をエクスポートする (そしてその関数の中で何かをしたり、何かを返したりしてください)。
はっきり言って、もしあなたがこれを適切に行うなら、それはうまくいくはずです。 https://stackoverflow.com/a/33746703/1137669 (Allen Luce の回答) を見てください。これは、異なるファイル名で解決されたためにキャッシュが失敗したときに何が起こるかをコードで説明しています。しかし、常に同じファイル名で解決するのであれば、うまくいくはずです。
2016年の更新情報
es6 シンボルを使って node.js で真のシングルトンを作成する もう一つの解決策 : このリンクの
2020年のアップデート
この回答は CommonJS (モジュールをインポート/エクスポートするためのNode.js独自の方法)を参照しています。Node.jsは、おそらくは ECMAScriptモジュール : https://nodejs.org/api/esm.html (ECMAScriptはJavaScriptの本当の名前です。ご存じなければ)
ECMAScriptに移行するときは、とりあえず以下を読んでください。 https://nodejs.org/api/esm.html#esm_writing_dual_packages_while_avoiding_or_minimizing_hazards
関連
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] デザインパターンについて。シングルトンはいつ使うべきですか?
-
[解決済み] node.js require()キャッシュ - 無効化可能か?
-
[解決済み】C++ シングルトンデザインパターン
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] ECMAScriptとは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] node.jsでグローバル変数を使用するには?
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] <ng-content>が空かどうかを確認する方法は?(これまでのAngular 2+で)
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる