../../../foo/bar
のような相対的なファイルシステムのナビゲーションを使わずに依存関係をインポートすることをお勧めします。Node.jsの相対パスを避ける
フロントエンドでは、私は伝統的にRequireJSを使用して、「絶対」パスを可能にするデフォルトのベースパスを設定しました。 myapp/foo/bar
。
これをNode.jsでどのように達成できますか?
../../../foo/bar
のような相対的なファイルシステムのナビゲーションを使わずに依存関係をインポートすることをお勧めします。Node.jsの相対パスを避ける
フロントエンドでは、私は伝統的にRequireJSを使用して、「絶対」パスを可能にするデフォルトのベースパスを設定しました。 myapp/foo/bar
。
これをNode.jsでどのように達成できますか?
あなたができることは、常に開始ファイルのモジュールパスである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
です。
ありがとうございます。私は、相対パスがエラーを起こしやすく、フロントエンド上で維持するのが難しいことを発見しました(私はたくさんの '../'を解析するのが難しいと思っていますが、バックエンドでこのような問題をどうやって回避するのですか?あなたには問題はないのですか? – Ben
ファイルを移動しない限り、相対パスは常にnode.jsに静的です。なぜなら、それらは常に 'require'を呼び出すファイルからの相対パスであるからです。 requireJSはWebコンテキストでrequireファイルをロードする方法を確認しますが、scriptタグは常に現在のHTMLドキュメントとの相対的な関係にありますので、スクリプトタグを挿入してjsファイルを読み込む場合は、どこに問題があるのでしょうか? – jishi
require.main.requireの使用例がありましたが、それは実際にはアプリケーションのルートフォルダから構成を探すノードモジュールからのものでした。 (ほとんどの場合、おそらく落胆している) – jishi
ただ、他の回答に追加するには、あなたのメインのファイルで、この数行を置くことができます。
(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/bar
)require('/absolute/path/to/your/app/src/foo/bar')
,package:
で始まらない場合は、それは通常のように振る舞いますrequire
だろう。
インデックスファイルで 'require'する独自のラッパーを作成できませんか? –
うん、それはうまくいくかもしれない - 良いアイデア!しかし、何か組み込みのものがあるかどうかは疑問です(例えば設定オプション)。 – Ben
私の知る限り - いいえ。私はどこにも見たことがありません。 –