← 返回目录

第 1 卷

第 1 / 26 卷日期:

深入解析:npm 安装包及四大包管理工具对比

一、npm 安装包的完整过程

你想了解 npm 安装包的底层流程,其核心是从解析依赖到落地安装的一系列有序操作,具体步骤如下:

  1. 命令解析与参数处理:npm 首先解析用户输入的命令(如 npm install <package>、

npm i <package> -S/-D/-g),区分局部安装(项目目录)与全局安装(系统全局 node_modules)、生产依赖(dependencies)与开发依赖(devDependencies)。

  1. 依赖版本解析:

◦ 先检查项目根目录的 package.json 文件,读取目标包的版本约束(如 ^1.2.3、

~4.5.0);

◦ 结合 package-lock.json(npm 5+ 新增)或 npm-shrinkwrap.json,优先锁定已

确定的版本(保证跨环境安装一致性),若无锁定文件,则去 npm 官方仓库(registry)查询该包的最新符合版本。

  1. 依赖树构建:递归解析目标包的 package.json,获取其自身的依赖

(dependencies/devDependencies),逐层构建完整的依赖树,同时处理依赖冲突(如不同包依赖同一依赖的不同版本,会通过嵌套安装解决)。

  1. 缓存检查:npm 会先检查本地缓存目录(默认路径:Windows %USERPROFILE%.npm、

Mac/Linux ~/.npm),若缓存中存在对应版本的包,且缓存未过期,直接复用缓存,跳过下载步骤;若缓存不存在或已过期,执行下一步。

  1. 包下载:从配置的 registry 地址(默认 https://registry.npmjs.org/)下载对应包的压缩包(.tgz 格

式),同时将下载的包缓存到本地缓存目录,方便后续复用。

  1. 包解压与安装:将下载/缓存的包解压到项目的 node_modules 目录(局部安装)或全局

node_modules 目录(全局安装),并完成文件部署。

  1. 后续收尾操作:
  • 更新 package.json:根据安装参数(-S/-D),将包名与版本添加到对应的依赖字段中;

◦ 更新 package-lock.json:记录本次安装的所有包的精确版本、依赖关系、下载地址等信

息,确保后续 npm install 能复刻相同的依赖结构;

◦ 执行生命周期脚本:若包自身或项目中配置了 preinstall、 install、

postinstall 等脚本,会按顺序执行这些脚本(如部分包需要编译原生模块)。

工具核心差异各自优势
npm官方原生工具,早期采用嵌套1. 官方标配,兼容性最好,
依赖结构(npm 2),后续改无需额外配置,生态支持最完
为扁平依赖(npm 3+),无善;2. 稳定性高,迭代成
共享存储,缓存机制简单熟,适合绝大多数常规项目;
  1. package-lock.json 锁

定版本,保证跨环境一致性;

  1. 支持丰富的命令与生命周

期脚本,功能全面

cnpm淘宝镜像推出的 npm 替代工1. 下载速度极快(国内镜像
具,核心是修改了 registry 为源,解决 npm 官方源网络卡
淘宝镜像顿问题);2. 使用方式与
(https://registry.npmmirronpm 完全兼容,无需额外学
r.com/),安装机制与早期习成本;3. 针对国内网络环
npm 类似,依赖嵌套存储境优化,包下载失败率极低
yarnFacebook 推出,早期解决1. 安装速度比早期 npm 更
npm 版本不一致问题,采用快,并行安装优化了依赖下载
扁平依赖,内置缓存,支持并效率;2. yarn.lock 锁定
行安装机制更严谨,版本一致性保障

更强;3. 内置离线模式,已缓存的包可离线复用,无需重

新下载;4. 支持工作区(workspaces),对多包管

理(monorepo)支持更友好(早期优于 npm);5. 安装

时输出更清晰,错误提示更友好

pnpm采用“内容寻址存储”+“硬1. 磁盘空间占用最少(核心
链接/符号链接”机制,依赖优势),相同版本包仅存储一
非扁平存储,有独立的共享存份,通过链接复用;2. 安装
储目录速度最快(远超 npm、

yarn、cnpm),并行安装 +缓存复用+无依赖冗余解

析;3. 依赖隔离性最好,避免“幽灵依赖”(仅能访问

package.json 声明的依

  1. 兼容 npm 命令与

package.json 格式,迁移成本低

补充核心差异总结:

  • 存储机制:npm/yarn/cnpm 为扁平存储(npm 3+),pnpm 为共享存储+链接机制;

• 性能排序(安装速度+磁盘占用):pnpm > yarn > cnpm > npm(最新版 npm 已优化,差距缩

小,但 pnpm 仍领先);

• 网络优化:cnpm 依赖国内镜像,npm/yarn/pnpm 可手动配置镜像,pnpm 缓存跨项目复用更

强;

  • 依赖隔离:pnpm 完全隔离,无幽灵依赖;npm/yarn/cnpm 存在幽灵依赖问题。
三、pnpm 存储结构减少磁盘占用+提高安装速度的原理

pnpm 之所以能在磁盘占用和安装速度上远超其他工具,核心在于其独特的 “共享存储(contentaddressable store)” + “硬链接(hard link)” + “符号链接(symbolic link)” 组合设计,

具体原理如下:

  1. 减少磁盘空间使用的核心原理

• 全局共享存储目录:pnpm 会在系统中创建一个全局共享存储目录(默认路径:Windows

%LOCALAPPDATA%\pnpm\store、Mac/Linux ~/.pnpm-store),所有项目安装的包,都会先将包的完整内容按“内容寻址”规则存储到该目录中⸺相同版本的包仅存储一份,无论多少

个项目依赖该包,都不会重复存储,从根源上杜绝了冗余存储。

• 硬链接复用包内容:硬链接是文件系统层面的特性,它不复制文件本身,仅创建一个指向原文件数

据的引用(相当于给同一个文件起了多个“文件名”)。pnpm 在安装时,不会将共享存储中的包复制到项目 node_modules,而是通过硬链接将共享存储中的包文件链接到项目的 pnpm-

store 子目录,硬链接占用的磁盘空间可以忽略不计,实现了包内容的零冗余复用。

• 符号链接组织依赖结构:pnpm 不采用扁平依赖结构,而是通过符号链接在项目

node_modules 中构建“嵌套式”的依赖树(逻辑上嵌套,物理上共享)。对于项目直接依赖的包,会在 node_modules 中创建指向共享存储的符号链接;对于间接依赖(包的依赖),会

在对应包的 node_modules 中创建符号链接,既保证了依赖的正确引用,又无需重复存储间接依赖包。

  1. 提高安装速度的核心原理
全站分卷索引 · 26 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷
  20. 20第 20 卷
  21. 21第 21 卷
  22. 22第 22 卷
  23. 23第 23 卷
  24. 24第 24 卷
  25. 25第 25 卷
  26. 26第 26 卷