npm 从入门到精通(四):再工程化,面向团队协作的 npm 最佳实践

0 阅读6分钟

npm 系列文章总规划

《npm 从入门到精通》系列

系列目录

  1. npm 从入门到精通(一):先会用,30 分钟掌握 npm 最常用命令
  2. npm 从入门到精通(二):再理解,彻底搞懂 package.json、node_modules 和 package-lock
  3. npm 从入门到精通(三):再进阶,掌握版本管理、脚本系统与包发布
  4. npm 从入门到精通(四):再工程化,面向团队协作的 npm 最佳实践

第四篇:npm 从入门到精通(四):再工程化,面向团队协作的 npm 最佳实践

前面三篇解决的是:

  • 你怎么用 npm
  • 你怎么理解 npm
  • 你怎么把 npm 用到更深入

而这一篇关注的是:
当项目变大、团队变多、流程变复杂时,npm 应该如何工程化地使用。

这也是“会用 npm”和“真正用好 npm”的分水岭。


一、工程化阶段关注的是什么

到了团队协作阶段,npm 不只是本地装几个包那么简单。

你会开始关心:

  • 团队安装结果是否一致
  • CI/CD 构建是否稳定
  • 依赖是否安全
  • 脚本是否统一
  • 仓库是否整洁
  • 发布流程是否可控

所以工程化的核心,不是多学命令,而是建立规范。


二、一定要提交 package-lock.json

这是最重要的实践之一。

为什么要提交

因为它可以保证:

  • 团队成员安装结果尽量一致
  • 测试环境和生产环境更接近
  • CI 构建更可重复

如果不提交会怎样

  • 每个人装到的依赖版本可能不同
  • 某些 bug 无法稳定复现
  • CI 和本地表现不一致

结论

对于大多数应用项目:

提交 package-lock.json 是推荐做法。


三、不要提交 node_modules

通常 .gitignore 应该包含:

node_modules/
dist/
build/
.env

为什么

因为:

  • node_modules 体积大
  • 不同机器环境可能不同
  • 可以通过 npm 重新安装
  • 提交后仓库会非常臃肿

这条规则几乎可以当作常识。


四、本地开发用 npm install,CI 用 npm ci

这是非常经典的分工方式。

本地开发

npm install

适合:

  • 增加依赖
  • 调整依赖
  • 本地开发

CI/CD

npm ci

适合:

  • 自动化构建
  • 干净环境安装
  • 追求稳定一致的安装结果

为什么 npm ci 更适合 CI

  • 更快
  • 更稳定
  • 严格使用 lock 文件
  • 不会随意改 lock 文件

五、统一 scripts,降低团队沟通成本

好的项目不会让团队成员自己记各种命令。
而是统一在 package.json 中提供标准入口。

例如:

{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "test": "vitest run",
    "lint": "eslint .",
    "format": "prettier --write ."
  }
}

这样所有人都知道:

  • 本地开发:npm run dev
  • 构建项目:npm run build
  • 测试项目:npm run test
  • 代码检查:npm run lint

脚本命名越统一,协作越顺畅。


六、定期做依赖安全审计

npm 生态很大,依赖风险也是现实存在的。

常用命令

npm audit

自动修复一部分问题:

npm audit fix

但要注意

不要无脑执行所有修复。
因为安全修复可能会顺带升级版本,带来兼容性问题。

正确姿势是:

  • 先审计
  • 看影响范围
  • 评估升级风险
  • 再决定是否修复

七、控制依赖数量,不要“见包就装”

一个成熟项目不只是看功能做得快不快,也看依赖治理是否健康。

为什么要克制依赖数量

每多一个依赖,就多一层:

  • 安全风险
  • 升级成本
  • 包体积
  • 学习成本
  • 维护负担

建议

在安装新包前先问自己:

  • 这个功能是否真的需要第三方包?
  • 当前项目里是否已有同类能力?
  • 这个包是否活跃维护?
  • 体积是否太大?
  • 是否值得引入长期维护成本?

别把项目写成“依赖市场批发现场”。


八、遇到依赖异常时的标准处理流程

当项目出现奇怪的依赖问题时,不要上来就乱删乱装。
建议按标准步骤排查。

常见流程

1. 删除安装结果
rm -rf node_modules
2. 必要时删除 lock 文件
rm package-lock.json
3. 清缓存
npm cache clean --force
4. 重新安装
npm install

注意

删除 package-lock.json 不是第一选择,而是修复特殊问题时的手段。


九、npm 配置与镜像源要统一

团队中一个常见问题是:

  • 有人用官方源
  • 有人用镜像源
  • 有人改了全局配置自己都忘了

这会导致很多奇怪问题。

查看当前源

npm config get registry

设置源

npm config set registry https://registry.npmjs.org/

建议

团队最好明确:

  • 是否统一使用官方源
  • 是否允许镜像
  • 是否有公司私有 registry

这样能减少环境差异。


十、发布前检查与团队规范

如果团队会发布 npm 包,建议建立发布规范。

至少包含这些检查项

  • 版本号是否正确
  • changelog 是否更新
  • 敏感文件是否排除
  • 构建产物是否正确
  • main / types / exports 是否配置正常
  • 是否通过测试

常见发布流程

  1. 本地测试通过
  2. 更新版本号
  3. 构建产物
  4. 发布 npm
  5. 打标签
  6. 记录变更日志

这时 npm 已经进入真正的“软件供应链”范畴。


十一、团队协作中最推荐的 npm 习惯

这部分适合直接作为团队规范。

推荐清单

  • 提交 package-lock.json
  • 不提交 node_modules
  • 本地用 npm install
  • CI 用 npm ci
  • 统一 scripts
  • 定期执行 npm audit
  • 控制依赖数量
  • 避免随意升级核心依赖
  • 统一 npm 源配置
  • 发布前做完整检查

十二、这一篇的真正核心

工程化阶段最重要的,不是某个命令,而是下面这套思维:

1. 依赖需要可重复

不能每个人装出来都不一样。

2. 命令需要可标准化

不能每个开发者自己记一套口令。

3. 安装结果需要可追踪

不能出了问题不知道版本怎么变的。

4. 安全需要可治理

不能装了一堆包却完全不审计。

5. 发布需要可控制

不能“本地一把梭,线上听天命”。


总结

如果说前面三篇是在教你“怎么使用 npm”,那么这一篇讲的是:

如何让 npm 服务于团队协作、自动化构建和长期维护。

到了这个阶段,你对 npm 的理解已经不再只是:

  • 安装一个包
  • 跑一个命令

而是开始把 npm 当作:

  • 依赖治理工具
  • 脚本执行中枢
  • 团队工程规范的一部分

这时,“npm 从入门到精通”这条线,基本就走通了。