需要一个新的 Node 模块实例
require a new instance of Node module
其中一个模块需要第三方模块的新实例。
// 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
方法,该方法将 return 一个新实例。
我知道如果版本在所有情况下都相同,third-party
会被缓存一次(从技术上讲,重要的是 third-party
的完整路径),很可能 .thirdParty
所有对象的属性都相等。
如何在 Node.js 中以编程方式解决这个问题(而不是 package.json)?
这里有一个模块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
其中一个模块需要第三方模块的新实例。
// 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
方法,该方法将 return 一个新实例。
我知道如果版本在所有情况下都相同,third-party
会被缓存一次(从技术上讲,重要的是 third-party
的完整路径),很可能 .thirdParty
所有对象的属性都相等。
如何在 Node.js 中以编程方式解决这个问题(而不是 package.json)?
这里有一个模块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