oh-my-zsh 实现秒开

0 阅读1分钟

最近感觉终端启动的时候老是要loading 一会才能开始工作,体验非常不好,也去网上找了一些替代方案,但是感觉还是 oh-my-zsh 用的比较习惯,于是想要进行优化,下面记录一下优化的过程

首先我们做一下基线判断

## 基于 ./zshrc配置启动
time zsh -i -c exit 
## 不加载./zshrc
time zsh --no-rcs -i -c exit

我本地执行完平均应该在 3s 左右,而不加载配置的速度在 0.1s,说明各种插件的加载占据了很大的时间

详细定位耗时来源

zsh -i -c 'zmodload zsh/zprof; source ~/.zshrc; zprof'
grep -nE 'plugins=|nvm|compinit|conda' ~/.zshrc ~/.zprofile ~/.zshenv 2>/dev/null

我本地分析下来主要的耗时集中在nvm + conda + compinit

首先关掉 conda 自动激活 base

conda config --set auto_activate_base false

优化nvm为懒加载

# 关闭 oh-my-zsh 自动更新检查(减少启动额外逻辑)
echo 'export DISABLE_AUTO_UPDATE="true"' >> ~/.zshrc

# 关闭 zsh 启动即加载 nvm(删掉 ~/.zshrc 中这两行)
# [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
# [ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"

加入懒加载函数(首次调用 node/npm/npx/nvm 时才加载)
_lazy_load_nvm() {
  unset -f nvm node npm npx
  [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
}
nvm()  { _lazy_load_nvm; nvm "$@"; }
node() { _lazy_load_nvm; node "$@"; }
npm()  { _lazy_load_nvm; npm "$@"; }
npx()  { _lazy_load_nvm; npx "$@"; }

# 最终复测
time zsh -i -c exit

conda 懒加载

## 注释 conda init
sed -i '' '/# >>> conda initialize >>>/,/# <<< conda initialize <<</ s/^/# /' ~/.zshrc

## 在 .zshrc 中新增
__lazy_load_conda() {
  unset -f conda
  local __conda_setup
  __conda_setup="$('/opt/anaconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
  if [ $? -eq 0 ]; then
    eval "$__conda_setup"
  elif [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
    . "/opt/anaconda3/etc/profile.d/conda.sh"
  else
    export PATH="/opt/anaconda3/bin:$PATH"
  fi
  unset __conda_setup
}

conda() {
  __lazy_load_conda
  conda "$@"
}
## 更新 zshrc 配置
source ~/.zshrc

最终结果更新

  • 最新 3 次实测:0.174s0.174s0.150s
  • 结论:优化后 zsh 启动稳定在 0.2s 内