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-windows或volta,思路完全一致。
方案 3:手动把 npm 全局目录搬回家(不想装版本管理器时选它)
原理
告诉 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 即可。
版权声明:
作者:Suhao Zhang
链接:https://suhao.pw/77.html
文章版权归作者所有,未经允许请勿转载。
THE END