什么时候单身保证是这样的?

假设你有一个定义的节点包的thing

 var theThing = {} exports.theThing = theThing 

consumer这样做:

 var thing1 = require('thing') var thing2 = require('thing') assert(thing1.theThing === thing2.theThing) 

这似乎通过了一个快速的testing。 据推测,当节点执行第二个require ,它通知thing已经实例化,并安静地返回一个指向现有实例的指针?

现在假设发生以下情况:

  • 在npm,1.0.0和2.0.0上发布了两个版本的thing

  • 两个包, consumer1consumer2 ,发布在npm; 它们分别依赖于版本1.0.0和2.0.0的thing ,并且每个都重新导出theThing

  • 另一个打包商endConsumer consumer1依赖于consumer1consumer2

所以如果endConsumer尝试这个testing:

 assert(consumer1.theThing === consumer2.theThing) 

那肯定会失败吧? 在这一点上,节点不能重用一个thing实例,因为包的两个不同版本是必需的?

我猜想你应该最终能够依赖于一个在进程中独一无二的单实例,当且仅当所有出口该单例的包的传递依赖关系都与该包完全相同的版本。 但是,这个猜测是正确的,还是实际的规则呢?