一则HACK: 依赖项替换Overriding Dependency
目录结构:
- lib/
- dep.js
- testModule.js
- index.js
lib/dep.js
module.exports = function() { return 'dep.js' };
lib/testModule.js
var dep = require('./dep');
module.exports = function(){
console.log(dep());
};
index.js
var testModule = require('./lib/testModule');
testModule();
可以看到testModule 依赖dep,如何在不改动testModule、dep源码的前提下,替换掉testModule对dep的依赖? lib/testModule2.js*
var modules = require('module');
var backup = modules._cache;
var sandbox = modules._cache = {};
require('./dep');
sandbox[require.resolve('./dep')].exports = function() { return 'replaced' }; // 这里使用匿名函数替换掉了原先的def
module.exports = require('./testModule');
modules._cache = backup;
index.js
var testModule = require('./lib/testModule');
testModule(); // 'dep.js'
var testModule2 = require('./lib/testModule2');
testModule2(); // 'replaced'
注:这是一则用于NodeJS的require HACK,如果要在生产环境中使用,建议使用proxyquires