一则HACK: 依赖项替换Overriding Dependency
发布于 8 年前 作者 dashdots 2919 次浏览 来自 分享

目录结构:

  • 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

回到顶部