2015-08-28 124 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.