假设您有一个定义
的节点包thing
var theThing = {}
exports.theThing = theThing
套餐consumer
执行此操作:
var thing1 = require('thing')
var thing2 = require('thing')
assert(thing1.theThing === thing2.theThing)
这似乎通过了快速测试。假设当Node执行第二个require
时,它通知thing
已经被实例化,并且静静地返回指向现有实例的指针?
现在假设发生以下情况:
在{npm,1.0.0和2.0.0上发布了thing
的两个版本。
两个包consumer1
和consumer2
在npm上发布;它们分别依赖于版本1.0.0和2.0.0 thing
,并且每个都重新导出theThing
。
另一个打包者endConsumer
依赖于consumer1
和consumer2
。
所以,如果endConsumer
尝试此测试:
assert(consumer1.theThing === consumer2.theThing)
那一定是失败的,对吗?此时,Node无法重用thing
的一个实例,因为需要两个不同版本的包吗?
我猜你应该最终能够依赖一个进程中无处不在的单例,当且仅当导出该单例的包的所有传递依赖性与该包的完全相同时。但这个猜测是正确的,还是其他的实际规则呢?