需要一个新的 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