跳到主要内容

package-lock 审计实战:本地把依赖锁文件读成一份依赖分析清单

教你不装任何工具,在浏览器本地读 package-lock.json,统计总依赖数、分清直接和间接依赖、找出同包多版本和最深嵌套,完成一次干净的依赖分析与锁文件审计。

发布于 作者 李雷
#依赖分析 #package-lock #npm #前端 #供应链审计

package-lock 审计实战:本地把依赖锁文件读成一份依赖分析清单

package-lock.json 是前端项目里最被忽视的一个大文件。它动辄上万行,平时谁也不看,出问题才想起它。可一旦你想知道"这个项目到底拖了多少依赖""为什么同一个包装了三个版本""打包体积是不是被传递依赖撑大的",答案全藏在这个锁文件里。

这篇文章讲怎么把这份难读的文件,变成一张能看懂、能行动的依赖分析清单,而且全程在本地完成,不上传、不联网。

锁文件里到底记了什么

package-lock.json 不是给人看的,是给 npm 看的。它把一次安装确定下来的整棵依赖树固定住:每个包的确切版本、下载地址、integrity 校验值,以及它依赖谁、被谁依赖。

读它的关键是分清两类数据。一类是你在 package.json 里亲手写的直接依赖,通常只有几十个。另一类是这些直接依赖各自又拖进来的间接依赖(传递依赖),数量往往是直接依赖的十几倍。锁文件把两类混在 packages 字段的扁平结构里,光靠肉眼几乎数不清。

一份清单该统计哪些指标

我审一个锁文件,第一步永远是先拿四个数字:

  • 依赖条目总数:packages 里所有 entry 的数量,代表整棵树的规模。
  • 唯一包名数:去重后还剩多少个不同的包,和总数一比就知道重复有多严重。
  • 同包多版本:同一个包名锁了几个不同版本,这是体积膨胀和补丁分裂的头号嫌疑。
  • 最深嵌套层级:依赖树到底套了几层,层越深越难排查。

有了这四个数,你不用读完一万行就能判断这个项目的依赖健康度。这正是 依赖锁文件审计器 做的事:把锁文件粘进去,它在本地解析出条目总数、唯一包名、多版本锁定,以及 git/GitHub 来源、明文 HTTP tarball、预发布版本、缺失 integrity 这些风险信号。

一个真实例子:多版本是怎么藏起来的

我前阵子接手一个老后台项目,装包巨慢,打出来的 bundle 也偏大。把它的 package-lock.json 丢进审计器,清单一目了然:依赖条目总数 1842 条,唯一包名却只有 1107 个,差出来的 700 多条全是重复版本。

继续看多版本明细,问题包很快浮出来:semver 锁了 4 个版本(5.7.1、6.3.0、7.3.5、7.5.4),lodash 锁了 3 个版本,连 tslib 都有两份。原因不复杂:几个老依赖把 semver 的版本范围钉死在了旧 major,新依赖又要新版本,npm 没法合并,只能各装各的。

知道了具体是哪几个包、卡在哪个版本,接下来就有的放矢:能升级的直接依赖先升,升不动的用 overrides 收敛,剩下实在锁死的就记下来留作技术债。这一轮收完,重复条目从 700 多降到 90 出头,装包和打包都快了一截。如果没有这份清单,我大概率只会去跑一遍 npm audit,然后对着满屏漏洞发愁,根本注意不到真正拖后腿的是多版本。

为什么多版本值得单独拎出来

很多人觉得"能装上就行,版本多点无所谓",其实代价是实打实的。同一个包的多个版本会同时进 bundle,体积白白翻倍;打安全补丁时,你得把每个版本都修一遍;更隐蔽的是,某个角落里那个老版本可能正是过期、带已知风险的那一份,而你以为自己早就升级过了。

所以审计锁文件不只是图整洁。把多版本压下去,等于同时给体积、补丁成本和供应链风险都松了绑。日常想查某条 npm 命令怎么写,可以顺手翻 npm 命令速查表,把清理动作落到具体命令上。

把审计变成习惯

不必每天都审。我的做法是在三个时机各跑一次:依赖大改之后、发布冻结之前、以及接手别人项目的第一天。每次花不到一分钟,导出一份 Markdown 或 CSV 清单存进仓库,下次就能对比这几个数字是涨了还是降了。

锁文件是供应链的真相所在,它不会说谎,只是不太愿意开口。把它读成一张清单,你对项目依赖的掌控,就从"大概装了挺多东西"变成了"总共 1842 条、重复 90 条、最深 8 层"这种能直接行动的判断。


Made by Toolora · Updated 2026-06-13