2016-02-25 104 views
2

在其中一個模塊中需要新的第三方模塊實例。需要節點模塊的新實例

// 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該事項),極有可能在所有對象.thirdParty性質是相同的。

這個問題如何在Node.js中以編程方式解決(而不是使用package.json)?

+0

可能與此http://stackoverflow.com/questions/9210542/node- JS-需要緩存,可能對無效。嘗試使用'delete require.cache ['third-party']'。 – peacer212

+0

也許這個模塊'https:// github.com/gajus/require-new'可以解決你的問題嗎? – zangw

+0

@zangw非常感謝,看起來正是我需要的東西。如果您願意,隨意發佈它作爲答案。 – estus

回答

1

這裏是一個模塊require-new可以滿足您的要求。

  • require-new需要一個新的模塊對象。

  • require-new不會影響要求 方法的狀態或行爲。

  • 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 
+0

如果模塊路徑相同(它是相同的),它將不會解析爲其他副本。對於鬆散版本的限制(就像我的情況一樣),只安裝第三方的一個副本,包含npm2的'node_modules/third-party',包含npm3的'node_modules/third-party @ 1.0.0'。不會有'node_modules/a/node_modules /第三方'。 – estus

+0

@estus,我從我的評論更新了我的答案 – zangw