本文档涵盖了 NVM 的高级用法场景和配置选项。它为需要更精细控制 NVM 如何运行的用户提供了更深入的技术细节,包括高级安装选项、环境变量配置、版本解析机制以及性能优化。有关基本用法,请参阅用法。
NVM 提供了多种高级安装选项,可以在运行安装脚本之前通过环境变量进行自定义。
您可以使用以下环境变量来自定义安装目录、源存储库和 Node.js 版本
| 可变 | 描述 | 默认 |
|---|---|---|
NVM_DIR | 安装目录 | $HOME/.nvm 或 $XDG_CONFIG_HOME/nvm |
NVM_SOURCE | NVM 的源 URL | GitHub 存储库 URL |
PROFILE | 要更新的 shell 配置文件 | 根据 shell 自动检测 |
NODE_VERSION | NVM 设置完成后要安装的 Node.js 版本 | 无 |
例如,要将 NVM 安装到自定义目录
您还可以通过设置 PROFILE=/dev/null 来阻止安装程序修改 shell 配置文件。
来源:install.sh23-33 install.sh416-428 README.md125-137
NVM 可通过不同方法安装,每种方法都有其优点
| 方法 | 描述 | 用例 |
|---|---|---|
| 脚本安装 | 仅下载必要文件 | 快速安装,最小磁盘占用 |
| Git 安装 | 克隆整个存储库 | 更方便地更新,访问开发工具 |
| 手动安装 | 分步手动过程 | 完全控制安装 |
脚本方法将根据可用工具自动在 Git 和脚本安装之间进行选择。
来源:install.sh391-416 README.md316-353
NVM 提供了高级功能,用于管理不同 Node.js 版本之间的 npm 包
当您升级 Node.js 同时保持开发环境时,此功能特别有用。
来源:nvm.sh197-434 README.md453-482
您可以通过创建 $NVM_DIR/default-packages 文件来配置 NVM,使其在每次安装新 Node.js 版本时自动安装一组全局包
# $NVM_DIR/default-packages
rimraf
eslint@7.0.0
typescript
每行应包含一个 npm 可作为包参数接受的包名称(以及可选的版本)。
NVM 的行为可以通过各种环境变量进行自定义
| 环境变量 | 描述 | 默认 |
|---|---|---|
NVM_DIR | NVM 安装的目录 | $HOME/.nvm |
NVM_CD_FLAGS | 传递给 cd 命令的标志 | -q 用于 zsh,其他情况为空 |
NVM_BIN | 安装 Node 二进制文件的目录 | $NVM_DIR/versions/node/<version>/bin |
NVM_COLORS | NVM 输出的配色方案 | bygre |
NVM_COMPLETION | 启用/禁用 NVM 命令补全 | 默认启用 |
NVM_IOJS_ORG_MIRROR | io.js 的自定义镜像 | https://iojs.org/dist |
NVM_NODEJS_ORG_MIRROR | Node.js 的自定义镜像 | https://node.org.cn/dist |
NVM_RC_VERSION | .nvmrc 文件的版本(只读) | 从 .nvmrc 确定 |
NVM_NO_COLORS | 禁用颜色输出 | 默认未设置 |
NVM_SILENT | 禁止显示信息性输出 | 默认未设置 |
NVM_AUTH_HEADER | HTTP 请求的授权头 | 默认未设置 |
您可以自定义 NVM 对不同类型输出使用的配色方案
来源:nvm.sh435-463 nvm.sh1011-1096 README.md536-579
如果您需要使用 Node.js 或 io.js 下载镜像(例如,在互联网访问受限的地区),您可以配置 NVM 使用替代的下载源
来源:README.md582-607 nvm.sh797-867
对于需要身份验证的私有镜像,NVM 支持授权头
授权头在使用前会被清理,以去除潜在的危险字符。
来源:nvm.sh118-162 nvm.sh159-162
下图显示了 NVM 如何解析 Node.js 版本
.nvmrc 文件提供项目特定的 Node.js 版本配置。NVM 支持在 .nvmrc 中使用比仅版本号更高级的语法
# Simple version specification
16.13.0
# Using an alias
lts/gallium
# Using a version range
>=14.0.0
在确定使用哪个版本时,NVM 会遵循以下解析过程
.nvmrc 文件nvm_process_nvmrc 处理内容来源:nvm.sh602-628 nvm.sh484-506 nvm.sh534-601
NVM 的 .nvmrc 处理同时支持裸版本字符串和键值对配置
该 .nvmrc 处理器可以处理注释(以 # 开头的行)并支持简单的版本字符串和键值对配置,以便将来扩展。
来源:nvm.sh516-533 nvm.sh534-601
NVM 包含多项性能优化
压缩支持检测:NVM 会检查您的 curl 安装是否支持压缩,并在可用时使用它来缩短下载时间。
路径操作优化:nvm_change_path 函数经过优化,可在切换 Node.js 版本时最大限度地减少路径操作。
Shell 集成:NVM 的设计宗旨是与 shell 集成,而无需进行重新哈希或重启,使版本切换几乎瞬间完成。
来源:nvm.sh89-91 nvm.sh118-157 nvm.sh981-1004
对于关心 Shell 启动时间的用户,NVM 提供了延迟加载的方法
--no-use,以推迟使用任何 Node.js 版本,直到显式请求为止懒加载:实现一个函数,仅在首次使用 nvm、node 或 npm 命令时才加载 NVM。
自动调用版本:仅在需要时通过 cd hook 设置自动版本切换。
来源: README.md125-130 README.md637-671
对于复杂的安装,请使用以下命令验证 NVM 是否已正确安装:
请记住,which nvm 将无法工作,因为 NVM 是一个 shell 函数,而不是可执行文件。
| 问题 | 潜在原因 | 解决方案 |
|---|---|---|
| 找不到版本 | 无法访问自定义镜像 | 检查镜像配置和连接性 |
| 身份验证问题 | 身份验证头格式不正确 | 确保 NVM_AUTH_HEADER 格式正确 |
| 迁移失败 | npm 版本不兼容 | 使用 --latest-npm 或指定兼容的 npm 版本 |
| PATH 冲突 | 系统 Node.js 优先级更高 | 检查 PATH 顺序和 shell 配置 |
| 性能问题 | 版本切换过于频繁 | 使用 .nvmrc 进行自动版本切换 |
来源: README.md265-276 nvm.sh159-162 nvm.sh197-434
在 Docker 容器和 CI 环境中,NVM 需要特别注意,尤其是在未加载配置文件(profile files)的非交互式 shell 中。
对于 Docker 容器,可以使用特殊的 BASH_ENV 变量,bash 在非交互式调用时会加载它。
对于 CI/CD 作业,更稳健的方法是:
这种方法在交互式和非交互式容器环境中都适用。