无法全局劫持/替换Node的要求

时间:2017-07-21 06:53:42

标签: javascript node.js

你如何全球劫持/取代Node的要求?这是我用两个文件制作的虚拟示例:

// index.js
global.require = function hijacked() {
    console.log('not gonna call anything');
}
require('./file');

// file.js
console.log('in file');
console.log('require name: ', require.name);
console.log('global.require name', global.require.name);

然后运行node index.js,我希望看到not gonna call anything,但我只看到了

in file
require name: require
global.require name: hijacked

所以这不是替换require,只是在全局范围内创建一个新函数。

接下来我尝试了这个:

// index.js
const original = require;
require = function hijacked(arg) {
   console.log('hijacking');
   original(arg);
}
require('./file');

// file.js
console.log('in file');
console.log('require name: ', require.name);

这一次,我看到了

hijacking
in file2
require name:  require

同样,require的替换不会在文件之间保留。那我怎么能这样做呢?

1 个答案:

答案 0 :(得分:4)

每个模块从require获取Module.prototypeDocs

所以你可以做这样的事情来取代原来的

// index.js
const Module = require('module')

const {require: oldRequire} = Module.prototype

Module.prototype.require = function hijacked(file) {
  console.log('hijacked> ', file )

  return oldRequire.apply(this, arguments)
}

require('./file1')

在file1

require('path')

console.log('in file 1')

输出

$ node .
hijacked>  ./file1
hijacked>  path
in file 1