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