Skip to content

Instantly share code, notes, and snippets.

@uupaa
Last active December 5, 2023 11:18
Show Gist options
  • Save uupaa/da42698d6b2d2cbb3cca to your computer and use it in GitHub Desktop.
Save uupaa/da42698d6b2d2cbb3cca to your computer and use it in GitHub Desktop.
node.js で絶対パスや相対パスを取得する方法 npm __dirname

node.js でパスを取得する方法についてのメモ

$ node ~/hoge/Foo.js/a.js

を実行したときに、

  • process.argv[1] から、node コマンドに指定された a.js のパス( ~/hoge/Foo.js/a.js )を取得できます

  • process.cwd() から、node コマンド実行時のワーキングディレクトリパス( ~/hoge/Foo.js )を取得できます

  • __dirname には、現在実行中のソースコードが格納されているディレクトリパスが格納されています。

    • ~/hoge/Foo.js/a.js 内部で __dirname を取得すると ~/hoge/Foo.js になります
    • ~/hoge/Foo.js/b/b.js 内部で __dirname を取得すると ~/hoge/Foo.js/b になります
    • ~/hoge/Foo.js/c/c.js 内部で __dirname を取得すると ~/hoge/Foo.js/c になります
    • ソースコード(a.js, b.js, c.js)を結合し、1ファイル化(a.js)した場合は、 __dirname の値が変化します
  • require("path").resolve("") で cwd を基準とした絶対パスを求める事ができます

ディレクトリ構造

   hoge/
     Foo.js/
       b/
          b.js
       c/
          c.js
        a.js

テストスクリプト

// ~/hoge/Foo.js/a.js

console.log(process.argv[1], "a.js", "cwd", process.cwd());
console.log(process.argv[1], "a.js", "__dirname", __dirname);
console.log(process.argv[1], "a.js", "path.resolve", require("path").resolve(""));

console.log("----");
require("./b/b"); // ~/hoge/Foo.js/b/b.js
// ~/hoge/Foo.js/b/b.js

console.log(process.argv[1], "b.js", "cwd", process.cwd());
console.log(process.argv[1], "b.js", "__dirname", __dirname);
console.log(process.argv[1], "b.js", "path.resolve", require("path").resolve(""));

console.log("----");
require("../c/c"); // ~/hoge/Foo.js/c/c.js  → "../c/c" ではなく "../c/c.js" としても結果は同じ
// ~/hoge/Foo.js/c/c.js

console.log(process.argv[1], "c.js", "cwd", process.cwd());
console.log(process.argv[1], "c.js", "__dirname", __dirname);
console.log(process.argv[1], "c.js", "path.resolve", require("path").resolve(""));

実行結果

~/ の部分はユーザの環境ごとのパスに展開されます

$ node a.js

~/hoge/Foo.js/a.js   a.js   cwd            ~/hoge/Foo.js
~/hoge/Foo.js/a.js   a.js   __dirname      ~/hoge/Foo.js
~/hoge/Foo.js/a.js   a.js   path.resolve   ~/hoge/Foo.js
----
~/hoge/Foo.js/a.js   b.js   cwd            ~/hoge/Foo.js
~/hoge/Foo.js/a.js   b.js   __dirname      ~/hoge/Foo.js/b
~/hoge/Foo.js/a.js   b.js   path.resolve   ~/hoge/Foo.js
----
~/hoge/Foo.js/a.js   c.js   cwd            ~/hoge/Foo.js
~/hoge/Foo.js/a.js   c.js   __dirname      ~/hoge/Foo.js/c
~/hoge/Foo.js/a.js   c.js   path.resolve   ~/hoge/Foo.js
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment