本地多版本 Node 全局包安装踩坑与最佳实践
  Node.js

本地多版本 Node 全局包安装踩坑与最佳实践

 次点击
5 分钟阅读

问题背景

为了测试不同 Node.js 环境,开发机器上可能会安装多个不同版本的实例。大多是通过 nvm、fnm、volta 等管理工具安装 node。当你切换了不同的 Node.js 环境可能发现全局安装的依赖丢失了!还有可能你的第三方包管理工具版本会不一致!

这是因为:安装 Node 默认会自带一个 npm 可执行文件,然而不同的 Node 环境自带的 npm 版本是分开的,你可能在不同的环境中通过 npm install -g 将某个包安装了好几份、因此当你切换了 Node 版本可能导致找不到这个全局包。

如果你是用 npm install -g pnpm 安装的 pnpm,那么不同版本的 node 环境中可能下载了不同版本的 pnpm。

那么有没有一种方案,可以让安装的命令行工具不跟随 Node 版本环境变化、 pnpm 版本也不会跟着变呢?

当然是有的,pnpm 的方案目前堪称业界最佳。它的全局脚本安装位置在 Mac 上是 ~/Library/pnpm 这个目录,它可以不受 Node 版本环境变化影响。

因此我们解决的思路就是:将所有的 Node 相关命令行工具全部由 PNPM 管理,所安装的 Node 实例自带 npm 的全局安装目录里只留下它自己、以免和其他地方安装的包冲突。

但因为大多数同学安装 pnpm 都是通过 npm i -g pnpm 来安装的,所以才会掉入我们说的这个坑。

但 pnpm 也提供了 brew install pnpm 的方案,这样安装的 pnpm 是全局唯一的。

如何以项目维度隔离不同环境需要?

fnm 可以完美做到在你的项目环境里始终指定你需要的 node 版本。解决步骤如下:

在你的项目目录内新建一个 .node-version 文件,可以用如下命令生成

node -v > .node-version

在你的 bash / shell 脚本里添加如下 eval 指令

eval "$(fnm env --use-on-cd)"

这样每次命令行启动时都会遵循你当前目录的 .node-version 定义。

这样你就可以在不同的项目中有不同的 “环境 + 包管理工具” 组合了。

© 本文著作权归作者所有,未经许可不得转载使用。