I used to use volta but then they killed it and told people to switch to mise. The mise setup is just way too complicated. I just am tired of having different config files for different tooling when it should just read whats in the package.json and be done with it.
The problem is you still have to know to look for that setting to enable it. That’s too much work when I can just stick with the older tools that work without touching anything.
This wasn't an option for us because as an org we used their recommended hook (1) to automatically change node versions when switching directories, but it effectively undoes the lazy loading.
With mise you get the behaviour of automatically switching when you change directories effectively for free.
Edit: unless you aliased it to `node` or `npm`, which would be fine I guess but super annoying if you ran node or npm commands often. It is not worth the hassle, no one should use nvm in 2026 imo
Second this. Just add Starship.rs for prompt and offload tool chain version handling to mise. That covers about 100% of my needs.
If your org doesn’t use mise, just add mise.toml to your global gitignore. Mise tries to be a single tool covering multiple needs, but don’t have to use it that way. I just manage toolchain versions and envvars (replace direnv).
Unrelated to Mise but related to zsh, there's also https://github.com/jeffreytse/zsh-vi-mode/issues/316. I noticed this plugin was causing a lot of delay. Learned a decent amount about zsh profiling from that issue.
I wasn't actually aware of the impact. I measured the zsh startup time locally (with mvn active and commented out) and it indeed makes a difference (.39s -> .08s). Not that I would have noticed that without measuring :) - yes I'm an old geezer.
Thank you for the recommendation, I might then also be able to ditch sdkman as well.
With zsh i set up nvm to lazy load, so I don't pay for it when I don't use it (I'm a C++ and Rust dev, but I occasionally need to run js stuff from other team members).
I can strongly recommend lazy loading in zsh in general, I use it for pyenv too (which is also slow to load, but I write Python maybe every other week or so only).
The way to do this is to use the autoload functionality in zsh and have the autoloaded script replace itself with the real shell init code for the tool in question.
How often do you launch a fresh terminal though? I start mine with a script to have favourite tabs ready at boot and then generally not much afterwards.
Constantly. I think we've used the excuse of "well, what if you just launch it less often?" enough to excuse bad performance defaults, especially when alternative solutions fix the issue with very few trade-offs.
This is going to vary wildly by what you do and how much CLI you use.
I’m an SRE and the answer is “constantly”. I get pulled in a lot of directions, it’s way easier to maintain context if I open a new terminal or tab for each thing.
Joe asks about something, I open a terminal. Teammate asks about something, new terminal. Joe replies, I swap back to his terminal to look at the scrollback buffer.
I’m closer to you when doing more dev work. One tab running a watcher for builds and restarting the app, one tab to run tests or whatever, a couple for poking around if I need to grep or curl or whatever.