zsh 启动提速,延迟加载 Conda 和 NVM
Contents
随着工具链越来越多,Shell 启动变慢几乎是必然的。对很多人来说,conda 和 nvm 是两个高频“罪魁祸首”:它们的初始化脚本会做不少检查与环境注入,但你并不会每次开一个新终端就用到它们。
思路很简单:延迟加载。zsh 启动时不初始化 conda/nvm,而是在你第一次敲 conda 或 nvm 时再完成初始化;初始化完成后,后续调用完全等同于正常使用。
做法:在 .zshrc 里删除原有 conda / nvm 初始化代码,替换为下面两个函数。
针对 conda
# 设置 conda 的 PATH(多个候选位置,兼容不同安装方式)
export CONDA_PATH=(/opt/homebrew/bin/conda /data/miniconda3/bin/conda $HOME/miniconda3/bin/conda)
conda() {
# 第一次调用 conda 时才初始化(提示行可删除)
echo "Lazy loading conda upon first invocation..."
unfunction conda
for conda_path in $CONDA_PATH; do
if [[ -f $conda_path ]]; then
echo "Using Conda installation found in $conda_path"
eval "$($conda_path shell.zsh hook)"
conda $@
return
fi
done
echo "No conda installation found in $CONDA_PATH"
}
针对 nvm
function nvm () {
# 第一次调用 nvm 时才初始化(提示行可删除)
echo "Lazy loading nvm upon first invocation..."
unfunction nvm
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \\. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \\. "$NVM_DIR/bash_completion"
nvm $@
}
现在每次打开 zsh 都不会默认初始化它们;只有首次使用时才会加载。
如果你还想更“干净”一点,可以禁用 conda 自动激活 base(需要时再手动 conda activate):
conda config --set auto_activate_base false
看看我们最后的优化效果!

小甜点:更快的 conda 环境切换
如果你装了 fzf,可以用一个函数把“列出环境 → 模糊搜索 → 激活”串起来(同样放进 .zshrc):
ce() {
conda activate $(conda info --envs | fzf | awk '{print $1}')
}
保存后重开终端,试试 ce 即可。
