Node版本锁定
- 问题
- 方案
- 一、锁定Node版本
- 二、自动切换Node版本
问题
- 接手项目时,不知道项目所用的Node版本
- 同一个项目,不同人用不同的Node版本,引起编译后的未知问题
方案
一、锁定Node版本
-
在package.json中配置 engines,限定项目使用的Node版本
-
在项目根目录下增加 .npmrc 文件(第一步配置 engines 只对 yarn生效,对npm无效)
在 .npmrc 文件中添加如下配置:
engine-strict = true
以上配置完成后,执行 npm install时(在npm run 阶段无效),若当前使用Node版本与工程package.json中的不一致,会直接报错退出。
二、自动切换Node版本
使用nvm对Node进行多版本管理,在项目下打开terminal时,自动切换Node版本。若对应Node版本未安装,会自动安装。
- 在项目根目录下增加 .nvmrc 配置文件
nvm会在当前项目下查找 .nvmrc 文件,在此文件中写入Node版本号:
例:14.6.0
- 进行 ~/.zshrc 或 bash 配置
官方示例: https://github.com/nvm-sh/nvm#deeper-shell-integration
zsh配置
在 ~/.zshrc 中添加如下配置:
# place this after nvm initialization!
autoload -U add-zsh-hookload-nvmrc() {
local nvmrc_path="$(nvm_find_nvmrc)"
if [ -n"$nvmrc_path" ];then
local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
if [ "$nvmrc_node_version"="N/A" ];then
nvm install
elif [ "$nvmrc_node_version"!="$(nvm version)" ];then
nvm use
fi
elif [ -n"$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)"!="$(nvm version default)" ];then
echo"Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc
bash配置
在$HOME/.bashrc添加如下配置:
cdnvm() {
commandcd"$@"||return$?
nvm_path=$(nvm_find_up .nvmrc | tr -d '\n')
# If there are no .nvmrc file, use the default nvm version
if [[ !$nvm_path=*[^[:space:]]* ]];then
declare default_version;
default_version=$(nvm version default);
# If there is no default version, set it to `node`
# This will use the latest version on your machine
if [[ $default_version=="N/A" ]];then
nvm alias default node;
default_version=$(nvm version default);
fi
# If the current version is not the default version, set it to use the default version
if [[ $(nvm current)!="$default_version" ]];then
nvm use default;
fi
elif [[ -s$nvm_path/.nvmrc &&-r$nvm_path/.nvmrc ]];then
declare nvm_version
nvm_version=$(<"$nvm_path"/.nvmrc)
declare locally_resolved_nvm_version
# `nvm ls` will check all locally-available versions
# If there are multiple matching versions, take the latest one
# Remove the `->` and `*` characters and spaces
# `locally_resolved_nvm_version` will be `N/A` if no local versions are found
locally_resolved_nvm_version=$(nvm ls --no-colors "$nvm_version"| tail -1 | tr -d '\->*'| tr -d '[:space:]')
# If it is not already installed, install it
# `nvm install` will implicitly use the newly-installed version
if [[ "$locally_resolved_nvm_version"=="N/A" ]];then
nvm install "$nvm_version";
elif [[ $(nvm current)!="$locally_resolved_nvm_version" ]];then
nvm use "$nvm_version";
fi
fi
}alias cd='cdnvm'cd"$PWD"
注:增加上述配置后,重新打开terminal 或 cd 进入项目目录,会自动切换Node版本