最近遇到一个关于 Node 版本的问题,解决过程中我重新认识了一下 Node 的版本管理,分享一下经历。
背景 - 我们的 iOS 工程提交代码是使用了一个叫 Commitizen
的工具,这是一个标准化 git commit message 的工具,这个工具我之前是用过 npm install -g
方式进行全局安装的。
问题 - 今天使用 Commitizen
下的 git cz
命令的时候突然报错说这个命令找不到了。
git: ‘cz’ is not a git command.
很奇怪,然后我在终端下执行 commitizen
命令,发现这个命令也找不到了…
于是我想到昨天似乎在起别的前端项目的时候执行过一句 nvm alias default
这个命令改过 Node 的版本号码,是不是和这个有关系?
既然报错找不到 commitizen
了,那我就重新装一下,于是重新执行命令 npm install -g commitizen
发现了似乎安装过程和版本号有关系,是把 commitizen
装到了指定的 node 版本号下的目录中去了。
➜ ios-project git:(develop) npm install -g commitizen /Users/x/.nvm/versions/node/v14.21.3/bin/cz -> /Users/x/.nvm/versions/node/v14.21.3/lib/node_modules/commitizen/bin/git-cz /Users/x/.nvm/versions/node/v14.21.3/bin/git-cz -> /Users/x/.nvm/versions/node/v14.21.3/lib/node_modules/commitizen/bin/git-cz /Users/x/.nvm/versions/node/v14.21.3/bin/commitizen -> /Users/x/.nvm/versions/node/v14.21.3/lib/node_modules/commitizen/bin/commitizen
- commitizen@4.3.0 added 168 packages from 184 contributors in 22.24
我昨天确实是通过 nvm alias default
命令把 Node 版本改到了 v14.21.3,改之前我的 Node 版本是 v14.16.1, 于是我在 /Users/x/.nvm/versions/node/v14.16.1/bin
下确实找到了 commitize
,所以应该就是通过 nvm alias default
改了全局的 Node 版本号,导致找不到原来 Node 版本下的 commitizen
了。之前确实也没有关注到通过 npm install -g 这个命令还会区分不同的 Node 版本进行安装。
回到昨天为什么要通过 nvm alias default 修改全局 Node 版本?是因为昨天运行一个前端项目报错,然后同事建议修改 Node 版本。
使用 VSCode 开启前端项目的时候一般会有两个地方执行 npm run dev 这种命令
IDE 界面交互(应该是读取的 package.json 中的命令,变为可交互形式)。
在 VSCode 自带的命令行
这两个地方执行命令的时候使用的 Node 版本是不一样的,IDE 界面那儿使用的是全局的 Node 版本,而我总是通过 IDE 交互这样执行命令,同事建议我通过 nvm alias default
命令将 Node 版本改成和前端工程匹配的 Node 版本。于是就引出了今天的问题,主要还是我自己没有搞清楚 Node 全局版本和工程下版本的区别。 而且尽量在前端工程下尽量使用命令行的方式去执行 npm 命令。
所以我简单总结一下 Node 版本管理的比较好的实践是:
- 尽量不要通过
nvm alias default
命令改 Node 全局的版本,因为会影响很多别的地方的使用。 - 在前端工程下如果当前系统默认 Node 版本不匹配,手可以通过
nvm use
的方式进行版本切换,并尽量保证是通过命令行执行 npm 命令。
关注我的微信公众号,我在上面会分享我的日常所思所想。
