2015-08-28 234 views
1

我想導入依賴項的依賴項。例如,我想導入jade-load直接進入我的應用程序:如何可靠地定位/導入依賴關係的依賴關係?

my-app 
┗━jade 
    ┗━jade-load 

我能做require('jade/node_modules/jade-load'),但如果node_modules樹已經被夷爲平地或重複數據刪除,這將無法正常工作。

我想用require.resolve()找出jade-load還真是的,但似乎沒有成爲一個方式來告訴它的分辨率起點。我需要能夠說「玉石需要玉器」。

注意:我不想安裝翡翠加載作爲我的應用程序的直接依賴;關鍵是要導入與玉石相同的實例,所以我可以用它來修飾它。

+0

有點重複在這裏,但它可能不是你尋找的答案。我沒有意識到按照您所說的方式加載模塊的可靠方法。 http://stackoverflow.com/questions/9736514/require-dependency-of-another-dependency-in-node-modules – tier1

+0

據我所知,模塊只能存在兩個位置:在'node_modules/jade/node_modules'或者'node_modules /'中。爲什麼不嘗試兩種? – robertklep

+0

@robertklep - 如果我的模塊實際上是其他東西的依賴項呢?那麼從技術上來說,我想要加載的dep可能存在於'../../../ node_modules /'之類的地方。 – callum

回答

0

我想你可能想用proxyquire來管理所需模塊的依賴關係。您可以將proxyquire設置爲全局覆蓋子模塊加載時的方法。

main.js

var proxyquire = require('proxyquire'); 

// use default childModule properties and methods unless they are redefined here 
var childModuleStub = { 
    /* redefine here some necessary methods */ 
    '@global': true 
}; 
// parent module itself does't require childModule 
var parentModuleStubs = { 
    './childModule': childModuleStub 
}; 

var parentModule = proxyquire('./parentModule', parentModuleStubs); 

var result; 

result = parentModule.exec(); 
console.log(result); 

childModuleStub.data.sentence = "Overridden property."; 
result = parentModule.exec(); 
console.log(result); 

childModuleStub._exec = function() { 
    return "Overridden function."; 
}; 
result = parentModule.exec(); 
console.log(result); 

parentModule.js

var intermediateLibrary = require('./intermediateLibrary'); 

module.exports = { 
    exec: function() { 
    return intermediateLibrary.exec(); 
    } 
}; 

intermediateLibrary.js

var childModule = require('./childModule'); 

module.exports = { 
    exec: function() { 
    return childModule._exec(); 
    } 
}; 

childModule.js

var lib = {}; 

lib.data = {}; 
lib.data.sentence = "Hello, World!"; 
lib._exec = function() { 
    return lib.data.sentence; 
}; 

module.exports = lib; 

結果:

Hello, World! 
Overridden property. 
Overridden function.