新手想请教一个问题,关于require后如何继承require中的所有基于exports或者this的变量 - CNode技术社区

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

感觉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 谢了,我再看看

回到顶部

AltStyle によって変換されたページ (->オリジナル) /