Node.js: コマンドラインオプション--preserve-symlinksの挙動


  • --preserve-symlinksなし(デフォルト)の場合
    • シムリンクファイルからrequire(相対パス)すると、実体ファイルからの相対パスになる
  • --preserve-symlinksありの場合
    • シムリンクファイルからrequire(相対パス)すると、シムリンクからの相対パスになる

公式ドキュメントに書いてある通り、たいていの場合は「なし」(デフォルト)のままでうまくいくと思う。

例1

.
├── a.js    // require("./b")
├── b.js -> sub/b.js
└── sub
    ├── b.js    // require("./c")
    └── c.js

--preserve-symlinksなし(デフォルト)の場合

$ node a.js
=> OK

--preserve-symlinksありの場合
./c.jsを読みに行こうとしてエラー。

$ node --preserve-symlinks a.js
internal/modules/cjs/loader.js:892
  throw err;
  ^

Error: Cannot find module './c'

例2

(ファイルの内容は例1と同じ)

.
├── a.js    // require("./b")
├── b.js -> sub/b.js
├── c.js -> sub2/c.js
├── sub
│   └── b.js    // require("./c")
└── sub2
    └── c.js

--preserve-symlinksなし(デフォルト)の場合
./sub/c.jsを読みに行こうとしてエラー。

$ node a.js
internal/modules/cjs/loader.js:892
  throw err;
  ^

Error: Cannot find module './c'

--preserve-symlinksありの場合

$ node --preserve-symlinks a.js
=> OK