我们使用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; thenyarn config set cache-folder "$yarn_cache_path" --global 2>/dev/nullfi# 可选:切换时显示提示(需要提示时可取消注释下一行)# 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)"
执行结果:

