如果你在开发过程中遇到了一些 npm
包无法解析的问题,那么 realpath-missing
可能是解决这个问题的利器。realpath-missing
是一个 npm
包,可以帮助解决由于软链接或者冲突的本地 node_modules
导致的无法解析 npm
包的问题。
安装
先使用 npm
或 yarn
安装 realpath-missing
:
npm install --save realpath-missing
或者
yarn add realpath-missing
使用案例
以下面的文件夹结构为例:
├── node_modules │ ├── b │ ├── c │ └── d -> ../d ├── a │ └── index.js └── d └── index.js
现在,我们在 a/index.js
中需要引用 d/index.js
。这时候,我们直接引入是会出现问题的:
// a/index.js const d = require('d'); // Error: Cannot find module 'd'
这是因为 d
不在 node_modules
中,而是通过软链接指向 ../d
的。要解决这个问题,我们可以使用 realpath-missing
中提供的方法。
// a/index.js const realpathMissing = require('realpath-missing'); const dUri = realpathMissing.resolve('d'); const d = require(dUri);
其中 realpathMissing.resolve
返回了 d
的真实路径,可以用于 require
引入。
原理解释
在上面的例子中,和其他 npm
包一样,d
的 package.json
中记录了该包的入口文件为 d/index.js
。但是,我们把 d
通过软链接的方式放到了项目根目录的 d
目录下。因此,当我们 require
d
时,node_modules
下的 b
, c
和 d
都被扫描了一遍后仍然没有找到 d
,程序此刻有两个选项:1、递归处理每个模块,直到出现成功引入模块或者所有模块都处理完毕。2、报错。很快,这个问题升级为了不可复现的问提。实际上,这个问题的原因是 d
目录的真实路径比 node_modules/d
路径更优先,因为软链接(如:ln -s /path/to/a/ /path/to/b/
)表现出了和物理路径一样的模样,并且 Python 自带的等效方法 os.path.realpath
也不足以解决这个问题。
总结
在实际的开发中,我们可能经常需要引用 node_modules
中的包。当这个包被软链接到本地,或者本地存在同名的 node_modules
包时,就会出现无法解析的问题。realpath-missing
提供了一种解决方案,可以帮助我们找到真正的包路径并进行引用。
希望这篇文章能让你更好地理解 realpath-missing
的使用方法和原理,对你在开发过程中遇到的问题有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5f2b9fe73b0ab45f74a8bb4b