Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何可靠地定位/导入依赖项的依赖项?_Node.js_Pug - Fatal编程技术网

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我想知道如何一般地加载,也可能是针对模块或顶级应用程序