核心原因是npm默认将全局包安装到/usr/local/lib/node_modules等系统保护目录,普通用户无写权限;推荐方案是配置prefix为~/.npm-global并更新path,或直接使用nvm管理node.js以天然规避权限问题。
mac 上 npm 全局安装报 eacces 错误,核心不是“文件权限设置错了”,而是 npm 默认往系统保护目录(/usr/local/lib/node_modules)写东西,而你的普通用户账户天生没这个权限。解决的关键是让 npm 别碰系统目录,改去你完全可控的地方。
确认问题是否真存在
先别急着改配置,用三行命令快速验证:
- 运行 npm config get prefix —— 如果输出是
/usr/local,就基本坐实了问题根源 - 运行 ls -la $(npm config get prefix)/lib/node_modules —— 若提示
Permission denied,说明目录确实不可写 - 试装一个轻量包:npm install -g serve —— 报
EACCES就不用再怀疑了
推荐方案:把全局路径移到用户目录
这是最稳妥、无需 root 权限、不破坏系统安全机制的做法。所有操作都在你自己的主目录里完成:
- 新建专属目录:mkdir -p ~/.npm-global
- 告诉 npm 使用它:npm config set prefix '~/.npm-global'
- 让终端能找到新装的命令:打开 ~/.zshrc(macOS Catalina 及之后默认 shell),末尾添加
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,有 root 所属就一并修复
- 已用 sudo 装过的全局包建议卸载重装:sudo npm uninstall -g xxx → npm install -g xxx
更优长期选择:用 nvm 管理 Node.js
如果你还没固定 Node 版本,直接上 nvm 是一劳永逸的解法:
- nvm 安装的每个 Node 版本都自带独立全局路径(如
~/.nvm/versions/node/v20.15.0/lib/node_modules) - npm install -g 自动落在用户目录,天然避开权限问题
- 还能随时切换 Node 版本,适合多项目协作,安装后开箱即用,不用额外配 PATH











