Node.js 如何可靠地定位/导入依赖项的依赖项?
我想导入依赖项的依赖项。例如,我想将Node.js 如何可靠地定位/导入依赖项的依赖项?,node.js,pug,Node.js,Pug,我想导入依赖项的依赖项。例如,我想将jade load直接导入我的应用程序: my-app ┗━jade ┗━jade-load 我可以执行require('jade/node\u modules/jade load'),但如果节点\u modules树已被展平或重复数据消除,则此操作将不起作用 我曾想过使用require.resolve()来找出jade load的真正位置,但似乎没有办法告诉它解析的起点。我需要能够说“无论玉在哪里,都需要玉负载” 注意。我不想安装jade load
jade load
直接导入我的应用程序:
my-app
┗━jade
┗━jade-load
我可以执行require('jade/node\u modules/jade load')
,但如果节点\u modules树已被展平或重复数据消除,则此操作将不起作用
我曾想过使用require.resolve()
来找出jade load
的真正位置,但似乎没有办法告诉它解析的起点。我需要能够说“无论玉在哪里,都需要玉负载”
注意。我不想安装jade load作为我的应用程序的直接依赖项;关键是导入jade使用的同一个实例,这样我就可以对其进行monkeypatch。我想您可能希望使用它来管理所需模块的依赖关系。您可以将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.
我猜您可能想使用它来管理所需模块的依赖关系。您可以将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.
这里有点重复,但它可能不是你想要的答案。我不知道有什么可靠的方法可以像你说的那样加载模块。据我所知,模块只能存在于两个位置:在
node\u modules/jade/node\u modules
或node\u modules/
中。为什么不两个都试试?@robertklep-如果我的模块实际上是其他模块的依赖项呢?那么从技术上讲,我想加载的dep可能存在于。/../../node\u modules/
@callum之类的地方。我假设您想从“顶级”应用程序而不是单独的模块加载它。@robertklep我想知道一般的做法,因此,可能是模块或顶级应用程序,这里有什么样的副本,但它可能不是您想要的答案。我不知道有什么可靠的方法可以像你说的那样加载模块。据我所知,模块只能存在于两个位置:在node\u modules/jade/node\u modules
或node\u modules/
中。为什么不两个都试试?@robertklep-如果我的模块实际上是其他模块的依赖项呢?那么从技术上讲,我想加载的dep可能存在于。/../../node\u modules/
@callum。我假设您想从“顶级”应用程序而不是单独的模块加载它。@robertklep我想知道如何一般地加载,也可能是针对模块或顶级应用程序