当解析和缓存模块时,命令模块加载器保持符号连接。
默认情况下,当 Node.js 从一个被符号连接到另一块磁盘位置的路径加载一个模块时,Node.js 会解引用该连接,并使用模块的真实磁盘的实际路径,作为定位其他依赖模块的标识符和根路径。
大多数情况下,默认行为是可接受的。
但是,当使用符号连接的同行依赖,如下例子所描述的,如果 moduleA
试图引入 moduleB
作为一个同行依赖,默认行为就会抛出异常:
{appDir}
├── app
│ ├── index.js
│ └── node_modules
│ ├── moduleA -> {appDir}/moduleA
│ └── moduleB
│ ├── index.js
│ └── package.json
└── moduleA
├── index.js
└── package.json
--preserve-symlinks
命令行标志命令 Node.js 使用模块的符号路径而不是真实路径,是符号连接的同行依赖能被找到。
注意,使用 --preserve-symlinks
会有其他方面的影响。
比如,如果符号连接的原生模块在依赖树里来自超过一个位置,它们会加载失败。
(Node.js 会将它们视为两个独立的模块,且会试图多次加载模块,造成抛出异常。)
--preserve-symlinks
标志不适用于主模块,它允许 node --preserve-symlinks node_module/.bin/<foo>
工作。
要对主模块应用相同的行为,也可使用 --preserve-symlinks-main
。