Linux/macOS 下 “npm 全局安装” 报权限错?3 套方案一次讲透

症状重现

npm install -g xxx 时蹦出
npm ERR! Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/...'
本质是 系统目录写保护,Node 官方给出了 3 条解决路线,按“动手量 & 风险”由低到高给你重新梳理一遍,复制即可用。


方案 1:一次性提升权限(最快,但治标不治本)

# 当前用户已在 sudoers 文件里
sudo npm install -g xxx
想图省事可直接 sudo,不过
  • 每次都要 sudo
  • 容易把 /usr/local 所有者改成 root,后续不用 sudo 反而报错
因此官方更推荐下面两种“平民化”做法。

方案 2:用 Node 版本管理器彻底绕开系统目录(最干净)

为什么首推?
  • 多版本 Node 随意切
  • 所有全局包装在用户家目录,权限零烦恼
  • 卸载/升级全走脚本,不留垃圾
2 步完成(以 fnm 为例,nvm/volta 同理):
# 1. 安装 fnm(单文件,无需 sudo)
curl -fsSL https://fnm.vercel.app/install | bash
# 脚本已自动把 PATH 写进 ~/.bashrc / ~/.zshrc

# 2. 装 Node & npm(全部落在 ~/.fnm 下)
fnm use --install-if-missing 20
# 验证
node -v   # v20.x.x
npm  -v   # 10.x.x
npm install -g pnpm yarn vercel   # 再不需要 sudo
提示
  • 之前用 brew/apt/yum 装的 Node 不必删,把管理器加在 PATH 最前面即可覆盖。
  • Windows 用户直接装 nvm-windowsvolta,思路完全一致。

方案 3:手动把 npm 全局目录搬回家(不想装版本管理器时选它)

原理
告诉 npm:“别写 /usr/local,写 ~/.npm-global 就行。”
5 条命令(复制即跑):
# 1. 建目录
mkdir -p ~/.npm-global/{bin,lib}

# 2. 让 npm 认得新路径
npm config set prefix ~/.npm-global

# 3. 把可执行文件目录写进当前 shell 启动脚本
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc   # macOS 用 ~/.zshrc
source ~/.bashrc                                         # 立即生效

# 4. 验证(无需 sudo)
npm install -g jshint
which jshint          # → /home/你的用户名/.npm-global/bin/jshint

# 5. (可选)用 ENV 变量临时指定,避免改 profile
NPM_CONFIG_PREFIX=~/.npm-global npm install -g http-server
注意
  • 该方案仅解决 npm 全局包 的权限,Node 本体 仍在系统目录;日后升级 Node 需手动维护。
  • Windows 不适用路径写法,但思路相同——把 prefix 改到 %USERPROFILE%\npm-global,再把 ...\npm-global\bin 加到“用户环境变量” PATH 即可。

 

THE END