新手想请教一个问题,关于require后如何继承require中的所有基于exports或者this的变量
发布于 12 年前 作者 samoin 5788 次浏览 最后一次编辑是 8 年前

感觉require类似于java的extends,我想知道,如何可以在连续的嵌套中,获取之前的某层中的变量或function,加入有这样一个场景,三级require : model >baseWithIDIncreasment(带id自增的基础表) >base(基础表), 加入,我在base中定义了 exports.save = function(){//保存} 而我在baseWithIDIncreasment中没有定义 var base = require("./base"); //exports.save = base.save; 那么我在model这一层的时候有没有办法,可以获取到base里的save这个action。

不知道我是否描述清楚了,还请给予帮助

6 回复
  • 感觉 require和extends没多大关系啊,是和import类似
  • 要实现继承就用node自己的方法啊(inherit),模仿js的话也可以

最近写了个增强的require函数,比如:requireWithContext('./module_name', {a: 123})载入模块时,在 ./module_name 里面可以直接使用变量a(像全局变量一样),但仅在当前模块有效,不会污染真的全局变量。当在 ./module_name 中使用require()来载入其他模块时,还是跟原来的require函数一样。

参考代码如下:

var vm = require('vm');
function requireWithContext(filename, sandbox, parent) {
  if (!parent)
    parent = {require: require}
  if (!sandbox)
    sandbox = {}
  
  // 读取代码
  var code = fs.readFileSync(filename, 'utf8');
  
  // 模拟require()环境
  sandbox.module = new Module(filename, parent);
  sandbox.exports = sandbox.module.exports;
  sandbox.__dirname = path.dirname(filename);
  sandbox.__filename = filename;
  sandbox.module.filename = filename;
  sandbox.module.paths = Module._nodeModulePaths(sandbox.__dirname);
  sandbox.global = sandbox;
  sandbox.root = root;
  sandbox.require = function (path) {
    var f = sandbox.require.resolve(path);
    return parent.require(f);
  }
  sandbox.require.resolve = function(request) {
    return Module._resolveFilename(request, sandbox.module);
  }
  sandbox.require.main = process.mainModule;
  sandbox.require.extensions = Module._extensions;
  sandbox.require.cache = Module._cache;
  
  // 运行代码
  vm.runInNewContext(code, sandbox, filename);
    
  // 返回模块输出
  return sandbox.module.exports;
}
var vm = require('vm'); 
var fs = require('fs');
function (filename, sandbox, parent) {
  if (!parent)
    parent = {require: require}
  if (!sandbox)
    sandbox = {}
  
  // 读取代码
  var code = fs.readFileSync(filename, 'utf8');
  
  // 模拟require()环境
  sandbox.module = new Module(filename, parent);
  sandbox.exports = sandbox.module.exports;
  sandbox.__dirname = path.dirname(filename);
  sandbox.__filename = filename;
  sandbox.module.filename = filename;
  sandbox.module.paths = Module._nodeModulePaths(sandbox.__dirname);
  sandbox.global = sandbox;
  sandbox.root = root;
  sandbox.require = function (path) {
    var f = sandbox.require.resolve(path);
    return parent.require(f);
  }
  sandbox.require.resolve = function(request) {
    return Module._resolveFilename(request, sandbox.module);
  }
  sandbox.require.main = process.mainModule;
  sandbox.require.extensions = Module._extensions;
  sandbox.require.cache = Module._cache;
  
  // 运行代码
  vm.runInNewContext(code, sandbox, filename);
    
  // 返回模块输出
  return sandbox.module.exports;
}

var Module = require('module');

谢了,我再看看

@leizongmin 谢了,我再看看

回到顶部