其中一个模块中应该需要第三方模块的新实例。
// a
...
exports.thirdParty = require('third-party');
// b
...
exports.thirdParty = require('third-party');
// first-party
...
exports.thirdParty = requireFreshInstance('third-party');
// app.js
var assert = require('assert');
var a = require('a');
var firstParty = require('first-party');
var b = require('b');
assert(a.thirdParty === b.thirdParty);
assert(firstParty.thirdParty !== a.thirdParty);
assert(firstParty.thirdParty !== b.thirdParty);
所有列出的模块都有类似的包装要求,
dependencies: {
"third-party": "^1"
}
要求是它应该保持完整,不允许使用"third-party": "git://..."
这样的技巧。
我们假设用户仅控制first-party
模块,并且无法修改third-party
模块以获得将返回新实例的新factory
方法。
我知道如果版本在所有情况下都相同({技术上它是third-party
的完整路径),third-party
会被缓存一次,很可能是{{} 1}}所有对象中的属性都相等。
如何以编程方式(而不是package.json)在Node.js中解决此问题?
答案 0 :(得分:1)
这是一个模块require-new
可以满足您的要求。
require-new
需要一个新的模块对象。
require-new
不会影响require的状态或行为
方法
require-new
旨在用于模块测试。
以下是此模块的示例。
require('./rand.js'); // 0.697190385311842
require('./rand.js'); // 0.697190385311842
模块在需要时缓存在require.cache
对象中。
require-new
从与您请求的模块关联的require.cache
对象中删除键值,使模块重新加载:
requireNew('./rand.js'); // 0.2123227424453944
requireNew('./rand.js'); // 0.5403654584661126