如何可靠地定位/导入依赖项的依赖项?

时间:2015-08-28 13:17:14

标签: node.js pug

我想导入依赖项的依赖项。例如,我想将jade-load直接导入我的应用:

my-app
 ┗━jade
   ┗━jade-load

我可以require('jade/node_modules/jade-load'),但如果node_modules树已被展平或重复使用,则无法正常工作。

我想过使用require.resolve()找出jade-load到底在哪里,但似乎没有办法告诉它起点决议。我需要能够说"要求玉石来自任何地方的玉石和#34;。

NB。我不想安装jade-load作为我的应用程序的直接依赖;重点是导入jade使用的同一个实例,所以我可以对其进行monkeypatch。

1 个答案:

答案 0 :(得分:0)

我想您可能希望使用proxyquire来管理所需模块的依赖关系。您可以将proxyquire设置为在子模块加载时全局覆盖子模块的方法。

main.js

set(h1,'Color','g','DisplayName','1');
set(h2,'Color','b','DisplayName','2e');
plot(ax(1),x3,y3,'Color','r','DisplayName','3');
plot(ax(2),x4,y4,'Color','k','DisplayName','4');

parentModule.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);

intermediateLibrary.js

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

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

childModule.js

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

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

结果:

var lib = {};

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

module.exports = lib;