我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情
前言
手里负责了多个项目,有些项目对 node 版本做了强绑定,这样依赖就需要使用 nvm 代理多个 node 版本,避免对项目进行破坏性的改动。
然而,在使用 nvm 的过程中会遇到一些问题:
- 全局依赖频繁安装
- 全局缓存越来越大
- 全局依赖配置重复操作,到最后都不知道哪个是哪个了
- ...
问题与思路
其实问题已经暴露了,所以需要解决的就是让 nvm 代理的所有 node 版本共用一套 全局依赖和全局缓存空间。这样一来,在切换 node 版本的时候就不需要频繁的重新安装 全局依赖 了,而且配置也只需要配置一次。
要达到这个效果,不可避免的需要了解一下 node 的安装过长,并且要了解 nvm 是如何实现多版本管理的。
我个人是不太喜欢去看原理性的东西的,只是通过安装结果去猜测了一下这个过程。
首先,node 的安装会做如下几件事情:
- 在安装路径下生成一个 nodejs 的文件夹,并将 node 相关的安装依赖放在这个路径下,而且 npm 的可执行文件也在这里。
- 配置环境变量,将 nodejs 作为指向地址,这样 npm 放在 nodejs 下,就不需要配置了。
- 在 npm 安装全局依赖的时候,会把 可执行文件 都放在 nodejs 下,可以被 winshell 读取到。
如上就是我理解的 node 安装结果以及 为什么 npm 通过 global 命令安装的依赖可以在 cmd 中执行的一点认知,同时,npm 配置里面有这么两个配置 prefix
和 cache
,这两个就是 全局依赖地址和缓存地址。
看到这里,就可以看一下 nvm 到底做了些什么,为什么可以在电脑上安装多个 node 版本,而且,多个 node 版本的全局依赖不能互相使用?
还是以安装结果来看:
- 在安装路径下会生成一个 nvm 的文件夹,作为安装路径,并存放 nvm 所需依赖。
- 配置环境变量,配置 nvm 和 node 两个环境变量。(即便是电脑上没有安装 node 也会有配置)
- 在 环境变量的地址上 新建一个
快捷方式
,通常在C:\Program Files
,快捷方式的名字就叫nodejs
。 - 安装一个新的版本的时候,从 nvm 配置的远程地址下载 对应node版本的 zip 包,并解压到 nvm 下。(zip版本是可以不需要安装就能用的,经历过 node 早期版本的应该都用过,下载 node 包然后手动配置 环境变量...)
- 切换 node 版本的时候,将 那个快捷方式的指向地址改到对应版本的 node。(一开始我是懵逼的)
因为我是从安装结果看的,可能实际上并不是这么回事,但是通过这个结果,又查看了其他大佬的配置过程,大概就是这么个情况。
再来个所以,两相对比之后发现,如果我们把电脑上安装的所有node版本的 prefix
和 cache
都指向同一个地址,并且在环境变量中配置这个 prefix
地址,那么就可以达到全局依赖共享以及全局缓存共享啦!
当然,会预料到,有些 全局依赖可能和node版本有点冲突,但是有些工具类、脚手架类的并不会受到影响,到时候只需呀把有冲突的记录下来,重新安装一下就好了。
配置过程
一、安装 nvm
安装 nvm 很简单,就是下载安装包,然后一路下一步到底。
注意的地方有两点:
- 如果电脑上已经安装了 node,nvm 会提示是否由 nvm 进行托管已经安装的,选是。
- 建议删除本地已安装的node版本以及已有的依赖,因为配置过后原来的就没用了,除了占点硬盘空间之外,没啥用处。
下载地址:nvm 下载 github 地址
命令行下载:
# 找不到了
二、安装多个 node 版本
使用 nvm install vx.x.x
命令进行安装。其他常用命令如下:
# 修改 nvm 下载地址:
# 安装完成后,打开安装目录下的setting.txt文件,修改指定位置
node_mirror: https://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/
# 查看网络可以安装的 node 版本
nvm list available
# 安装 指定版本 (16.5.0)
nvm install 16.5.0
# 使用 指定版本
nvm use 16.5.0
# 卸载 指定版本
nvm uninstall 16.5.0
安装 并 切换之后,使用 node -v
和 npm -v
来验证安装结果。
三、配置 全局依赖地址 和 全局缓存地址
在不依赖 nvm 的场景下安装 node 的时候,默认的 全局缓存
和 全局依赖
地址是放在 nodejs 之下的,而在被 nvm 代理之后,各个版本之间的全局缓存和依赖是互不影响的。
所以,就需要在各个版本之外,创建一个公共空间,用来存放全局缓存和全局依赖,并且将所有版本的 缓存和依赖 的地址指向这个公共空间,达到所有的 node版本共享 全局依赖和全局缓存的目的。同样,也可以用同样的方式实现 yarn/cnpm/pnpm... 等缓存的共享。
具体可以看到 nvm 安装地址中,其实是有多个 版本的安装包的,其实 nvm 在切换 node 版本的时候,是修改了 nodejs 这个快捷方式的 指向地址。
配置过程:
- 创建地址:
D:\node\node_global
和D:\node\node_cache
- 配置地址
npm config set prefix "D:\node\node_global"
npm config set cache "D:\node\node_cache"
注意: 每个版本都要修改一次哦!
四、安装全局依赖
在任意版本上,安装全局依赖,这时会看到提示安装成功,但是 cmd 中查不到这个命令。
到刚才配置的地址中进行查看,相关依赖确实已经下载成功。
这时因为没有将两个地址配置到环境变量中的原因。
五、配置环境变量验证共享结果
- 用户变量设置
将用户变量中 PATH 的值:
D:\node\node_global
如果没有PATH,可以直接添加。
- 系统变量设置
添加变量 NODE_PATH 值为:
D:\node\node_global\node_modules
结语
工欲善其事,必先利其器。
这个技巧可能好多人都知道,做个记录方便换新电脑的时候查阅。