組み込みの path モジュールは、ファイルパスをオペレーティングシステムをまたいで正しく構築・操作します。/ で手動でパス文字列を連結すると Windows(\ を使う)で壊れ、エッジケースを誤って処理します — path はそれらすべてを確実に扱います。
// ❌ 脆弱で、OS に依存し、エラーを起こしやすい
const filePath = baseDir + "/" + "sub" + "/" + fileName;
// Windows (\) で壊れる、baseDir が / で終わるとスラッシュが重複する、など
import path from "path";
// ✅ OS に応じた正しい区切り文字を使い、スラッシュを正規化する
const filePath = path.join(baseDir, "sub", fileName);
// Linux/Mac: baseDir/sub/file.txt Windows: baseDir\sub\file.txt
path.join は適切な区切り文字を挿入し、重複した/末尾のスラッシュを縮約し、../. セグメントを解決します。
path.resolve("src", "app.js"); // → cwd からの絶対パス
path.basename("/a/b/file.txt"); // "file.txt"
path.dirname("/a/b/file.txt"); // "/a/b"
path.extname("file.txt"); // ".txt"
path.parse("/a/b/file.txt"); // { dir, base, name, ext }
path.sep; // OS に応じて "/" または "\"
// CommonJS — 組み込みのグローバル
const configPath = path.join(__dirname, "config.json");
// ES Modules — __dirname は存在しない。import.meta.url から導出する
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
現在のファイルを基準にパスを構築すること(__dirname、またはその ESM 相当を使う)は、ファイルを参照する安全な方法です — プロセスがどこから起動されたかに依存しません。
path.join → セグメントを連結するだけ(相対パスは相対のまま)
path.resolve → 絶対パスを生成する(cwd から / 右から左へ解決)
文字列連結の代わりに path を使うことで、ファイル処理コードがクロスプラットフォームかつ堅牢になります — Mac/Linux で書かれたコードが Windows で壊れたり、連結が不正なパスを生成したりする、よくあるバグの原因を防ぎます。
これは見返りの大きい小さな習慣であり、join と resolve の違い、加えて ESM で __dirname を取得する方法を知れば、ファイルシステムを扱うあらゆる Node プロジェクトでの日常的なパスのニーズをカバーできます。