根本原因是npm默认将全局包安装到/usr/local/lib/node_modules等系统目录,普通用户无写权限;推荐方案是配置prefix为~/.npm-global并更新path,或直接使用nvm管理node.js版本以天然规避权限问题。
macos 上 npm 全局安装报 eacces 错误,根本原因是 npm 默认把包装进 /usr/local/lib/node_modules 这类系统目录,而普通用户没写权限。硬加 sudo 能跑通,但会污染权限、埋下隐患,不推荐。
确认当前全局路径和问题是否存在
先看看 npm 现在往哪装:
- 运行
npm config get prefix,如果输出是/usr/local,就大概率有问题 - 再执行
ls -la $(npm config get prefix)/lib/node_modules,若提示Permission denied,说明权限已受限 - 试装一个轻量包,比如
npm install -g serve,报EACCES就坐实了
重定向 npm 全局路径到用户目录
这是最稳妥、无需 root 权限的解法,所有操作都在你自己的主目录里完成:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 新建目录:
mkdir -p ~/.npm-global - 告诉 npm 用这个位置:
npm config set prefix '~/.npm-global' - 把新 bin 目录加进环境变量:打开
~/.zshrc(macOS Catalina 及之后默认),末尾添加export PATH="$HOME/.npm-global/bin:$PATH" - 生效配置:
source ~/.zshrc
清理旧权限污染(如有)
如果之前用过 sudo npm install -g,很可能残留 root 拥有的文件,导致后续命令仍失败:
- 检查缓存目录归属:
ls -la ~/.npm,若显示 owner 是root,就得修复 - 运行:
sudo chown -R $(whoami) ~/.npm - 同理检查并修复其他可能被污染的目录,如:
~/.npminstall_tarball、~/.cache/npm - 旧全局包建议卸载重装:
sudo npm uninstall -g <package></package>→npm install -g <package></package>
更优方案:用 nvm 管理 Node.js
如果你还没固定 Node 版本,直接上 nvm 是一劳永逸的选择:
- nvm 安装的每个 Node 版本都自带独立的全局模块路径(如
~/.nvm/versions/node/v20.15.0/lib/node_modules) - 所有
npm install -g自动落在用户目录,天然避开权限问题 - 还能随时切换 Node 版本,适合多项目协作
- 安装后无需额外配路径,开箱即用










