3

require別のモジュールで呼び出すことができるカスタムメソッドを1つのモジュールで定義することは可能ですか?

たとえば、x/x.jsでは

exports.xrequire = function(path) {
   console.log("requiring " + path);
   require(path);
};

y/hello.jsで

console.log("Hello, world!");

そして、y/y.jsで

var xrequire = require("../x/x.js").xrequire;
xrequire("hello.js");

y.jsを実行すると、「HelloWorld」が出力されます。

これは悪い考えのように思えますが、私にはそれを行う正当な理由があります。;)


このコードの問題は、y/hello.jsではなくx/hello.jsを読み込もうとすることです—標準の要件と同じように機能させたいのですが。

4

2 に答える 2

1

あなたは確かにこれを行うことができます。実行時に問題を引き起こす可能性のあるグローバルrequire.paths配列の変更を正常に回避でき、将来のリリースで問題が発生することはありません。

require現在のアプリに単純化したモデルを簡単に設定できるはずです。あなたの例によると、x.jsには含まれているはずです。

var relative = 'y/';
exports.xrequire = function(path) {
   console.log("requiring " + relative + path);
   return require(relative+path);
};

その後、カスタムを正常に使用できますrequire

var xrequire = require('x.js'),
    hello = xrequire('hello.js');

これはお勧めしませんが、本当に卑劣になりたい場合は、関数をオーバーライドできますrequire

var require = xrequire;

この機能を:Dする予定がある場合は、モジュール内でこれを完全に文書化しますrequireが、確かに機能します。

編集:

requireファイルをテストして、ファイルが存在しない場合にフォールバックすることもできます。

var relative = 'y/';
exports.xrequire = function(path) {
   var ret;
   try{
     ret = require(relative+path);
     console.log("requiring " + relative + path);
   }catch(e){
     console.log("requiring " + path);
     ret = require(path);
   }
   return ret;
};

process.cwd最初に正しいディレクトリを強制的に検索するために、requireパスの先頭に追加してみてください。正直なところ、これはほとんどの開発者を混乱させるでしょう。アプリの名前空間を定義し、その名前空間のアプリの特別な関数のみを取得する特別なrequire関数を作成することをお勧めします。

于 2011-07-11T18:09:47.213 に答える
0

CommonJsモジュールの仕様では、ビルドツールがモジュールをプリロードできるように、名前をrequire付けrequire、文字列リテラルで呼び出す必要があります。

特定の実装では、必要なことを実行できる場合がありますが、別の実装で失敗したり、アップグレードしたりすると失敗する場合があります。

編集:上記は、commonJSモジュールについて学んでいたときの私の思い出から来ています-仕様ではそのように定義されていないようです。

于 2011-07-11T17:29:20.157 に答える