多用户共享的前端工具链安装指南(NVM、Node、pnpm)

背景知识

前置准备

支持:Linux(Ubuntu/Debian/CentOS/RHEL)、bash/zsh

sudo apt-get update
sudo apt-get install -y curl git ca-certificates

1) 创建共享目录(只共享 pnpm store)

建议使用专用组 nodejs(比 users 更可控):

sudo groupadd nodejs || true
sudo mkdir -p /opt/nodejs/pnpm-store

sudo chgrp -R nodejs /opt/nodejs
sudo chmod -R 2775 /opt/nodejs

sudo usermod -aG nodejs <你的用户名>
# 让组权限生效:重新登录 或 newgrp nodejs

2) 黄金安装顺序

  1. NVM(每用户)
  2. Node(通过 NVM,每用户)
  3. pnpm(每用户安装,但 store 指向共享目录)

3) 安装 NVM + Node + pnpm(每个用户都做一次)

3.1 安装 NVM

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
. "$HOME/.nvm/nvm.sh"

3.2 安装 Node(建议 LTS)

nvm install --lts
nvm use --lts
nvm alias default 'lts/*'
node -v
npm -v

3.3 安装 pnpm(推荐:独立安装脚本)

说明:Corepack 也能用,但遇到版本/权限问题时,独立安装更可控、排查更简单。

curl -fsSL https://get.pnpm.io/install.sh | sh -

把 pnpm 加入 PATH(若安装脚本已自动加过,这段可忽略):

# ~/.bashrc 或 ~/.zshrc
export PNPM_HOME="$HOME/.local/share/pnpm"
export PATH="$PNPM_HOME:$PATH"

验证:

pnpm -v

4) 让 pnpm 使用共享 store(核心省空间点)

写进 ~/.bashrc~/.zshrc

export PNPM_STORE_DIR="/opt/nodejs/pnpm-store"

立即生效:

source ~/.bashrc   # 或 source ~/.zshrc

验证 store:

pnpm store path
# 期望输出:/opt/nodejs/pnpm-store

5) 强烈建议:不要共享 pnpm 全局安装目录(避免 EPERM)

不要pnpm add -g 的全局目录指向 /opt/...
原因:多人更新同一个全局目录会出现权限冲突版本漂移,以及 EPERM chmod

推荐做法:

安装全局工具示例:

pnpm add -g @openai/codex @google/gemini-cli


6) 常见坑与排查(最简版)

6.1 共享目录权限不生效

groups
newgrp nodejs
ls -ld /opt/nodejs /opt/nodejs/pnpm-store
# 期望:drwxrwsr-x(有 s 表示 setgid 生效)

6.2 pnpm 没走共享 store

echo $PNPM_STORE_DIR
pnpm store path

7) 一键验收

command -v nvm && nvm --version
node -v && npm -v
pnpm -v
pnpm store path
ls -ld /opt/nodejs /opt/nodejs/pnpm-store

pnpm并发导致内存溢出OOM

原因:node每个进程几个G内存,多进程叠加 → 内存 + swap 全部打满 → 系统卡死。另外,大量小文件导致频繁扫描,硬盘被打满,性能下降。

解决方案

  1. WSL优化内存:
    在Windows下,%UserProfile%.wslconfig
[wsl2]
swap=32GB
swapFile=C:\\wsl-swap.vhdx

[experimental]
# 缓慢回收内存
autoMemoryReclaim=gradual
  1. 限制每个 Node.js 进程最多只能使用 4GB 的堆内存。
    在 .bashrc 中添加:
export NODE_OPTIONS="--max-old-space-size=4096"
  1. 限制 pnpm 并发(尤其是 pnpm 10 的自适应网络并发可能更激进):
pnpm config set network-concurrency 4
pnpm config set child-concurrency 2
pnpm config set fetch-retries 2
pnpm config set prefer-offline true
  1. 告诉AI Coding工具:pnpm 固定使用全局 store(不要放项目里),否则频繁扫描海量小文件容易卡死。如果 store 在项目目录,以下程序都会把这些文件一起扫一遍:

    • 每次 install / script 执行
    • agent 扫描项目目录
    • VSCode 文件监听
    • git 状态检测
  2. 最后在内存紧张时,杀死耗内存大户,保住系统不死:

sudo apt update
sudo apt install -y earlyoom
sudo systemctl enable --now earlyoom