楼层: 首页/ 软件技术/ Node.js 全栈实战/ 包管理器:npm、pnpm、yarn 怎么选
03

包管理器:npm、pnpm、yarn 怎么选

Package Managers

npm 是 Node 亲儿子,自带;pnpm 和 yarn 是后来者,主打"更快、更省磁盘"。它们干的是同一件事:把别人写好的代码包,下载下来放到你项目的 node_modules 里。学会 npm 基本命令,再知道 pnpm 为什么火,就够了。

npm 十个最常用命令

命令大白话 / 例子
npm init -y在当前文件夹初始化一个新项目,自动生成 package.json。
npm install express装一个包,默认存进 dependencies(生产依赖)。简写 npm i express。
npm install -D jest装开发依赖(测试、构建工具),存进 devDependencies。
npm uninstall express卸载一个包。简写 npm rm express。
npm update express把某个包升级到允许范围内的最新版。
npm run dev执行 package.json 里 scripts 定义的命令。
npm ls列出项目装了哪些包,像看购物清单。
npm audit扫描已装的包有没有已知安全漏洞,出报告。
npm audit fix自动把有漏洞的包升到安全版本(慎用,可能升崩)。
npm cache clean --force装包出怪问题时,清掉本地缓存重来。

版本号的暗号:^ ~ * 到底什么意思

npm 用的是 语义化版本(semver):版本号长这样 主版本.次版本.修订号,比如 4.21.3。前面的符号决定了"升级时能升到多大胆"。

写法含义实际能装到的版本
"4.21.3"精确锁死只能是 4.21.3,一个补丁都不许变。
"^4.21.3"兼容升级(最常见)4.21.3 到 <5.0.0 之间——主版本不变,次版本和补丁随便升。npm 装包默认就给你加这个 ^。
"~4.21.3"只升补丁4.21.3 到 <4.22.0 之间——只修 bug,不加新功能。
"*" 或 "latest"不管版本永远装最新版,生产环境千万别这么写,明天它就变样。

本地装 vs 全局装,npx 是个啥

本地安装(默认)→ 装进当前项目
npm i express,装到项目的 node_modules 里,只有这个项目能用。
绝大多数情况用这个。Express 这种"项目专用"的包,就该跟着项目走,别人 clone 下来一装就有。
全局安装 -g → 装进系统,到处能用
npm i -g nodemon,装完在任何文件夹都能敲 nodemon 命令。
只给"命令行工具"用,比如脚手架、格式化工具。业务包别全局装。
npx → 临时跑一个包,装都懒得装
npx cowsay "你好",npx 发现你没装 cowsay,临时下载、跑完、用完即弃。
专治"这个工具我一辈子可能只用一次"。比如 npx create-vite 起新项目,不用全局装脚手架。

为什么大家现在爱用 pnpm

论npm 的两个老毛病,pnpm 怎么治

毛病一:占磁盘。npm 给每个项目都把依赖完整复制一份,10 个项目用了 200 个公共包,硬盘上就存了 10 份重复的。pnpm 的解法:全机器只存一份实体,其他项目用"硬链接"指过去,省 90% 空间。

毛病二:装得慢。pnpm 有全局内容地址仓库(content-addressable store),同一个包第二次装瞬间完成。

额外福利:pnpm 的 workspaces 是 monorepo(一个仓库管多个相关项目)的事实标准,大公司现在基本都用它。一句话:新项目直接上 pnpm,没理由不用。命令几乎和 npm 一样:pnpm install、pnpm add express、pnpm run dev。

国内下载慢?换淘宝镜像源(npmmirror)

# 把下载地址从国外官方换成国内 npmmirror(原淘宝源) npm config set registry https://registry.npmmirror.com # 验证一下,输出应该是上面这个国内地址 npm config get registry # pnpm 同样: pnpm config set registry https://registry.npmmirror.com
$ npm config get registry https://registry.npmmirror.com/
记
本章小结

① 日常就三个命令:npm i 包名(装)、npm run dev(跑)、npm ls(看装了啥)。

② 版本号 ^ 是"别动主版本就行",~ 是"别动次版本",精确版是"锁死"。

③ 新项目用 pnpm,更快更省磁盘;国内记得配 npmmirror 镜像。