我正在开发一个节点模块my-module
,它又依赖于另一个模块other-module
。other-module
因此是我模块的 package.json 中明确列出的依赖项。
由于我的模块other-module
仅通过成为require
d 来修改 的行为,因此other-module
仅加载一次并且这个唯一的“实例”是在需要my
和的任何应用程序中引用的唯一的“实例”是很重要的other
。
根据节点的模块缓存策略,我希望这是正确的,但是我在编写一个简单的测试应用程序时遇到的是这样的:
如果在之前my-module
被npm install
ed ,则后者作为前者的依赖项被引入。之后再次将其带入 node_modules 层次结构。然后,当我的模块需要时,节点加载我的模块的“本地”副本,当应用程序第二次加载它时,节点再次加载它,(这次是由于第二次安装的版本)。这显然不是预期的结果。 other-module
npm install
other-module
other-module
require
npm install
如果my-module
是npm installe
d , other-module
那么我最终只得到一个other-module
in node_modules副本,并且我的测试应用程序按预期工作。
这种行为让我再次查看节点的相关策略,果然我遇到了“模块缓存警告”:
模块根据其解析的文件名进行缓存。由于模块可能会根据调用模块的位置(从 node_modules 文件夹加载)解析为不同的文件名,因此不能保证 require('foo') 将始终返回完全相同的对象,如果它会解析为不同的文件.
在这一点上,我的模块看起来可能会也可能不会像预期的那样运行,具体取决于npm install
s 的顺序。
有没有我遗漏的最佳实践?有什么办法可以在不改变我的模块工作方式的情况下避免这种混乱?