0

あるモジュール機能を別のモジュール内で使用したい

ファイル main.js

var _ = require("./underscore.js");
var foo = require("./bar.js");
foo.publish(...);

ファイル bar.js

(function(e) {
    var array = [...];
    e.publish = function(t, args) {
        _.each(array, function(...) {...});
    });
})(exports);

いくつかのバリエーションを試しましたが、このエラーを回避する最善の方法がわかりません:

ReferenceError: _ is not defined
4

2 に答える 2

3

はい、あなたの例の場合、その変数を必要とするすべてのモジュールで使用する必要があります。

var _ = require("./underscore.js");

ただし、複数のモジュール間で 1 つのオブジェクト インスタンスを転送する必要がある場合は、プロセスオブジェクトを使用してグローバルにすることができます。しかし、それは悪い習慣です。

process._ = require("./underscore.js");

モジュール間でオブジェクト インスタンスを渡す良い方法は、それらを関数引数として渡すことですが、オブジェクト自体ではなくファクトリ関数を返すように bar.js を変更する必要があります。

module.exports = function(_) {
   var e = {};
   var array = [...];
   e.publish = function(t, args) {
      _.each(array, function(...) {...});
   });
   return e;
}

main.js で:

var _ = require("./underscore.js");
var foo = require("./bar.js")(_);
foo.publish(...);

あなたが要点を得たことを願っています。

于 2012-10-24T23:30:59.800 に答える
2

結果を割り当てる変数はモジュールmain.jsに対してローカルであるため、bar.jsでアクセスすることはできません。代わりに、bar.jsにもアンダースコアモジュールが必要です。

var宣言するときにをスキップし_てグローバル変数にすることもできますが、それは次のようなグローバル変数のすべての問題をもたらします。

  • モジュールはその依存関係について明示的でbar.jsはないため、アンダースコアがグローバルに必要であると想定していることを理解するのは困難です。
  • 特定の初期化順序が必要です。後でを移動すると_ = require(underscore)、未定義のエラーが再び発生し、その理由を理解するのが難しい場合があります。
  • を必要とする他のすべてのモジュールbar.jsもを必要としますunderscore
于 2012-10-23T21:49:57.710 に答える