用 Zsh 也有几年的时间,期间各种添加配置,导致了每次启动都巨慢无比。我也换了 fish 用过几天,虽然速度很快,补全功能超爽,但是它最大的问题是不兼容 bash,那还玩个毛,我的开发环境极度依赖 bash 脚本,没办法了,Zsh 还是要接着用的,但是优化速度成了一个大问题。
通过 time
分析 zsh
加载速度
1 | $ time zsh -i -c exit |
这里的 real
代表的是执行 zsh
时真实的加载速度,好家伙,这个时间真是够受的。
我们再来看下无配置加载速度
1 | $ time zsh --no-rcs -i -c exit |
我们当然不可能优化到这个速度,但这是我们的目标。
网上优化的方法,通常是使用懒加载,这是很优雅的解决方式,也很有效,但还是那句话,好的东西也并不一定适用于所有人。
关于懒加载,大家可以看看这篇文章 zshrc 启动速度分析和优化,里面梳理了怎样分析 zshrc
中每条语句的加载速度,从而我们可以针对性的优化。
如果懒加载可以解决你的问题,那现在已经可以关闭网页,然后优化你的配置了。
下面我先来说说懒加载的缺点,比如 nvm
的配置就很浪费时间
1 | export NVM_DIR="$HOME/.nvm" |
我们进行懒加载配置
1 | nvm() { |
这样再次执行测速会发现优化了很多,是不是很兴奋呢?先别着急。
懒加载配置后,启动 zsh
时虽然提升了速度,但是想要使用 node
命令,需要先执行 nvm
实时加载上述的配置,这似乎没什么,不使用不加载,这不挺好吗?
先来说说我的环境,我的开发环境极度依赖脚本,如果使用了懒加载,那每个启动脚本前都要先套上一个无用的 nvm
命令,这多少有点不伦不类,并且这对于我来说好像并没有起到加速的效果。
并且有些功能懒加载并不正常,比如:
1 | if [ -d "${HOME}/.pyenv" ]; then |
pyenv
用懒加载并不能正常使用,可能是我用的不对,但我也不想在纠结这个件事,我在想是不是可以换一条路。
我在 Zsh 配置文件加载顺序一文中介绍了 Zsh 配置文件的生命周期。
当打开新的 Terminal 时,配置加载顺序为 ~/.zshenv
~/.zprofile
~/.zshrc
~/.zlogin
执行 zsh
时,配置加载顺序为 ~/.zshenv
~/.zshrc
除了 ~/.zshrc
我们发现了一个有意思的配置 ~/.zprofile
,它只在启动 Terminal 时才会加载,那我把不常变动并且耗时长的配置写在这里面不就行了。
这样不管是执行 zsh
,还是 source ~/.zshrc
速度都得到了改善,这个看似自欺欺人的变动,却恰好能满足我的要求。
我使用 tmux 来管理窗口,每次开机后恢复一次 tmux 缓存窗口即可,知道下次重启电脑,我可能都不会在新建 Terminal 了,这样对于我来说就已经大大的优化的 zsh
速度。
最后我过滤了现在的配置文件,去掉了些无用的配置后,速度如下
1 | > time zsh -i -c exit |
OK!终于可以愉快的使用 Zsh 了。