11

我的问题

我正在编写一个node名为 的模块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);
});

vmb作为模块运行,因此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)

我的问题

获取在另一个模块中声明的局部变量的值的最干净的方法是什么?想法?

谢谢你的帮助。

4

3 回答 3

5

您可能应该永远不必这样做,但可能是有原因的。

您可以挂钩加载程序并注入 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();
于 2014-08-26T14:25:59.127 回答
1

查看我的模块import-locals

const patcher = new Patcher();
patcher.export("yourmodule", "Foo");
const { Foo } = require("yourmodule");
于 2019-03-10T17:19:35.673 回答
-2

只是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的更多信息

于 2012-12-24T10:43:57.490 回答