感觉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函数,比如: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;
}