文章目录
区别
特性 | npm | yarn | pnpm | cnpm | npx |
---|---|---|---|---|---|
核心定位 | Node.js 默认包管理 | 增强稳定性与性能 | 高效存储与严格隔离 | 国内镜像加速工具 | 临时执行包命令 |
依赖存储方式 | 扁平化 node_modules | 扁平化 + lock 文件 | 全局硬链接 + 符号链接 | 同 npm | 不适用 |
安装速度 | 较慢 | 较快(并行下载) | 最快(复用缓存) | 快(国内 CDN) | 不适用 |
磁盘占用 | 高 | 高 | 极低(共享存储) | 高 | 无 |
依赖隔离性 | 弱(依赖提升) | 中(lock 文件控制) | 强(符号链接隔离) | 同 npm | 不适用 |
Monorepo 支持 | 基础(workspaces) | 强大(workspaces) | 原生支持 | 不支持 | 不适用 |
锁文件 | package-lock.json |
yarn.lock |
pnpm-lock.yaml |
同 npm | 无 |
安全性 | 中 | 高 | 极高 | 低(镜像源风险) | 中 |
国内网络优化 | 无 | 无 | 无 | 有(淘宝镜像) | 无 |
典型命令 | npm install |
yarn add |
pnpm add |
cnpm install |
npx create-app |
适用场景 | 简单项目、兼容性需求 | 中大型项目、稳定性 | 大型项目、Monorepo | 国内网络环境加速 | 临时执行 CLI 工具 |
特点
pnpm
pnpm 使用 硬链接(Hard Link)和符号链接(Symlink) 来管理依赖文件。所有依赖包的实际文件存储在全局的单一内容寻址存储中(类似 Git),不同项目共享相同文件。
优势:
-
节省磁盘空间:
-
所有依赖的每个版本仅保存一份实体文件。(例如,10 个项目都依赖
lodash@4.17.21
,磁盘上只保留一份文件。) -
多个项目共用同一依赖的同一版本时,无需重复下载。
-
-
安装速度快:
- 新项目安装依赖时,若全局已有该包,直接创建硬链接,无需重新下载。
-
非扁平化结构:
-
pnpm 的
node_modules
结构是非扁平化的,每个依赖只能访问其显式声明的依赖,避免了"幽灵依赖"(Phantom Dependencies)问题。 -
例如,你的项目依赖 A,而 A 依赖 B。在 NPM 的扁平化结构中,你的代码可能直接引用 B(即使未声明依赖 B),导致潜在风险;而 PNPM 会严格限制这种访问。
-
.
yarn
yarn 在速度、稳定性和 Monorepo 支持上优于 NPM,适合对依赖管理要求严格的场景。若项目已使用 NPM,可权衡迁移成本;若为新项目,Yarn 是更现代的选择(尤其是 Yarn 2+)。
优势:
-
并行下载:
-
可以并行下载依赖包,显著提升安装速度(尤其在依赖数量多时)。
-
早期 npm 安装依赖时是顺序下载且无缓存复用,速度较慢(NPM 5+ 已改进,但 Yarn 仍有一定优势)。
-
-
本地缓存机制:
所有下载过的依赖会缓存在本地,后续安装直接从缓存读取,减少网络请求。
-
lock 文件:
-
yarn 默认生成
yarn.lock
文件,严格锁定依赖树中每个包的具体版本和哈希值,确保不同环境下安装的依赖完全一致,防止恶意代码注入。 -
对比:早期 npm 的
package-lock.json
在部分场景下可能因版本范围定义不严格导致依赖版本漂移(NPM 5+ 已改进,但 Yarn 的锁定机制更早成熟)。
-
-
离线模式:
yarn 优先从本地缓存安装依赖,即使无网络连接也可完成安装(需提前缓存过依赖)。
.
cnpm
cnpm 是淘宝镜像提供的工具,主要针对国内用户,解决npm在国内下载速度慢的问题。它的核心优势应该在于镜像源的速度和稳定性,以及可能的并行安装提升速度。
cnpm 默认使用淘宝镜像源(https://registry.npmmirror.com
),所有依赖包会从国内服务器下载,避开国际网络延迟。
优势:
-
下载速度极快:
-
国内用户安装依赖的速度可提升 5-10 倍(尤其对大体积包如 node-sass、electron 等效果显著)。
-
避免因国际网络波动导致的安装失败,稳定性高。
-
而 npm 默认从
registry.npmjs.org
下载,国内直连速度慢且不稳定。
-
-
完全兼容 NPM 的命令:
-
cnpm 完全兼容 npm 的命令(如
cnpm install
、cnpm publish
),仅需将 npm 替换为 cnpm 即可使用。 -
支持私有源,可通过
cnpm config set registry <url>
切换为私有仓库(如企业内网源)。
-
-
镜像同步频率高:
-
实时同步:淘宝镜像每隔 10 分钟与 NPM 官方仓库同步一次,基本覆盖最新版本。
-
容灾备份:镜像服务器分布多地,避免单点故障。
-
配置:
-
全局配置:建议全局配置淘宝镜像,提升日常开发效率
npm config set registry https://registry.npmmirror.com
-
临时需求:若需从官方源安装个别包,可通过参数临时指定
npm install some-package --registry=https://registry.npmjs.org
关键解读
1. 存储机制
pnpm 通过硬链接复用全局依赖,节省 70%+ 磁盘空间。
npm/yarn 的扁平化结构易导致依赖冲突。
2. 安装效率
pnpm > yarn > npm(尤其在依赖重复场景)。
cnpm 依赖国内 CDN,适合解决网络问题。
3. Monorepo 支持
pnpm 和 yarn 有原生优化,npm 需手动配置。
4. 安全性
pnpm 严格隔离依赖,避免非法访问;cnpm 镜像源需注意信任问题。
5. 临时执行
npx 专为运行一次性命令设计(如脚手架工具),无需全局安装。
如何选择
-
个人/小团队:优先 pnpm(省空间+快)或 yarn(功能全)。
-
国内网络环境:用 cnpm 加速,但生产环境切回 npm 或 pnpm。
-
Monorepo 项目:pnpm 或 yarn workspace。
-
临时执行 CLI:无脑 npx。
代码示例
安装依赖
bash
# npm
npm install lodash
# yarn
yarn add lodash
# pnpm
pnpm add lodash
# cnpm
cnpm install lodash
运行命令
bash
# npm
npm run dev
# yarn
yarn dev
# pnpm
pnpm dev
# npx(临时运行)
npx vite create my-project