为什么需要包管理器
写程序时,很多功能别人已经写好了:日期处理、HTTP 请求、加密解密。你不必从零写,直接拿来用。这些可复用的代码包叫「包」(package)或「库」(library)。
「包管理器」就是帮你安装、更新、删除这些包的工具。它解决三个问题:
- **从哪拿**:有个公共仓库(npm registry),所有人把包发布上去。
- **怎么装**:一条命令自动下载到项目。
- **依赖管理**:A 包依赖 B 包,B 依赖 C,自动帮你装全。
npm:Node.js 自带
npm(Node Package Manager)是 JavaScript 最主流的包管理器,装 Node.js 时自动带上。
常用命令:
npm install # 安装 package.json 里所有依赖
npm install 包名 # 安装某个包
npm install -D 包名 # 安装开发依赖(只在开发时用)
npm uninstall 包名 # 卸载
npm update # 更新所有包
npm run dev # 运行 package.json 里定义的脚本安装包后,代码里就可以引入:
import { format } from "date-fns"; // 用 date-fns 处理日期
console.log(format(new Date(), "yyyy-MM-dd"));package.json:项目的清单
每个项目根目录有 `package.json`,记录:
- 项目名称、版本。
- 依赖了哪些包及版本。
- 可运行的脚本(如 `dev`、`build`、`lint`)。
{
"name": "vibe-coding-daily",
"scripts": {
"dev": "next dev",
"build": "next build",
"lint": "eslint ."
},
"dependencies": {
"next": "^16.3.1",
"react": "^19.2.0"
}
}`npm run dev` 就是执行 `scripts` 里的 `dev` 命令(实际跑 `next dev`)。
node_modules:包的家
安装的包放在 `node_modules` 文件夹。这个文件夹很大(常常几百 MB),**不要提交到 Git**,靠 `.gitignore` 忽略:
node_modules/别人拿到你的代码后,运行 `npm install`,根据 `package.json` 自动重建 `node_modules`。
package-lock.json:锁定版本
`package.json` 里版本号前的 `^` 表示「兼容大版本」:`^16.3.1` 允许装 16.x 的任何版本。这意味着不同时间安装可能拿到不同的小版本,可能导致「在我电脑上能跑,你那里不行」。
`package-lock.json` 锁定每个包的精确版本和依赖树,确保所有人装的一模一样。这个文件**要提交到 Git**。
yarn 和 pnpm:替代品
npm 之外还有两个流行选择:
**yarn**:Facebook 开发,早期比 npm 快。现在差距小了。
**pnpm**:用硬链接节省磁盘空间,装得快,适合大型项目。
三者命令对比:
| 操作 | npm | yarn | pnpm |
|---|---|---|---|
| 安装所有 | `npm install` | `yarn` | `pnpm install` |
| 装一个包 | `npm install 包` | `yarn add 包` | `pnpm add 包` |
| 运行脚本 | `npm run dev` | `yarn dev` | `pnpm dev` |
选哪个都行,本站用 npm。
全局安装 vs 本地安装
npm install -g 包名 # 全局安装,命令行任何地方都能用
npm install 包名 # 本地安装,只在当前项目用全局安装的通常是命令行工具(如 `vercel` CLI)。项目依赖都本地安装,避免污染全局环境。
小白记住
- `npm install` 装依赖,`npm run dev` 跑项目。
- `package.json` 是清单,`node_modules` 是仓库,`package-lock.json` 是锁。
- `node_modules` 不提交,`package.json` 和 `package-lock.json` 要提交。
理解包管理器,你就能看懂 AI 说的「先装个 lodash」「在 dependencies 里加了 xxx」是什么意思。