需要一个新的Node模块实例
其中一个模块需要新的第三方模块实例。
// 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://..."
这样的技巧"third-party": "git://..."
。
假设用户仅控制first-party
模块,并且不能修改third-party
模块以使新的factory
方法返回新的实例。
我知道,如果third-party
在所有情况下都是相同的,那么third-party
被caching一次(从技术上说,这是third-party
完整path),所有对象中的.thirdParty
属性都是相同的。
这个问题如何在Node.js中以编程方式解决(而不是使用package.json)?
这里有一个模块require-new
可以满足你的要求。
-
require-new
需要一个新的模块对象。 -
require-new
不会影响require方法的状态或行为。 -
require-new
被devise用于模块testing。
这里是来自这个模块的示例。
require('./rand.js'); // 0.697190385311842 require('./rand.js'); // 0.697190385311842
当需要时,模块被caching在require.cache
对象中。
require-new
从与请求的模块关联的require.cache
对象中删除键值,使模块重新加载:
requireNew('./rand.js'); // 0.2123227424453944 requireNew('./rand.js'); // 0.5403654584661126