2017-07-13 12 views
1

../../../foo/barのような相対的なファイルシステムのナビゲーションを使わずに依存関係をインポートすることをお勧めします。Node.jsの相対パスを避ける

フロントエンドでは、私は伝統的にRequireJSを使用して、「絶対」パスを可能にするデフォルトのベースパスを設定しました。 myapp/foo/bar

これをNode.jsでどのように達成できますか?

+0

インデックスファイルで 'require'する独自のラッパーを作成できませんか? –

+0

うん、それはうまくいくかもしれない - 良いアイデア!しかし、何か組み込みのものがあるかどうかは疑問です(例えば設定オプション)。 – Ben

+0

私の知る限り - いいえ。私はどこにも見たことがありません。 –

答えて

1

あなたができることは、常に開始ファイルのモジュールパスであるrequire.main.requireを使用することです。あなたはそれがあなたの出発ファイルのベースパスに基づいて、それを必要とする

const x = require.main.require('some/file/path/y')

を実行したときにすることを、https://nodejs.org/api/modules.html#modules_accessing_the_main_module

これは、参照してください(つまりはnode app.jsがapp.jsファイルを意味し、呼び出されました)。

他のオプションでは、アプリケーションの開始パスを取得するためにprocess.cwd()を使用することができますが、ファイルの場所ではなくノードプロセスを呼び出す場所によって異なります。意味は、node app.jsは、あなたがそれを1レベル上に始めるのとは異なる、node src/app.jsです。

+0

ありがとうございます。私は、相対パスがエラーを起こしやすく、フロントエンド上で維持するのが難しいことを発見しました(私はたくさんの '../'を解析するのが難しいと思っていますが、バックエンドでこのような問題をどうやって回避するのですか?あなたには問題はないのですか? – Ben

+0

ファイルを移動しない限り、相対パスは常にnode.jsに静的です。なぜなら、それらは常に 'require'を呼び出すファイルからの相対パスであるからです。 requireJSはWebコンテキストでrequireファイルをロードする方法を確認しますが、scriptタグは常に現在のHTMLドキュメントとの相対的な関係にありますので、スクリプトタグを挿入してjsファイルを読み込む場合は、どこに問題があるのでしょうか? – jishi

+0

require.main.requireの使用例がありましたが、それは実際にはアプリケーションのルートフォルダから構成を探すノードモジュールからのものでした。 (ほとんどの場合、おそらく落胆している) – jishi

1

ただ、他の回答に追加するには、あなたのメインのファイルで、この数行を置くことができます。

(function (module) { 
    let path = require('path') 
    let __require = module.constructor.prototype.require 
    let __cpath = __dirname 

    module.constructor.prototype.require = function (str) { 
    if (str.startsWith('package:')) { 
     let package = str.substr(8) 
     let p = path.resolve(__dirname, package) 

     return __require(p) 
    } else { 
     return __require(str) 
    } 
    } 
})(module) 

それは、このような方法であなたのrequireを拡張します。

  • パスはpackage:で始まる場合(すなわちpackage:src/foo/barrequire('/absolute/path/to/your/app/src/foo/bar'),
  • に変換されます。それがpackage:で始まらない場合は、それは通常のように振る舞いますrequireだろう。