my-module
別のモジュールに依存するノードモジュールを開発していますother-module
。other-module
したがって、これは私のモジュールのpackage.jsonに明示的にリストされている依存関係です。
私のモジュールはdであるother-module
だけで動作を変更するので、一度だけロードされることが重要であり、この唯一無二の「インスタンス」は、との両方を必要とするアプリケーション全体で参照されるものです。require
other-module
my
other
ノードのモジュールキャッシングポリシーに従ってこれが当てはまると期待していましたが、簡単なテストアプリを作成しているときに遭遇したのは次のとおりです。
前にmy-module
編集npm install
された場合、後者は前者の依存関係として取り込まれます。その後、それをnode_modules階層にもう一度入れます。次に、モジュールが必要な場合、ノードはモジュールの「ローカル」コピーをロードし、アプリが2回目にそれをロードすると、ノードはそれを再度ロードします(今回は2番目のためにインストールされたバージョン)。これは明らかに意図した結果ではありません。 other-module
npm install
other-module
other-module
require
npm install
それ以降my-module
がnpm installe
dの場合、node_modulesのコピーは1つだけになり、テストアプリは期待どおりに機能します。 other-module
other-module
この動作により、ノードの関連ポリシーをもう一度確認し、「モジュールキャッシングの警告」に出くわしたことを確認しました。
モジュールは、解決されたファイル名に基づいてキャッシュされます。モジュールは呼び出し元のモジュールの場所(node_modulesフォルダーからロード)に基づいて異なるファイル名に解決される可能性があるため、require('foo')が異なるファイルに解決される場合、常にまったく同じオブジェクトを返すという保証はありません。 。
この時点で、モジュールはnpm install
sの順序に応じて期待どおりに動作する場合と動作しない場合があるようです。
私が見逃しているベストプラクティスはありますか?モジュールの動作方法を変更せずにこの混乱を回避する方法はありますか?