Node.jsでプロジェクトルートのディレクトリを取得する方法
Node.jsでプロジェクトのルートディレクトリを取得する方法はいくつかありますが、一般的な手法を解説いたします。
__dirnameの利用
__dirname は、スクリプトが配置されているディレクトリの絶対パスを返します。
しかし、プロジェクトのルートディレクトリを取得するには、スクリプトの場所によっては適切でない場合があります。
javascriptconsole.log(__dirname);
この方法では、実行するスクリプトのディレクトリが返るため、プロジェクトルートを確実に取得するには、
追加の処理が必要です。
process.cwd()を利用する方法
process.cwd() を使用すると、現在の作業ディレクトリ(カレントワーキングディレクトリ)を取得できます。
通常、プロジェクトのルートで node コマンドを実行するため、こちらの方法が適しています。
javascriptconsole.log(process.cwd());
この方法では、Node.js を実行した場所がルートディレクトリとみなされるため、
一般的なプロジェクト構成では process.cwd() のほうが __dirname より便利です。
import.meta.url を使う方法(ES Module)
ES Module (.mjs ファイルや package.json に "type": "module" を設定した場合) では、 __dirname は利用できません。
そのため、 import.meta.url を利用し、プロジェクトのルートを求める方法があります。
javascriptimport { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
console.log(__dirname);
ただし、これはスクリプトの配置されたディレクトリを取得する方法であり、
プロジェクトルートを求めるには、さらに process.cwd() を利用するほうが適しています。
find-up を利用したルートディレクトリの特定
より確実にプロジェクトのルートを特定したい場合は、 find-up パッケージを使用すると便利です。
例えば、プロジェクトルートには通常 package.json があるため、それを基準に探索できます。
find-up のインストール
shyarn add find-up
find-up を利用したプロジェクトルートの取得
javascriptimport { fileURLToPath } from 'url';
import { dirname } from 'path';
import findUp from 'find-up';
const projectRoot = await findUp('package.json').then(file => file ? dirname(file) : null);
console.log(projectRoot);
この方法では、 package.json を基準にプロジェクトルートを見つけられるため、
より正確にルートディレクトリを取得できます。
まとめ
| 方法 | 特徴 |
|---|---|
__dirname | スクリプトが配置されているディレクトリを取得 |
process.cwd() | Node.js を実行したディレクトリ(一般的にはプロジェクトルート)を取得 |
import.meta.url | ES Module 環境でスクリプトディレクトリを取得 |
find-up | package.json などを基準にプロジェクトルートを検索 |
一般的には process.cwd() を使うのが簡単で便利ですが、
プロジェクトの構成によって find-up を用いるとより確実にルートを特定できます。
適切な方法を選択し、Node.js のプロジェクト管理をより効率的に進めてください。
著書
articleNode.jsセキュリティアップデート、今すぐ必要?環境別の判断フローチャート
articleNode.js HTTP/2サーバーが1リクエストでダウン:CVE-2025-59465の攻撃手法と防御策
articleDatadog・New Relic利用者は要注意:async_hooksの脆弱性がAPMツール経由でDoSを引き起こす理由
article【緊急】2026年1月13日発表 Node.js 脆弱性8件の詳細と対策|HTTP/2・async_hooks のDoS問題を解説
article2026年1月11日Node.jsとTypeScriptのユースケース バックエンド開発で型を活かす実践テクニック
article2025年12月24日TypeScriptでESMとCJS混在をトラブルシュートする ERR_REQUIRE_ESMとimport不可を直す
articleshadcn/ui × TanStack Table 設計術:仮想化・列リサイズ・アクセシブルなグリッド
articleRemix のデータ境界設計:Loader・Action とクライアントコードの責務分離
articlePreact コンポーネント設計 7 原則:再レンダリング最小化の分割と型付け
articlePHP 8.3 の新機能まとめ:readonly クラス・型強化・性能改善を一気に理解
articleNotebookLM に PDF/Google ドキュメント/URL を取り込む手順と最適化
articlePlaywright 並列実行設計:shard/grep/fixtures で高速化するテストスイート設計術
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来
