推荐通过 nodesource 仓库安装 node.js(lts 版本),避免系统默认旧版本;全局 npm 模块应安装到用户目录并配置 path;初始化项目需手动完善 package.json,明确设置 "type": "module" 和 "engines";权限错误优先检查目录归属而非滥用 sudo。

直接用包管理器装 Node.js,别下官网二进制包
绝大多数 Linux 发行版的默认仓库里都有 nodejs 和 npm,但版本往往太旧(比如 Ubuntu 22.04 自带的是 v12),不推荐直接 apt install nodejs 就完事。更稳妥的做法是加官方 NodeSource 仓库——它提供 LTS 和 Current 两个主线,更新及时、兼容性好。
- Ubuntu/Debian:运行
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -,再sudo apt-get install -y nodejs - CentOS/RHEL/Fedora:用
curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -,再sudo yum install -y nodejs(或dnf) - 装完检查:
node --version和npm --version应该都输出 v18.x 或 v20.x(LTS 当前主流)
常见错误:跳过 setup_lts.x 脚本,直接 apt install nodejs,结果 npm 不带、node 命令不存在(某些发行版把二进制名改成 nodejs)、或者 require('fs/promises') 报错(版本太低不支持 ES Module 语法)。
npm 全局模块安装路径别碰系统目录
npm install -g 默认会往 /usr/local/lib/node_modules 写文件,这需要 sudo 权限,不仅危险,还容易和包管理器冲突(比如 apt upgrade 后 npm 模块突然失效)。正确做法是把全局安装位置切到用户目录下。
- 先建目录:
mkdir ~/.npm-global - 配置 npm:
npm config set prefix '~/.npm-global' - 把
~/.npm-global/bin加进$PATH(写进~/.bashrc或~/.zshrc):export PATH=~/.npm-global/bin:$PATH - 重载 shell:
source ~/.bashrc
验证:装个 npm install -g serve,然后直接敲 serve -v 能运行,说明路径生效。否则你会看到 command not found: serve,大概率是 PATH 没刷进去,或者忘了 source。
npm init 初始化项目时别硬套默认值
npm init 交互式提问看着省事,但一路回车下去,main 字段会填 index.js,test 脚本留空,repository 和 author 乱填,后续 CI、发布、协作全要返工。建议用 npm init -y 快速生成基础 package.json,再手动改关键字段。
-
"type": "module"—— 如果要用import/export,必须加这行,否则import fs from 'fs'直接报错 -
"scripts": { "dev": "node --watch index.js" }——--watch是 Node v18.11+ 原生支持,不用额外装nodemon -
"engines": { "node": ">=18.17.0" }—— 明确锁死最低 Node 版本,避免别人用旧环境跑崩
注意:npm init 不会自动创建 index.js,文件不存在时 npm start 会报 Error: Cannot find module './index.js',这个错误和配置无关,纯属手滑漏建文件。
权限错误 EACCES 不是 npm 问题,是路径归属搞错了
运行 npm install 或 npm install -g 突然报 EACCES: permission denied,第一反应不是换 sudo,而是查当前目录归属:ls -ld .。如果显示 root 占有,说明你之前用 sudo npm 创建过 node_modules,现在普通用户没权限删/写。
- 修复命令:
sudo chown -R $(whoami) ./node_modules(当前项目)或sudo chown -R $(whoami) ~/.npm-global(全局路径) - 预防方法:永远不用
sudo npm install;全局安装走用户路径(见上一节);项目内安装永远在普通用户身份下操作 - 顺手清理:
rm -rf node_modules package-lock.json,再npm install,比硬扛权限错误快得多
真正麻烦的是 Docker 容器里 npm 权限错乱——宿主机挂载的 node_modules 在容器内 UID 不匹配,这时候得用 user: "1001:1001" 显式指定 UID/GID,而不是在 Dockerfile 里 chown 宿主机路径。










