2011-07-11 12 views
3

別のモジュールで呼び出すことができる1つのモジュールでカスタムrequireメソッドを定義することはできますか? X/x.js Y/y.jsCommonJS(特にノード)でカスタム `require`メソッド

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

yの

exports.xrequire = function(path) { 
    console.log("requiring " + path); 
    require(path); 
}; 
Y/hello.jsで

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

そして、例えば

、 .jsが実行されると、「Hello World」が出力されます。

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


このコードの問題は、それがX/hello.js、ではない/ Y hello.jsをロードしようということである - 私はそれが必要規格と同じ仕事をしたいと思います。

+0

試しても機能しませんか? –

+0

問題は、 'y/hello.js'ではなく、' x/hello.js'を読み込もうとしていることです。標準のrequireと同じように動作させたいのです。 –

答えて

1

これは確かに可能です。実行時にpose problemsになることができるグローバル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; 

あなたはrequireに計画している場合、私は間違いなく徹底的にあなたのモジュール内で、これを文書化します:Dこの機能は、それは確かに作業を行います。

EDIT:

さてあなたは、ファイルをテストし、それが存在しない場合は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関数を作成することをお勧めします。

+0

デフォルトの 'require'のように、標準の相対パスで動作するようにしたいと思います。ハードコードされたものではありません。しかし、ありがとう:) –

+0

なぜですか?あなたは '要求'が泡立つか何かを望んでいますか? – William

+0

私は標準の 'require 'と同じように' xrequire'を使うことができるようにしたいと考えていますが、追加の機能(例えばロギング - これは本当に私がやっていることではありません)です。 'xrequire'はどのCJSパッケージにも含まれていなければなりません。 –

0

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

具体的な実装では、あなたが望むことをすることができますが、別の実装では失敗する可能性があります。

編集:上記は、私がcommonJSモジュールについて学習していたときの思い出に由来しています。仕様にそのように定義されているようには見えません。

関連する問題