前言
大家好,我是王嗨皮,一名主业前端,副业全栈的程序员,如果我的文章能让您有所收获,欢迎一键三连(评论,点赞,关注)。
一.问题场景
作为前端工程师,在使用Node.js进行项目开发时,有时会遇到一个小麻烦:当尝试通过npm启动项目或安装依赖时,控制台偶尔会提示权限不足的问题。这时,通常需要我们在命令前加上sudo(如sudo npm install),并输入系统密码来解决这个问题,这样才能继续开发工作。
二.背后的原因
在macOS系统中安装项目依赖或执行npm install时遇到权限错误,
通常需要通过在命令前添加sudo来解决这一问题。
此现象的根本原因在于:无论是通过官方的安装包(.pkg文件)还是HomeBrew工具安装Node.js,所安装的相关文件及目录默认会被放置于系统级别的root根目录下。由于这些位置属于受保护区域,普通用户缺乏足够的写入权限,因此直接操作会触发权限不足的错误提示。使用sudo则可以临时获取超级用户权限,从而绕过这一限制,顺利完成安装过程。
我们用表格来看一下安装时对应的默认路径:
| 安装方式 | Node安装位置 | npm全局包目录 | 权限归属 |
|---|---|---|---|
| 官方安装包,.pkg | /usr/local/bin/node | /usr/local/lib/node_modules | 属于root |
| Homebrew(intel mac) | /usr/local/Cellar/node/... | /usr/local/lib/node_modules | 属于root |
| Homebrew(M1/M2 芯片) | /opt/homebrew/Cellar/node/... | /opt/homebrew/lib/node_modules | 属于root |
| nvm(Node Version Manager) | ~/.nvm/versions/node/... | ~/.nvm/... | 属于当前普通用户 |
从上述的表格中我们可以看到除nvm外,所有的默认安装都指向了root目录中。
在 macOS 中 root 作为根目录是不能被普通用户所访问,如果想要访问只用通过 sudo进行临时提权,
例如:我们在项目中需要安装依赖或重新安装node_modules时,需要执行:
sudo npm install 或者 sudo npm install xxx
然后输入密码,命令才可以正常执行,否则就会报如下权限错误:
npm ERR! code EACCES
三.针对上述问题的两种解决方案
2.1 修改npm默认安装路径
启动macOS系统终端,执行以下命令创建 .npm-global 文件夹:
mkdir ~/.npm-global
重新配置npm的全局安装路径:
npm config set prefix ~/.npm-global
确认你的shell配置文件类型,在终端继续执行:
echo $SHELL
如果返回 /bin/zsh 则表示 shell 类型为 zsh, /bin/bash 表示类型为 bash
找到 .zhsrc 或者 .bashrc,打开在里面添加以下配置:
export PATH=$HOME/.npm-global/bin:$PATH
如果没有 shell 文件,使用 command + shift + . 快捷键查看隐藏文件
保存文件,然后打开终端,执行以下命令:
source ~/.zshrc
注意:如果之前在项目或者在安装过程中使用了 sudo ,导致部分文件所属变成root,在修改了默认的安装路径后,执行npm install,可能仍然会出现报错的情况。
针对这个问题可以尝试在终端分别执行以下命令:
sudo chown -R $(whoami) ~/.npm
sudo chown -R $(whoami) /usr/local/lib/node_modules
sudo chown -R $(whoami) /usr/local/bin
2.2 使用nvm管理node
从文章开头的表格展示的默认安装路径,我们已经可以看到使用nvm安装node时,默认安装路径的所属是非root的。
所以使用nvm管理node是另一种解决方案,步骤如下:
1️⃣ 在终端运行:
curl -o- [https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh](https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh) | bash
2️⃣ 安装后重启终端,或者运行:
source ~/.bashrc 或者 source ~/.zshrc
3️⃣ 安装 Node
nvm install --lts
4️⃣ 切换使用
nvm use --lts
四.总结
对于初次配置Node.js环境的用户,建议采用Node Version Manager (nvm)来管理Node.js版本。这样做可以简化安装流程,减少不必要的复杂操作。