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