macbook开发避坑指南:node与npm绕不开的权限的问题

367 阅读3分钟

前言

大家好,我是王嗨皮,一名主业前端,副业全栈的程序员,如果我的文章能让您有所收获,欢迎一键三连(评论,点赞,关注)。

一.问题场景

作为前端工程师,在使用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版本。这样做可以简化安装流程,减少不必要的复杂操作。