Node.js 版本管理、NPM 命令、与 NVM 完全指南

606 阅读5分钟

Node.js 版本概述

版本命名规则

Node.js 采用语义化版本控制(Semantic Versioning),格式为:主版本号.次版本号.修订号

  • 主版本号:不兼容的 API 修改
  • 次版本号:向下兼容的功能性新增
  • 修订号:向下兼容的问题修正

版本类型

LTS 版本(长期支持版本)

  • Active LTS:当前活跃维护的 LTS 版本
  • Maintenance LTS:维护模式的 LTS 版本
  • 特点:稳定性好,生产环境推荐使用
  • 发布周期:每年 10 月发布新的 LTS 版本

Current 版本(当前版本)

  • 特点:包含最新特性,可能不够稳定
  • 适用场景:开发环境、测试新特性

主要版本历史

版本发布时间LTS 状态EOL 时间主要特性
v22.x2024.04Current2027.04require() ES 模块、V8 12.4、性能提升
v20.x2023.04Active LTS2026.04权限模型、稳定 test_runner、Node.js 20
v18.x2022.04Maintenance LTS2025.04fetch API、Test Runner、全局可用
v16.x2021.04EOL2024.04npm 7、Apple Silicon 支持、Timers Promises
v14.x2020.04EOL2023.04Optional Chaining、Nullish Coalescing
v12.x2019.04EOL2022.04ES6 模块支持、TLS 1.3

NVM 简介与优势

什么是 NVM?

NVM(Node Version Manager)是 Node.js 版本管理工具,允许在同一台机器上安装和管理多个 Node.js 版本。

NVM 的优势

  1. 版本切换:快速切换不同 Node.js 版本
  2. 项目隔离:不同项目使用不同 Node.js 版本
  3. 测试兼容性:测试代码在多个版本下的兼容性
  4. 简化升级:轻松升级或降级 Node.js 版本

NVM 工具对比

工具平台支持特点
nvmLinux/macOS原生 bash 脚本,功能完整
nvm-windowsWindowsWindows 专用版本
fnm跨平台Rust 编写,速度快
nLinux/macOS简单轻量

NVM 安装指南

Windows 系统安装

方法一:使用 nvm-windows

  1. 下载安装包

    # 访问GitHub下载最新版本
    https://github.com/coreybutler/nvm-windows/releases
    
  2. 运行安装程序

    • 下载 nvm-setup.zip
    • 解压并运行 nvm-setup.exe
    • 按提示完成安装
  3. 验证安装

    nvm version
    

方法二:使用 Chocolatey

# 安装Chocolatey(如果未安装)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

# 安装nvm-windows
choco install nvm

Linux/macOS 系统安装

使用 curl 安装

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

使用 wget 安装

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

配置环境变量

# 添加到 ~/.bashrc 或 ~/.zshrc
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

# 重新加载配置
source ~/.bashrc

NVM 基础使用

查看版本信息

# 查看NVM版本
nvm --version

# 查看可安装的Node.js版本
nvm list available    # Windows
nvm ls-remote         # Linux/macOS

# 查看已安装的版本
nvm list              # Windows
nvm ls                # Linux/macOS

安装 Node.js 版本

# 安装最新LTS版本
nvm install --lts

# 安装指定版本
nvm install 18.17.0
nvm install 16.20.0

# 安装最新稳定版
nvm install node

# 安装最新版本并设置为默认
nvm install node --latest-npm

切换 Node.js 版本

# 切换到指定版本
nvm use 18.17.0

# 切换到最新LTS版本
nvm use --lts

# 设置默认版本
nvm alias default 18.17.0    # Linux/macOS
nvm use 18.17.0              # Windows每次启动终端需要重新设置

卸载 Node.js 版本

# 卸载指定版本
nvm uninstall 16.20.0

# 查看当前使用的版本
nvm current

npm 完全使用指南

npm 简介

npm(Node Package Manager)是 Node.js 的包管理器,是世界上最大的软件注册表。它不仅用于管理 Node.js 包,也是现代前端开发的核心工具。

npm 版本与更新

查看 npm 版本

# 查看当前npm版本
npm --version
npm -v

# 查看详细信息
npm version

# 查看所有相关版本信息
npm version --json

更新 npm

# 更新到最新版本
npm install -g npm@latest

# 更新到指定版本
npm install -g npm@8.19.2

# 查看可用版本
npm view npm versions --json

包管理命令

安装包

# 安装生产依赖
npm install <package-name>
npm i <package-name>                    # 简写

# 安装开发依赖
npm install <package-name> --save-dev
npm i <package-name> -D                 # 简写

# 安装全局包
npm install -g <package-name>

# 安装指定版本
npm install <package-name>@1.2.3
npm install <package-name>@latest
npm install <package-name>@beta

# 从Git仓库安装
npm install git+https://github.com/user/repo.git
npm install github:user/repo
npm install user/repo

# 从本地路径安装
npm install ./local-package
npm install ../another-package

# 安装所有依赖
npm install                             # 根据package.json安装
npm ci                                  # 从package-lock.json快速安装

卸载包

# 卸载本地包
npm uninstall <package-name>
npm remove <package-name>               # 别名
npm rm <package-name>                   # 简写

# 卸载开发依赖
npm uninstall <package-name> --save-dev

# 卸载全局包
npm uninstall -g <package-name>

# 清理未使用的包
npm prune                               # 移除未在package.json中的包
npm prune --production                  # 移除devDependencies

更新包

# 更新所有包
npm update

# 更新指定包
npm update <package-name>

# 更新全局包
npm update -g

# 检查过期包
npm outdated                            # 检查本地包
npm outdated -g                         # 检查全局包

# 查看包的最新版本
npm view <package-name> version
npm show <package-name> versions        # 查看所有版本

包信息查询

搜索包

# 搜索包
npm search <keyword>
npm s <keyword>                         # 简写

# 在线搜索(更详细)
npm search <keyword> --searchlimit=20
npm search <keyword> --json             # JSON格式输出

查看包信息

# 查看包详细信息
npm info <package-name>
npm view <package-name>                 # 别名
npm show <package-name>                 # 别名

# 查看特定字段
npm view <package-name> version
npm view <package-name> description
npm view <package-name> dependencies
npm view <package-name> repository
npm view <package-name> homepage

# 查看包的所有版本
npm view <package-name> versions
npm view <package-name> time            # 查看发布时间

# 查看包的文档
npm docs <package-name>
npm home <package-name>                 # 打开主页

# 查看包的仓库
npm repo <package-name>

列出已安装的包

# 列出本地包
npm list
npm ls                                  # 简写

# 只显示顶级包
npm list --depth=0

# 列出全局包
npm list -g
npm list -g --depth=0

# 列出特定包
npm list <package-name>
npm list <package-name> -g

# 以JSON格式输出
npm list --json
npm list --json --depth=0

# 列出生产环境包
npm list --prod
npm list --only=production

# 列出开发环境包
npm list --dev
npm list --only=development

脚本管理

运行脚本

# 运行package.json中定义的脚本
npm run <script-name>

# 常用内置脚本
npm start                               # 等同于 npm run start
npm stop                                # 等同于 npm run stop
npm test                                # 等同于 npm run test
npm restart                             # 先stop再start

# 查看所有可用脚本
npm run

# 静默运行(减少输出)
npm run <script-name> --silent
npm run <script-name> -s

# 传递参数给脚本
npm run <script-name> -- --arg1 --arg2

生命周期脚本

# npm会自动运行的生命周期脚本
preinstall                             # 安装前
install                                 # 安装时
postinstall                             # 安装后

preuninstall                            # 卸载前
uninstall                               # 卸载时
postuninstall                           # 卸载后

preversion                              # 版本变更前
version                                 # 版本变更时
postversion                             # 版本变更后

pretest                                 # 测试前
test                                    # 测试时
posttest                                # 测试后

prepublish                              # 发布前(已废弃)
prepublishOnly                          # 仅发布前
publish                                 # 发布时
postpublish                             # 发布后

配置管理

查看配置

# 查看所有配置
npm config list
npm config ls                           # 简写

# 查看详细配置
npm config list -l

# 查看特定配置
npm config get <key>
npm get <key>                           # 简写

# 常用配置查看
npm config get registry
npm config get cache
npm config get prefix

设置配置

# 设置配置
npm config set <key> <value>
npm set <key> <value>                   # 简写

# 常用配置设置
npm config set registry https://registry.npmmirror.com
npm config set cache ~/.npm
npm config set prefix /usr/local

# 设置代理
npm config set proxy http://proxy.company.com:8080
npm config set https-proxy http://proxy.company.com:8080

# 删除配置
npm config delete <key>
npm config rm <key>                     # 简写

# 编辑配置文件
npm config edit

配置文件位置

# 用户级配置文件
~/.npmrc                                # Unix/Linux/macOS
%USERPROFILE%\.npmrc                    # Windows

# 项目级配置文件
<project-root>/.npmrc

# 全局配置文件
/etc/npmrc                              # Unix/Linux
%APPDATA%\npm\etc\npmrc                 # Windows

缓存管理

缓存操作

# 查看缓存信息
npm cache verify

# 清理缓存
npm cache clean
npm cache clean --force                 # 强制清理

# 查看缓存目录
npm config get cache

# 设置缓存目录
npm config set cache /path/to/cache

# 查看缓存内容
npm cache ls                            # 列出缓存内容

发布与版本管理

初始化项目

# 初始化新项目
npm init
npm init -y                             # 使用默认值

# 使用模板初始化
npm init <template-name>
npm create <template-name>              # 等同于上面

# 常用模板
npm init react-app my-app
npm init vue my-app
npm init express-app my-app

版本管理

# 查看当前版本
npm version

# 升级版本
npm version patch                       # 修订版本 1.0.0 -> 1.0.1
npm version minor                       # 次版本   1.0.0 -> 1.1.0
npm version major                       # 主版本   1.0.0 -> 2.0.0

# 预发布版本
npm version prerelease                  # 1.0.0 -> 1.0.1-0
npm version prepatch                    # 1.0.0 -> 1.0.1-0
npm version preminor                    # 1.0.0 -> 1.1.0-0
npm version premajor                    # 1.0.0 -> 2.0.0-0

# 指定版本
npm version 1.2.3

发布包

# 登录npm
npm login
npm adduser                             # 别名

# 查看登录状态
npm whoami

# 发布包
npm publish

# 发布测试版本
npm publish --tag beta
npm publish --tag alpha

# 发布到指定registry
npm publish --registry https://registry.npmjs.org

# 撤销发布(24小时内)
npm unpublish <package-name>@<version>
npm unpublish <package-name> --force    # 撤销所有版本

安全与审计

安全审计

# 检查安全漏洞
npm audit

# 自动修复安全问题
npm audit fix

# 强制修复(可能导致破坏性更改)
npm audit fix --force

# 查看详细审计报告
npm audit --json
npm audit --parseable

# 设置审计级别
npm audit --audit-level moderate        # 只显示中等及以上级别
npm audit --audit-level high            # 只显示高级别

包完整性

# 验证包完整性
npm ls                                  # 检查依赖完整性
npm doctor                              # 运行健康检查

# 检查包的签名
npm verify-signatures

# 安装时验证完整性
npm install --package-lock-only
npm ci                                  # 严格按照lock文件安装

工作空间管理

工作空间操作

# 初始化工作空间
npm init -w ./packages/package-a

# 在工作空间中安装依赖
npm install lodash -w package-a

# 在所有工作空间运行命令
npm run test --workspaces

# 在特定工作空间运行命令
npm run build -w package-a
npm run build --workspace=package-a

# 列出工作空间
npm ls --workspaces

高级功能

npx 使用

# 执行本地安装的包
npx <command>

# 执行远程包(临时下载执行)
npx create-react-app my-app
npx cowsay "Hello World"

# 指定包版本执行
npx <package>@<version>

# 忽略本地包,强制下载
npx --ignore-existing <package>

# 静默模式
npx --quiet <package>
npx -q <package>

链接开发

# 创建全局链接
npm link                                # 在包目录中执行

# 链接到项目
npm link <package-name>                 # 在项目目录中执行

# 取消链接
npm unlink <package-name>
npm unlink                              # 在包目录中执行

私有包管理

# 配置私有registry
npm config set @company:registry https://npm.company.com

# 安装私有包
npm install @company/private-package

# 发布私有包
npm publish --access restricted        # 私有包
npm publish --access public            # 公开包

性能优化

安装优化

# 使用 npm ci 进行快速安装
npm ci                                  # 适用于 CI/CD 环境

# 并行安装
npm install --prefer-offline           # 优先使用离线缓存
npm install --no-optional              # 跳过可选依赖

# 生产环境安装
npm install --only=production
npm install --omit=dev                 # npm 7+

# 减少依赖树深度
npm dedupe                              # 去重依赖
npm ls --depth=0                        # 检查顶级依赖

镜像源配置

# 设置淘宝镜像
npm config set registry https://registry.npmmirror.com

# 设置官方镜像
npm config set registry https://registry.npmjs.org

# 临时使用镜像
npm install --registry https://registry.npmmirror.com

# 查看当前镜像源
npm config get registry

# 使用nrm管理镜像源
npm install -g nrm
nrm ls                                  # 列出可用镜像源
nrm use taobao                         # 切换到淘宝镜像
nrm test                               # 测试镜像源速度

npm 常用配置示例

.npmrc 配置文件示例

# 镜像源配置
registry=https://registry.npmmirror.com

# 缓存配置
cache=/Users/username/.npm-cache

# 安装配置
save-exact=true
package-lock=true

# 安全配置
audit-level=moderate

# 代理配置
proxy=http://proxy.company.com:8080
https-proxy=http://proxy.company.com:8080

# 私有包配置
@company:registry=https://npm.company.com

# 发布配置
access=public

package.json 脚本示例

{
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js",
    "build": "webpack --mode production",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:coverage": "jest --coverage",
    "lint": "eslint src/",
    "lint:fix": "eslint src/ --fix",
    "format": "prettier --write src/",
    "clean": "rm -rf dist/",
    "prebuild": "npm run clean",
    "postbuild": "npm run test",
    "deploy": "npm run build && gh-pages -d dist"
  }
}

故障排除

常见问题解决

# 清理并重新安装
rm -rf node_modules package-lock.json
npm install

# 权限问题解决
sudo chown -R $(whoami) ~/.npm
sudo chown -R $(whoami) /usr/local/lib/node_modules

# 网络问题
npm config set proxy http://proxy:8080
npm config set strict-ssl false         # 不推荐,仅用于调试

# 版本冲突
npm ls                                  # 查看依赖树
npm dedupe                              # 去重依赖
npm shrinkwrap                          # 锁定依赖版本

调试信息

# 显示调试信息
npm install --verbose
npm install --loglevel verbose

# 显示详细错误
npm install --loglevel silly

# 查看npm配置路径
npm config get userconfig
npm config get globalconfig

常见问题及解决方案

1. 权限问题

Windows 权限问题

# 以管理员身份运行PowerShell
# 设置执行策略
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Linux/macOS 权限问题

# 修复权限
sudo chown -R $(whoami) ~/.nvm
chmod +x ~/.nvm/nvm.sh

2. 环境变量配置问题

Windows 环境变量

# 手动设置环境变量
setx NVM_HOME "C:\Users\%USERNAME%\AppData\Roaming\nvm"
setx NVM_SYMLINK "C:\Program Files\nodejs"
setx PATH "%PATH%;%NVM_HOME%;%NVM_SYMLINK%"

Linux/macOS 环境变量

# 检查配置文件
echo $NVM_DIR
which nvm

# 重新加载NVM
source ~/.nvm/nvm.sh

3. 网络连接问题

设置代理

# 设置npm代理
npm config set proxy http://proxy.company.com:8080
npm config set https-proxy http://proxy.company.com:8080

# 设置NVM代理
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node/

使用国内镜像

# 设置淘宝镜像
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/
export NVM_IOJS_ORG_MIRROR=https://npmmirror.com/mirrors/iojs/

4. 版本切换不生效

检查全局安装的 Node.js

# 卸载全局安装的Node.js
# Windows: 通过控制面板卸载
# Linux/macOS:
sudo rm -rf /usr/local/bin/node
sudo rm -rf /usr/local/bin/npm

清理 PATH 环境变量

# 移除其他Node.js路径
echo $PATH | grep node

5. npm 包管理问题

全局包迁移

# 在新版本中重新安装全局包
npm list -g --depth=0 > global-packages.txt
npm install -g $(cat global-packages.txt | grep -v npm | awk '{print $2}' | cut -d@ -f1)

手动安装 Node.js

Windows 手动安装

方法一:官方安装包

  1. 下载安装包

    • 访问 Node.js 官网
    • 选择 LTS 版本或 Current 版本
    • 下载 Windows Installer (.msi)
  2. 安装过程

    - 运行.msi文件
    - 接受许可协议
    - 选择安装路径(建议默认)
    - 选择组件(建议全选)
    - 完成安装
    
  3. 验证安装

    node --version
    npm --version
    

方法二:便携版安装

  1. 下载便携版

    - 下载Windows Binary (.zip)
    - 解压到指定目录
    
  2. 配置环境变量

    # 添加到PATH
    setx PATH "%PATH%;C:\path\to\node"
    

Linux 手动安装

方法一:包管理器安装

# Ubuntu/Debian
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs

# CentOS/RHEL
curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -
sudo yum install -y nodejs

# Arch Linux
sudo pacman -S nodejs npm

方法二:二进制包安装

# 下载二进制包
wget https://nodejs.org/dist/v18.17.0/node-v18.17.0-linux-x64.tar.xz

# 解压
tar -xJf node-v18.17.0-linux-x64.tar.xz

# 创建符号链接
sudo ln -s /path/to/node-v18.17.0-linux-x64/bin/node /usr/local/bin/node
sudo ln -s /path/to/node-v18.17.0-linux-x64/bin/npm /usr/local/bin/npm

macOS 手动安装

方法一:官方安装包

# 下载并安装.pkg文件
# 从官网下载macOS Installer (.pkg)

方法二:Homebrew 安装

# 安装Homebrew(如果未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装Node.js
brew install node

# 安装特定版本
brew install node@16

最佳实践建议

1. 版本选择策略

  • 生产环境:使用 LTS 版本,确保稳定性
  • 开发环境:可使用 Current 版本体验新特性
  • 团队协作:统一 Node.js 版本,使用.nvmrc文件

2. 项目版本管理

# 创建.nvmrc文件
echo "18.17.0" > .nvmrc

# 使用项目指定版本
nvm use

# 自动切换版本(需要配置)
# 在.bashrc或.zshrc中添加
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  local nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

3. 全局包管理

# 列出全局包
npm list -g --depth=0

# 保存全局包列表
npm list -g --depth=0 --json > global-packages.json

# 在新版本中恢复全局包
# 解析JSON并安装包

4. 性能优化

# 使用更快的镜像源
npm config set registry https://registry.npmmirror.com

# 使用yarn替代npm
npm install -g yarn
yarn config set registry https://registry.npmmirror.com

5. 安全考虑

# 定期更新npm
npm install -g npm@latest

# 检查安全漏洞
npm audit
npm audit fix

# 使用npm ci进行生产环境安装
npm ci --only=production

6. 开发环境配置

# 配置npm初始化默认值
npm config set init.author.name "Your Name"
npm config set init.author.email "your.email@example.com"
npm config set init.license "MIT"

# 设置npm缓存目录
npm config set cache /path/to/npm-cache

故障排除指南

诊断命令

# 检查NVM状态
nvm --version
nvm current
nvm ls

# 检查Node.js和npm
node --version
npm --version
which node
which npm

# 检查环境变量
echo $PATH
echo $NVM_DIR

# 检查npm配置
npm config list
npm config get registry

常见错误及解决

  1. "nvm: command not found"

    • 检查安装是否成功
    • 重新加载 shell 配置文件
    • 检查环境变量配置
  2. 版本切换失败

    • 检查是否有其他 Node.js 安装
    • 清理 PATH 中的冲突路径
    • 重启终端
  3. 权限错误

    • 使用管理员权限
    • 修复文件权限
    • 检查防火墙设置

结语

Node.js 版本管理是现代 JavaScript 开发的重要技能。通过合理使用 NVM 等版本管理工具,可以显著提高开发效率和项目稳定性。建议在实际项目中建立规范的版本管理流程,确保团队协作的一致性。

记住以下关键点:

  • 生产环境优先使用 LTS 版本
  • 使用.nvmrc文件管理项目版本
  • 定期更新和维护开发环境
  • 关注安全更新和最佳实践