什么时候单身保证是这样的?
假设你有一个定义的节点包的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
。 -
两个包,
consumer1
和consumer2
,发布在npm; 它们分别依赖于版本1.0.0和2.0.0的thing
,并且每个都重新导出theThing
。 -
另一个打包商
endConsumer
consumer1
依赖于consumer1
和consumer2
。
所以如果endConsumer
尝试这个testing:
assert(consumer1.theThing === consumer2.theThing)
那肯定会失败吧? 在这一点上,节点不能重用一个thing
实例,因为包的两个不同版本是必需的?
我猜想你应该最终能够依赖于一个在进程中独一无二的单实例,当且仅当所有出口该单例的包的传递依赖关系都与该包完全相同的版本。 但是,这个猜测是正确的,还是实际的规则呢?