🔙 Back to Top

Sat Aug 23 14:51:41 JST 2014

node の require とか fs はどこ基準の相対パスか

そろそろはっきりさせよう.

~/test を作業ディレクトリに、 ~/test/test.* というスクリプトを実行するとき を考える

bash の場合

まずは bash

~/test$ cd ~/test
~/test$ mkdir src

~/test$ echo '
echo $PWD
cat thefile
' > src/test.sh

~/test$ echo "base" > thefile
~/test$ echo "base/src" > src/thefile

~/test$ bash src/test.sh
/home/cympfh/test
base

これはつまり、スクリプトを作業ディレクトリにコピーしてから実行したと考えて同じ挙動である.

cp src/test.sh .
bash test.sh

(これは上と同じ挙動)

node (nodejs) の場合

src/library.js を読む (require) スクリプト src/test.js を、 作業ディレクトリから 呼ぶ.

// src/test.js
fs = require('fs')
cat = require('./library.js').cat
cat('thefile')
console.log(fs.readFileSync('thefile', 'utf8'))

cat_the_file = require('./library.js').cat_the_file
cat_the_file();
// src/library.js
exports.cat = function (path) {
  console.log(fs.readFileSync(path, 'utf8'))
};
exports.cat_the_file = function () {
  var path = 'thefile'
  console.log(fs.readFileSync(path, 'utf8'))
}

結果

~/test$ node src/test.js
base

base

base

つまり、require の中に書いた相対パスだけ、 スクリプト基準に解釈し、 その他のパスは作業ディレクトリを基準にする.

終わり

基準点の違う相対パス を織り交ぜて書くのが気持ち悪い.

なにより、 vim のパス補完が一方が利く場合には もう一方がどうしても利かないのが不便である.