分享我的发现、想法与心得

0%

用nvm管理你的Node环境

当你管理着多个项目时,有没有遇到以下提示?

1
2
3
4
5
6
7
8
Syntax Error: Error: Missing binding D:\works\test-product\node_modules\node-sass\vendor\win32-x64-57\binding.node
Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 8.x

Found bindings for the following environments:
- Windows 64-bit with Node.js 14.x

This usually happens because your environment has changed since running `npm install`.
Run `npm rebuild node-sass` to download the binding for your current environment.

这是在执行程序的时候,本地运行版本与node-sass安装版本不一致导致的。

有这种情况的朋友,大多数应该都有使用上nvm吧?

没错,管理Node版本目前最好的工具就是nvm[^1]。

nvm的安装

官方工具

官网介绍

nvm 是 node.js 的版本管理器,设计为按用户安装,并按 shell 调用。 nvm 适用于任何符合 POSIX 的 shell(sh、dash、ksh、zsh、bash),特别是在这些平台上:unix、macOS 和 windows WSL

如果你符合上述环境,就可以通过下面两步完成安装:

  1. 直接复制下面的命令到终端运行
1
2
3
4
5
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

#or

$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

上面命令会下载并运行脚本,然后将nvm项目下载到~/.nvm目录下存放。

  1. 将下面代码编辑至~/.bash_profile, ~/.zshrc, ~/.profile, or ~/.bashrc 其中一个文件中
1
2
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

Window下的选择

如果你想在windows普通环境下管理你的node版本,可以安装nvm-windows[^2]。

下载双击安装就可以了。

nvm的使用

使用的方式有两种:

  • 命令直接操作
  • 用于项目

命令直接操作

nvm官方版本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看所有已发布的node版本
$ nvm ls-remote
# 只查看稳定版本
$ nvm ls-remote --lts

# 安装node版本
$ nvm install 14.7.0 # or 16.3.0, 12.22.1, etc

# 查看本地安装的node和当前应用的版本
$ nvm ls

# 应用node版本
$ nvm use 14.7.0

nvm-windows版本的命令

1
2
3
4
5
6
7
8
9
10
11
# 查看所有已发布的node版本
$ nvm list available

# 安装node版本
$ nvm install 14.7.0 # or 16.3.0, 12.22.1, etc

# 查看本地安装的node和当前应用的版本
$ nvm list

# 应用node版本
$ nvm use 14.7.0

用于项目

像文章开头遇到的情况,项目在用的node版本存在要求时,有什么办法解决呢?

nvm支持读取.nvmrc文件进行node版本的切换。

这就是答案。

具体这样用:

  1. 在项目中创建.nvmrc并将当前版本注入其中。
1
2
3
4
5
6
7
8
9
10
# nvm
$ node -v >> .nvmrc

# nvm-windows
# 声明一下:windows下用不带.exe的会出错
$ node.exe -v >> .nvmrc

# 文件结果
$ cat .nvmrc
14.7.0

.nvmrc 将作为项目使用哪个Node版本的重要依据,所以记得提交到git历史。

  1. 项目运行命令前执行切换node版本

比如vue-cli项目下会有这两行,一般用于开发调取的,如:本地运行npm run serve

1
2
3
4
5
6
{
"script": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
}
}

执行时直接切换node版本,只需要增加两行配置[^3]:

1
2
3
4
5
6
7
8
{
"script": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
+ "preserve": "nvm use",
+ "prebuild": "nvm use",
}
}

如果你在windows的PowerShell下执行命令的,需要改为下面这样[^4]:

1
2
3
4
5
6
7
8
{
"script": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
+ "preserve": "nvm use (Get-Content .nvmrc)",
+ "prebuild": "nvm use (Get-Content .nvmrc)",
}
}

[^1]: nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions (github.com)

[^2]: coreybutler/nvm-windows: A node.js version management utility for Windows. Ironically written in Go. (github.com)

[^3]: doesn’t work with .nvmrc · Issue #169 · coreybutler/nvm-windows (github.com)

[^4]: Support .nvmrc · Issue #128 · coreybutler/nvm-windows (github.com)