node.js:从另一个模块访问本地variables
我的问题
我正在编写一个名为a
的node
模块,它require()
sa模块b
(由陌生人编写)。 不幸的是, a
不仅需要访问公共成员,还需要访问在模块范围内声明的局部variables。
// a var b = require('b'); console.log(b.public); console.log(b.private); // undefined // b var c = require('c'); var stdin = process.stdin; exports.public = true; var private = true;
我的解决scheme
// a var b = require('b'); var srcPath = require.resolve('b'); console.log(b.public); fs.readFile(srcPath, 'utf-8', function (err, src) { var box = {}; var res = vm.runInNewContext(src, box, srcPath); console.log(box.private); });
但是vm
并没有将b
作为模块运行,所以require()
等不能从vm
的上下文中访问。 所以有ReferenceError
像:
var res = vm.runInNewContext(src, box, scPath); ^ ReferenceError: require is not defined at <module b> at <module a> at fs.readFile (fs.js:176:14) at Object.oncomplete (fs.js:297:15)
我的问题
哪个是最简单的方法来获取在另一个模块中声明的局部variables的值 ? 想法?
谢谢你的帮助。
你大概应该永远不必这样做,但可能有原因。
你可以挂钩加载程序并注入JavaScript代码来导出你想要的。
// let's say you have node_modules/foreignmodule/index.js // and in that script there is a local (not-exported) function foreignfunction(). var path = require('path'); _oldLoader = require.extensions['.js']; require.extensions['.js'] = function(mod, filename) { if (filename == path.resolve(path.dirname(module.filename), 'node_modules/foreignmodule/index.js')) { var content = require('fs').readFileSync(filename, 'utf8'); content += "module.exports.foreignfunction=foreignfunction;\n"; mod._compile(content, filename); } else { _oldLoader(mod, filename); } }; require('foreignmodule').foreignfunction();
只需正确export
值
模块B
// b.js // some local var var foo = 'Bar'; exports.Foo = foo; exports.Hello = 'World';
模块A
// a .js b = require('./b'); console.log(b.Foo); //=> 'Bar' console.log(b.Hello); // => 'World'
阅读更多关于nodejs module.exports的信息