2013-05-24 5 views
12

私はNodejs/expressjsを見ていて、別のチュートリアルでは__diranme + "/my_folder""./my_folder"、またはちょうど"my_folder"のいずれかを使用しています。ノードjs/Express jsの相対パス(ドットまたは__dirnameまたは接頭辞なし)?

例:

app.use("/static", express.static(__dirname + "/my_folder")); 
app.use("/static", express.static("./my_folder")); 
app.use("/static", express.static("my_folder")); 

私はそれらすべてを試してみましたが、それらはすべてが動作するように見えます。どのパスを相対パスに使うべきですか?

私はまた、require('./my_file.js')require('my_file')を見たことがあります。違いはありますか?私は何を使うべきですか?

+0

私は、場所を定義する最後の方法はWindows上で壊れると考えています。私は '__dirname + '/ folder''を使って90%ですが、最も安全なアプローチです(具体的な証拠はなく、Windowsでノードを混乱させるランダムな経験です)。 –

答えて

15

ファイルパスを引数として取るほとんどの関数(requireを除く)は、ある時点でfsモジュールの関数を使用して読み書きします。

Node.js documentation for fs moduleは言う:

ファイル名への相対パスを使用することができ、このパスは()をprocess.cwdする相対的となることが覚えておいてください。

これについて考えてみると、これらの機能が異なる動作をするには大きなトリッキーが必要になります。結局のところ、fs関数は通常のJavascriptであり、呼び出し元に関する情報への特別なアクセスはありません。彼らがアクセスできる唯一の__dirnameは、独自のモジュール(コアfsモジュール)の__dirnameです。

require機能requireは、それが中に表示されるすべての単一のファイルのためのユニークな機能であるため、現在の__dirnameに対する解決パスは、これを明示的に指定せずに、この方法です。ですが、それが現在にアクセスすることができるという事実は、モジュールの詳細、特にそのパスについて説明します。

コードが正常に動作する理由は、現在のところ、app.js(またはそれに類する)のコードは、現時点ではprocess.cwd()のディレクトリと同じディレクトリにあるということです。私。 node app.jsでアプリを起動すると、node myappdir/app.js(親ディレクトリから実行)でアプリを起動しても機能しません。 process.cwd()は異なるでしょう。

相対パスがprocess.cwd()で解決されることに注意している限り、短い構文を使用できます。場合によってはそれが有利な場合もあります。あなたのコードはどのように呼び出されているかに依存します。私は個人的には、__dirnameを使用するほうが好きです。何が起こっているのか、そして同じファイルのrequireステートメントで使用するパスとの相対パスがやや透明ですからです。

+0

ありがとう、非常に有益。したがって、私が理解しているならば、 'require'は常に(' dot'または '__dirname'を使って)現在のファイルと相対的なものになります。 'fs'を通過する他のすべてのパスは、' dot'を持つプロセスと相対的であり、 '__dirname'と一緒に渡された場合は呼び出しファイルに相対的です。 – Raekye

+1

正確です。しかし '' __dirname + ''をいくつかのパス ""を実行するのは、通常の文字列の連結に過ぎません。これは関数を呼び出す特別な方法です。それは解釈の余地を残して、絶対的な道をもたらします。 –

0

は、私は私がその後、私は

<link rel="stylesheet" href="/stylesheets/jquery-ui.css" /> 
    <script type="text/javascript" src="/javascripts/jquery-1.9.1.js"></script> 

によって、私は基本的に同じものであると信じてい./myfolderアプローチをこれらの静的ファイルにアクセスすることができます私の公共の、スタイルシート、JavaScriptと画像の内部に3つのフォルダを持っているapp.use(express.static(path.join(__dirname, 'public')));を使用しています。私はそれを一度も使用していません。
/myfolder私が見たことのないアプローチ。 require('myfile')

require('./my_file.js') I use as 
    require('./routes/my_file.js') aand is where I store all my express routes. 

は、インストールまたは明示してインストールしてくるパッケージの呼び出しです。

4

__dirnameバージョンは__dirnameは、常に両方の相対パスであり、プロセスの現在の作業ディレクトリの場合に失敗します"my_folder"または"./my_folder"よりも優れてアンカーで現在実行.jsファイルを含むディレクトリ(process.cwd()になりますので、最も堅牢です)は予期せぬことですが、これはまったく可能です。

requireに渡されたパスでは、プロセスの現在の作業ディレクトリに関係なく、相対パスが呼び出しモジュールの相対位置で解決されるため、別の話です(ここでもこれは脆弱になりません)。

+0

必要な場合は、拡張子を含める必要がありますか?私はしばしば 'require(__ dirname +"/something ")'を参照しますが、 'require(__ diranem +" /something.js ")'(これもうまくいくようです)を参照してください。 – Raekye

+0

Edit:Found '正確なファイル名が見つからない場合、nodeは拡張子が.js、.json、.nodeの必要なファイル名をロードしようとします。何かのために)。だから私はそれがどのように動作するのか知っていますが、暗黙のうちに良い習慣だと思いますか?(暗黙のうちに) – Raekye

+0

慣例はファイル名ではありません。 'module.js'から' module/index.js'に切り替えることもできますし、あなたのライブラリを使っているプログラムは気にする必要もなく更新する必要もありません。 –

関連する問題