我们使用Nvm,在切换Node版本时,包管理工具(Npm、Yarn、Pnpm)的缓存地址并不会因为Node版本的改变而改变,
这就导致了可能因为Node版本与依赖包不兼容而导致的项目运行问题。以下Shell 脚本(本地系统:MacOs 26.2 (25C56) 修改的**~/.zshrc**文件)
可以实现在执行 "nvm use XXX" 时,自动为每个版本的Node切换独立的缓存地址。
一、修改文件:~/.zshrc:
# 启用 Zsh 的钩子功能
autoload -U add-zsh-hook
# 统一函数:根据 Node.js 版本设置各包管理器的缓存路径
function sync_package_manager_cache {
# 获取当前 Node 版本(去掉 'v' 前缀)
local node_version=$(node -v 2>/dev/null | sed 's/^v//')
if [ -n "$node_version" ]; then
# 1. 设置 pnpm 存储路径
local pnpm_store_path="$HOME/.pnpm-store/v3/node-$node_version"
mkdir -p "$pnpm_store_path"
pnpm config set store-dir "$pnpm_store_path" --global > /dev/null 2>&1
# 2. 设置 npm 缓存路径
local npm_cache_path="$HOME/.npm_cache/node-$node_version"
mkdir -p "$npm_cache_path"
# 通过环境变量设置(优先级最高)
export npm_config_cache="$npm_cache_path"
# 同时写入全局配置
npm config set cache "$npm_cache_path" --global 2>/dev/null
# 3. 设置 yarn (v1) 缓存路径
local yarn_cache_path="$HOME/.yarn_cache/node-$node_version"
mkdir -p "$yarn_cache_path"
# 通过环境变量设置
export YARN_CACHE_FOLDER="$yarn_cache_path"
# 如果 yarn 已安装,也写入其全局配置
if command -v yarn &> /dev/null; then
yarn config set cache-folder "$yarn_cache_path" --global 2>/dev/null
fi
# 可选:切换时显示提示(需要提示时可取消注释下一行)
# echo "缓存目录已切换至 Node.js $node_version 对应路径"
fi
}
# 将函数添加到 precmd 钩子,在每次显示命令提示符前执行
add-zsh-hook precmd sync_package_manager_cache
# Shell 启动时立即执行一次,确保初始状态正确
sync_package_manager_cache
二、 修改保存文件以后执行生效:
source ~/.zshrc
三、验证是否生效:
nvm use 22
echo "Node版本: $(node -v)"
echo "npm缓存: $(npm config get cache)"
echo "yarn缓存: $(yarn cache dir 2>/dev/null || echo 'yarn未安装')"
echo "pnpm存储: $(pnpm store path)"
nvm use 24
echo "Node版本: $(node -v)"
echo "npm缓存: $(npm config get cache)"
echo "yarn缓存: $(yarn cache dir 2>/dev/null)"
echo "pnpm存储: $(pnpm store path)"
执行结果:

