Skip to main content

解决nvm导致终端初始化慢的问题

问题

安装 nvm 时,nvm 安装脚本会自动往 .zshrc 或者 .bashrc 中写入以下内容:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion

但是以后每当我打开终端时,终端总是很慢,初始化时间大约有3-4s,通过查阅资料发现,罪魁祸首是 nvm 自动加载脚本。

nvm 安装脚本往 .zshrc 或者 .bashrc 中写入的 "$NVM_DIR/nvm.sh" 脚本会自动加载 nvm 及其各种环境变量,但该脚本执行耗时较多,会拖慢终端初始化速度。

解决方案

解决方案就是按需加载,在 .zshrc 或者 .bashrc 中编写 nvm/node/npm/npx/yarn 等自定义命令覆盖原有的同名命令,当在一个终端会话中首次执行这些命令时,进行以下步骤:

  1. 先删除我们自定义的这些 nvm/node/npm/npx/yarn 命令
  2. 然后加载 nvm 及其附加环境
  3. 最后执行用户所输入命令对应的真实命令,并将所有的参数进行转发。

修改后的 nvm 按需加载脚本如下所示,只需要将下面的内容替换 nvm 安装脚本在 .zshrc 或者 .bashrc 中写入的内容即可:

export NVM_DIR="$HOME/.nvm"
function load_nvm() {
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
}
function nvm() {
unset -f nvm node npm npx yarn
load_nvm
nvm "$@"
}
function node() {
unset -f nvm node npm npx yarn
load_nvm
node "$@"
}
function npm() {
unset -f nvm node npm npx yarn
load_nvm
npm "$@"
}
function npx() {
unset -f nvm node npm npx yarn
load_nvm
npx "$@"
}
function yarn() {
unset -f nvm node npm npx yarn
load_nvm
yarn "$@"
}

参考资料