starship通过执行node --version命令获取当前node.js版本并显示,不解析.nvmrc或package.json中的engines字段;其显示结果完全取决于终端中node命令的实际输出,因此需确保shell环境(如nvm)已正确加载且node在path中可用。

VSCode终端能显示Node和npm版本,但Starship默认不主动读取.nvmrc或engines字段——它只响应当前shell环境里的node和npm命令实际输出的版本。
Starship怎么知道当前Node版本?
Starship本身不解析.nvmrc或package.json里的engines.node,它只执行node --version并截取结果。所以显示什么版本,完全取决于你终端里node命令指向哪里。
- 如果你用
nvm use 18.19.0后再开终端,Starship就显示v18.19.0 - 如果VSCode终端没加载nvm(比如Windows GUI启动、macOS没从终端启动
code .),node -v可能还是系统默认版本,Starship就照搬这个 -
[nodejs]模块默认开启,但若node不在PATH里,它会静默不显示——不是报错,是直接跳过
如何让Starship稳定显示项目对应Node/npm版本?
关键不是改Starship配置,而是确保终端环境本身已正确切换。Starship只是“显示器”,不是“调度器”。
- macOS/Linux:确认
~/.zshrc或~/.bash_profile里有source ~/.nvm/nvm.sh,且VSCode必须从终端启动(code .),否则GUI进程拿不到shell初始化变量 - Windows(PowerShell):检查
$PROFILE是否加载了nvm.ps1;若用CMD,nvm基本不可用,建议切PowerShell或WSL2 - 验证方式:在VSCode终端里运行
which node和npm --version,输出路径和版本号必须与你期望的一致——这是Starship显示正确的前提
自定义Starship的Node/npm显示格式
修改~/.config/starship.toml里的[nodejs]和[npm]区块即可,但注意参数含义:
-
format控制显示模板,$version是真实输出值,via只是前缀文字,不参与逻辑 -
disabled = false必须显式设为false(默认是true),否则模块压根不启用 -
detect_files = ["package.json"]只是触发检测的文件列表,不是“根据它选版本”,它只告诉Starship:“看到这个文件就去跑node -v” - 示例:
[nodejs] format = "⬢ $version" disabled = false version_format = "v${raw}"其中${raw}保留原始输出(如18.19.0),不用手动加v
为什么npm版本有时不显示?
Starship的[npm]模块默认禁用,且它检测的是npm --version命令是否存在并可执行——不是看package.json有没有scripts。
- 常见原因:
npm命令在当前shell里不可用(比如用pnpm替代了npm,或nvm没连带加载npm二进制) - 解决方法:在
starship.toml里显式启用并指定探测逻辑[npm] disabled = false detect_files = ["package-lock.json", "npm-shrinkwrap.json"]
- 注意:
detect_files只是触发条件,不是数据源;即使项目里只有yarn.lock,只要npm --version能跑,它依然会显示npm版本
最易被忽略的点:VSCode终端里node -v和npm -v输出正确,Starship却没显示——大概率是disabled = true没改成false,或者模块名写成了[node](正确是[nodejs])。











