Contents

zsh 启动提速,延迟加载 Conda 和 NVM

随着工具链越来越多,Shell 启动变慢几乎是必然的。对很多人来说,condanvm 是两个高频“罪魁祸首”:它们的初始化脚本会做不少检查与环境注入,但你并不会每次开一个新终端就用到它们。

思路很简单:延迟加载。zsh 启动时不初始化 conda/nvm,而是在你第一次敲 condanvm 时再完成初始化;初始化完成后,后续调用完全等同于正常使用。

做法:在 .zshrc 里删除原有 conda / nvm 初始化代码,替换为下面两个函数。

# 设置 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"
}
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

看看我们最后的优化效果!

恢复如初的 ZSH!

如果你装了 fzf,可以用一个函数把“列出环境 → 模糊搜索 → 激活”串起来(同样放进 .zshrc):

ce() {
    conda activate $(conda info --envs | fzf | awk '{print $1}')
}

保存后重开终端,试试 ce 即可。

ce 的运行效果