1. ホーム
  2. javascript

[解決済み] nodejsのシングルトン・パターン - それは必要なのか?

2022-10-15 23:52:01

質問

最近、私は この記事 を見つけました。のドキュメントは知っています。 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