我正在编写一个名为node
的{{1}}模块,a
是一个模块require()
(由陌生人编写)。不幸的是,b
不仅需要访问公共成员 - 它还需要访问模块范围内声明的局部变量。
a
// 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;
但是// 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
哪种获取在另一个模块中声明的局部变量值的最简洁方法?想法?
感谢您的帮助。
答案 0 :(得分:4)
你应该大部分时间都不应该这样做,但可能有原因。
你可以挂钩加载器并注入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();
答案 1 :(得分:0)
正确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
答案 2 :(得分:0)
签出我的模块import-locals
const patcher = new Patcher();
patcher.export("yourmodule", "Foo");
const { Foo } = require("yourmodule");