npm包管理
npm(Node Package Manager)是 Node.js 生态的包管理工具,解决"依赖从哪来、装哪个版本、怎么升级"三个问题。没有它,每个项目都要手动下载拷贝第三方库,版本冲突将无法管理。npm 用 package.json 声明依赖、用语义化版本约定升级规则、用 lock 文件锁定版本,构成 Node.js 项目依赖管理的完整闭环。
提示
记住一句话就够用:package.json 声明"想要什么",package-lock.json 锁定"实际装了什么"——提交代码时两者都要进 Git。
语义化版本(SemVer)
版本号 = 主版本.次版本.补丁版本,三个数字各代表一类变更:
| 版本位 | 变更类型 | 例子 |
|---|---|---|
| 主版本 | 不兼容的 API 修改 | 1.x → 2.0 可能删了旧接口 |
| 次版本 | 向下兼容的功能新增 | 1.2 → 1.3 加新功能 |
| 补丁版本 | 向下兼容的问题修正 | 1.2.3 → 1.2.4 修 bug |
package.json 中的版本前缀决定自动升级的边界:
| 写法 | 允许升级 | 例子 |
|---|---|---|
^1.2.3 | 次版本和补丁(1.x.x) | 1.2.3 可升到 1.9.0,不升 2.0 |
~1.2.3 | 仅补丁(1.2.x) | 1.2.3 可升到 1.2.9,不升 1.3 |
1.2.3 | 精确锁定 | 永远 1.2.3 |
理解 ^ 和 ~ 的边界,能避免依赖更新时引入破坏性变更:主版本 0 开头的包(如 0.8.x)语义化版本约定不完整,^0.8.1 实际只允许补丁升级——这是踩坑高发区。
常用命令
| 命令 | 说明 |
|---|---|
npm init | 初始化项目,生成 package.json |
npm install | 安装 package.json 中所有依赖 |
npm install <pkg> | 安装指定包(默认写入 dependencies) |
npm install -D <pkg> | 安装为开发依赖(devDependencies) |
npm install -g <pkg> | 全局安装(CLI 工具) |
npm uninstall <pkg> | 卸载包 |
npm update <pkg> | 按 SemVer 规则更新包 |
npm run <script> | 运行 package.json 中的 scripts 脚本 |
dependencies 与 devDependencies 的区分
运行时需要的包(express、mongoose)进 dependencies;只在开发期用的包(测试、构建工具)进 devDependencies。生产部署用 npm ci 只装 dependencies,体积更小、更安全。
package.json 与 lock 文件的关系
package.json 记录"想要什么版本范围"(如 ^4.17.0),package-lock.json 记录"实际安装的确切版本和依赖树"。团队协作时 lock 文件必须提交:它保证所有成员装出完全一致的依赖树,避免"我本地能跑你不行"。CI 环境用 npm ci(按 lock 精确安装、更快)替代 npm install。
常用包
| 包 | 用途 |
|---|---|
express | Web 框架(中间件模式) |
body-parser | 请求体解析 |
cookie-parser | Cookie 解析 |
multer | 文件上传 |
express-session | Session 管理 |
ejs / art-template | 模板引擎 |
superagent | HTTP 请求库 |
cheerio | 服务端 HTML 解析 |
# 一条命令装齐 Web 服务基础三件套
npm install express body-parser cookie-parser依赖管理是每个生态的必修课,Git 管代码版本、npm 管依赖版本,两者共同构成"版本管理"的完整图景,详见 效率工具 的版本控制章节。