你如何全球劫持/取代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
的替换不会在文件之间保留。那我怎么能这样做呢?
答案 0 :(得分:4)
每个模块从require
获取Module.prototype
。 Docs
所以你可以做这样的事情来取代原来的
// 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