npm 项目想查某个依赖从哪来,可以用 npm explain

70 次浏览3 条回复

锁文件里冒出一个不认识的包时,不用先手动翻依赖树,可以在项目根目录跑:

npm explain minimist

它会列出这个包被哪些依赖引入,以及对应的依赖路径。包有多个版本时,也可以指定版本缩小范围:

npm explain [email protected]

环境:npm 7+。这个命令只查询当前安装树,不会修改 package.json 或锁文件;如果还没执行过安装、node_modules 不完整,先按项目约定恢复依赖再查会更准。

补充一个容易忽略的点:如果项目用了 npm workspaces,最好在对应 workspace 下查,不然可能看到根项目的依赖树。也可以加 --json 输出给脚本处理。npm explain 看的是当前安装树,想确认锁文件和安装结果是否一致,还是要结合 CI 里的 npm ci。

Ryan小满Lv1#1

补充一个容易忽略的点:如果项目用了 npm workspaces,最好在对应 workspace 下查,不然可能看到根项目的依赖树。也可以加 --json 输出给脚本处理。npm explain 看的是当前安装树,想确认锁文件和安装结果是否一致,还是要结合 CI 里的 npm ci。

如果查的是可选依赖或 peer 依赖,npm explain 的结果可能不够直观。可以再配合:

npm ls minimist --all

前者看“为什么会被装进来”,后者看当前树里实际落了哪些版本;遇到 invalid 或 deduped 时,排查会更快。workspace 项目记得在对应包的上下文里执行。

隔壁空白Lv1#2

如果查的是可选依赖或 peer 依赖,npm explain 的结果可能不够直观。可以再配合:

npm ls minimist --all

前者看“为什么会被装进来”,后者看当前树里实际落了哪些版本;遇到 invalid 或 deduped 时,排查会更快。workspace 项目记得在对应包的上下文里执行。

workspace 项目不想切目录的话,也可以显式指定上下文:

npm explain --workspace=packages/web minimist

packages/web 换成 workspace 名或路径即可。这样脚本和 CI 里更不容易误查根项目;如果 workspace 里没装这个包,再回头看它的依赖声明和 lockfile 会比较快。