跳到主要内容

nvm、Node、Yarn 放在一起时,版本边界最好早点说清楚

· 阅读需 3 分钟
一介布衣
全栈开发者

Node.js 项目最容易让人产生一种错觉:只要把 Node 装上、包管理器装上,环境就算齐了。可到了 2020 年左右,团队里同时使用 nvm、Node、Yarn 已经很普遍,这时候真正容易出问题的,不再是某个工具会不会装,而是它们之间的版本边界有没有讲清楚。

很多安装报错、依赖异常、脚本运行不一致,最后都能追到这层边界上来。

我后来最常见到的三种混乱​

1. Node 版本是切了,但 Yarn 还在用旧环境​

大家以为切了 nvm 版本,一切就会自动跟着对齐。实际上,不同 shell、不同终端会话、不同脚本入口下,工具链感知到的环境不一定完全一致。

2. 团队里每个人都能跑,但版本组合不一样​

表面上看项目是“可运行”的,实际上有人用 Node 14,有人用 16,Yarn 版本也各不相同。
一旦 lockfile、原生模块或某些脚本行为对版本敏感,问题就会陆续冒出来。

3. CI、服务器、本地三套环境没有统一口径​

本地跑得过,不代表 CI 能过;CI 能过,也不代表服务器上脚本就一定一致。
如果版本策略只存在于开发者脑子里,工具链迟早会暴露不一致。

我后来更愿意先约定什么​

在项目开始阶段,我会尽量把这些事情先说明白:

  • 项目主要支持哪几个 Node 版本
  • 团队默认使用哪种包管理器
  • Yarn 版本是否需要锁定
  • 本地、CI、服务器是否使用一致的 Node 主版本

这些约定越早写清楚,后面的环境问题越少。

为什么这是“边界问题”​

因为 nvm 负责的是版本切换,Node 负责的是运行时,Yarn 负责的是依赖安装和脚本入口。
它们彼此有关,但职责并不相同。

一旦团队把职责混在一起,就容易出现这样的误解:

  • 以为切了 Node 就等于一切都同步了
  • 以为 Yarn 报错一定是 Yarn 本身的问题
  • 以为 lockfile 冲突只是代码问题

其实很多时候,根因只是版本边界没先说清楚。

小结​

Node 工具链最烦人的地方,往往不是某个工具复杂,而是多个简单工具叠在一起之后,团队没有形成共同口径。
我后来对这件事越来越保守:nvm、Node、Yarn 可以一起用,但版本边界最好越早越明确。这样环境问题才不至于反复吞时间。