gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:32:59 25 4
gpt4 key购买 nike

如何全局劫持/替换 Node 的 require?这是我用两个文件制作的虚拟示例:

// 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 的替换不会在文件之间持久化。那么我该怎么做呢?

最佳答案

每个模块都从 Module.prototype 获取它的 requireDocs .

所以你可以做这样的事情来替换原来的

// 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')

在文件1中

require('path')

console.log('in file 1')

输出

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

关于javascript - 无法全局劫持/替换 Node 的要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45230939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com