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);
});

ただし、モジュールとしてvmは実行されないため、 のコンテキストからなどにアクセスすることはできません。したがって、次のようなものがあります。brequire()vmReferenceError

    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 に答える
-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 に答える