こうこく
作 ▸
改 ▸

path.resolve() はnodeコマンドで実行されてるスクリプトから見たパスを返す

スクリプト内からスクリプトを呼んでるとき、呼ばれた方のスクリプトで path.resolve() したら、なんか思ってるのと違うものが返ってきた

↓こんな風に /path/to/app 以下に index.js、さらに lib 以下に mod.js がある構成だとして

 /path/to/app
  ├ index.js
  └ lib
     └ mod.js

↓ファイルの中身をこうして node コマンドで index.js を実行した結果は、コード中のコメントに書いた通りになる

index.js
const path = require('path');

console.log(path.resolve('.'));   // -> /path/to/app
console.log(path.resolve('..'));  // -> /path/to
console.log(__dirname);            // -> /path/to/app

require('./lib/mod');
lib/mod.js
const path = require('path');

console.log(path.resolve('.'));   // -> /path/to/app        (index.jsと結果が変わらない)
console.log(path.resolve('..'));  // -> /path/to            (index.jsと結果が変わらない)
console.log(__dirname);            // -> /path/to/app/lib

path.resolve() が返すパスは、常に node コマンドで直接実行したスクリプトから見たパスらしい。ファイルから見たパスではない。

もし mod.js から見た ../ の絶対パスを知りたい場合は、↓のように __dirname と組み合わせて書く必要がある。

lib/mod.js
const path = require('path');

console.log(path.resolve('..'));             // -> /path/to
console.log(path.resolve(__dirname, '..'));  // -> /path/to/app  (mod.jsから見た../)
この記事に何かあればこちらまで (非公開)