、版本管理工具(nvm、fnm))
1、nodejs 包管理工具fnm / nvmNode 运行时版本管理器 → 管理node/npm本身版本npm / pnpm / yarn / cnpm包管理器 → 管理项目package.json的 JS 依赖包npx / pnpm dlx / yarn dlx临时执行包的工具工具类型锁文件幽灵依赖核心特性推荐场景npm官方包管理器package-lock.json✅存在Node 自带兼容性最好老项目维护简单小项目yarn(v1)包管理器yarn.lock✅存在早期并行下载存量老项目新项目不推荐yarn(berry)包管理器yarn.lock❌无PnP 无 node_modulesmonorepo 强熟悉 Yarn 生态的团队pnpm现代包管理器pnpm-lock.yaml❌无硬链接存储速度快省磁盘workspace 强✅新项目、monorepo 首选cnpmnpm 封装工具cnpm-lock.yaml✅存在npm 淘宝镜像❌新项目尽量不要用npx包执行器--临时执行包无需全局安装脚手架、一次性工具关键注意事项不要混用包管理器一个项目只能用 npm / yarn / pnpm 其中一种lock 文件互不兼容混用会出现依赖错乱cnpm ≠ pnpmcnpm 只是 npm 换源pnpm 是完全独立实现npx 不能用来安装包只是运行pnpm dlx/yarn dlx等价 npx国内加速优先改 registry不要依赖 cnpm是由有幽灵依赖npm、yarn classic 有pnpm、yarn berry 默认没有npm官网https://www.npmjs.com/教程https://www.runoob.com/nodejs/nodejs-npm.html常用命令 npm CLIhttps://docs.npmjs.com/cli/v9npm 官方文档https://docs.npmjs.com/cli/v6/commands/npm-install/npmNode Package ManagerNode.js官方原生包管理器安装 Node 自带最早的 Node 包管理工具。npm 之于 Node.js 就像 pip 之于 Python。npm 原理npm v2嵌套 node_modules包重复拷贝容易目录过深。npm v3扁平依赖依赖尽量提升到根 node_modules冲突时才嵌套。存在幽灵依赖代码可以引入package.json没声明的包来自间接依赖。锁文件package-lock.json锁定依赖版本保证环境一致性。优缺点优点自带、生态完全兼容、官方维护缺点安装速度一般磁盘占用高幽灵依赖问题常用命令npm -v npm install # 安装 package.json 全部依赖 npm install axios # 生产依赖 npm install -D vite # devDependencies 开发依赖 npm uninstall axios npm run dev # 执行 scripts npm config set registry https://registry.npmmirror.com # 设置国内镜像npxnpx不是包管理器而是 npm 自带的包执行器npm ≥5.2不负责安装包到项目 / 全局核心逻辑优先执行项目本地node_modules/.bin的命令执行本地命令安装工具本地不存在 → 临时下载包到缓存、执行执行完自动清理可以指定包版本避免全局包版本污染# 示例临时拉取 create-vite 创建项目不用全局安装 create-vite npx create-vitelatest my-vue-project # 执行项目本地eslint npx eslint src优缺点优点一次性脚手架、临时工具避免全局包污染缺点每次远程拉包会有网络开销可以指定版本npx 重要参数# --no-install禁止自动下载。本地找不到包直接报错安全模式 npx --no-install eslint src # --package手动指定依赖包当命令名和包名不一致时 npx --packagetypescript tsc --version快速选型记忆一次性脚手架 →npx xxx/pnpm dlx xxx调用项目本地工具 →npx xxx测试某个包不同版本 →npx packageversion不信任第三方包 → 加上--no-install场景 1运行脚手架最常用一次性创建项目不需要全局安装脚手架工具用完不留垃圾。# 创建 vite 项目 npx create-vitelatest my-vue-app # 创建 React 项目 npx create-react-app my-react-app # 创建 next 项目 npx create-next-applatest my-next-app # 创建 TS 项目模板 npx create-typescript-app优势不用npm install -g create-vite避免全局脚手架版本老旧、版本冲突。场景 2执行项目本地已安装的工具。项目依赖已经装在node_modules但你不想在package.json#scripts写脚本直接手动调用。# 执行本地 eslint 检查文件 npx eslint src/**/*.ts # 本地 prettier 格式化 npx prettier --write src # 本地 typescript 类型检查 npx tsc --noEmit原理npm run xxx本质内部也是去node_modules/.bin找命令npx可以临时手动调用。场景 3临时运行某个工具测试不同版本。在不改动全局、不改动项目依赖的前提下跑任意版本工具。# 临时用 node 18 执行一段代码指定版本 npx node18 -e console.log(hello) # 临时看指定版本 vue-cli 帮助 npx vue/cli5 --help # 临时打开一个静态文件服务器 npx servelatest非常适合快速验证某个包新版本行为不想安装到全局。场景 4执行 npm 作用域包xxx/yyy。作用域包组织包直接用 npx 调用npx antfu/ni npx nestjs/cli new my-nest场景 5一次性小工具临时执行。各种轻量 cli 工具临时跑一次# 打开 JSON 格式化工具 npx json-server db.json # 图片压缩工具 npx squoosh-cli # 查看包大小 npx package-size react场景 6绕过全局包冲突非常实用。假设你电脑全局装了create-vite4但现在想临时用 create-vite5创建项目会覆盖你全局的 create-vite用完就丢。# 强制拉取 v5不影响全局版本 npx create-vite5 my-projectpnpm (推荐)官网https://pnpm.io/zh/Docshttps://pnpm.io/zh/motivation安装https://pnpm.io/zh/installationpnpm 全称 performant npm意思为 高性能的 npm。pnpm 由 npm/yarn 衍生而来解决了 npm / yarn 内部潜在的 bug极大的优化了性能扩展了使用场景。被誉为 最先进的包管理工具是当前社区首选国内的 Vue / Vite 团队很多都切换到 pnpm。pnpm 核心是全局内容寻址存储 硬链接 / 符号链接。pnpm 原理所有包版本全局只存一份store 目录多个项目复用同一个包项目 node_modules 通过硬链接指向全局 store。严格依赖杜绝幽灵依赖只能导入 package.json 显式声明的包安装速度最快磁盘占用最低原生强力 monorepo workspace现在大厂 monorepo 首选锁文件pnpm 的锁文件是 pnpm-lock.yaml不能和 package-lock.json / yarn.lock 混用重点一个项目只能选一种包管理器。优缺点优点速度快、省磁盘、无幽灵依赖、workspace 好用、兼容 npm 包。缺点极个别工具对 pnpm 的 node_modules 链接模式有兼容问题pnpm 安装包的时候同样有本地项目级和全局之分但是底层实现和 npm 差异很大npm / yarn全局包安装到 Node 安装目录下的node_modulespnpm 全局存储目录是store所有包版本全局只存一份物理文件按文件哈希存储。 查看 store 路径pnpm store pathmacOS/Linux~/.local/share/pnpm/storeWindows%LOCALAPPDATA%\pnpm\store当多个项目安装同一个版本的 react18磁盘只保存一份。项目 node_modules 通过硬链接指向 store 的真实文件硬链接几乎不占用额外磁盘空间。硬链接文件副本指针指向磁盘真实数据多个硬链接共享同一份文件。符号链接软链接类似快捷方式指向路径用于 node_modules 根目录暴露直接依赖。node_modules 目录结构关键解决幽灵依赖node_modules ├── .pnpm/ # 虚拟存储存放所有包直接依赖间接依赖硬链接 │ ├── react18.2.0 │ └── lodash4.17.21 ├── react - .pnpm/react18.2.0/node_modules/react # 符号链接软链接根目录 node_modules只有你 package.json 显式声明的直接依赖符号链接间接依赖全部放在.pnpm内部不会提升到顶层幽灵依赖消失代码不能import没有写在 package.json 的间接依赖不会出现 npm/yarn classic 那种隐性依赖、升级突然炸掉的问题。npm/yarn classic 扁平化会提升依赖可以偷偷引入没声明的子依赖就是幽灵依赖。操作npmpnpm本地安装npm install axiospnpm add axios本地开发依赖npm install -D typescriptpnpm add -D typescript全局安装npm install -g xxxpnpm add -g xxx全局包列表npm list -g --depth0pnpm list -g --depth 0执行本地 CLInpx xxxpnpm exec xxx分类安装命令写入 package.json生效范围生产安装 (--prod) 是否保留典型例子本地生产依赖pnpm add xxx✅ dependencies当前项目✅ 安装vue, react, axios本地开发依赖开发包pnpm add -D xxx✅ devDependencies当前项目❌ 跳过vite, eslint, ts全局包pnpm add -g xxx❌ 不写入整台机器所有目录—不属于项目nestjs/cli本地包生产 开发绑定项目。你把项目丢给别人package.json记录了所有本地包执行 install 就能完整复现环境。开发包是本地包的一种。生产依赖项目跑起来必须有。开发依赖只是帮你构建、检查代码打包完就没用了全局包。绑定电脑。只在你本机生效不跟项目走。全局包主要是提供终端命令不能直接在项目代码里 import代码 import 优先读取项目 node_modules不会读取全局包。最佳实践规则业务代码里 import 用到的库 → 全部是本地生产依赖仅构建、校验、测试工具代码不 import → 全部是本地开发依赖-D需要在任意目录敲 CLI 命令且不属于项目本身 → 全局优先用pnpm dlx代替全局安装减少全局污染永远不要把业务库vue/react全局安装设置国内镜像必做加速下载# 设置 registry pnpm config set registry https://registry.npmmirror.com # 查看当前源 pnpm config get registrypnmp 帮助pnmp -h 用法: pnpm [选项] 命令 命令 access 管理包在仓库上的访问权限与可见性 init 初始化 package.json recursive 在所有子目录项目中并发执行命令 [别名: multi, m] add 添加包依赖 install 安装包 [别名: i] install-test 执行 pnpm install紧接着执行 pnpm test。参数和 pnpm install 完全一致 [别名: it] update 根据指定版本范围将包更新到最新版本 [别名: up, upgrade] outdated 检查已安装包与 GitHub Actions 依赖是否存在新版本 audit 检查已安装包的已知安全漏洞 change 记录变更意图标记本次改动影响哪些包、每个包的版本升级类型以及将写入更新日志的摘要 version 应用已记录的变更意图pnpm version -r lane 管理分轨发布通道 bugs 在默认浏览器打开包的 bug 跟踪地址 [别名: issues] list 列出已安装的包 [别名: ls] ll 以详细格式列出已安装包 [别名: la] licenses 检查已安装包的许可证信息 [别名: licences] why 查看依赖该包的上游包查询这个包是谁引入的 view 查看远程仓库上包的信息 [别名: info, show, v] sbom 生成软件物料清单SBOM whoami 显示当前登录到 pnpm 仓库的用户名 deprecate 将仓库上某个包版本标记为废弃 undeprecate 取消包版本的废弃标记仅对已标记废弃的版本生效 unpublish 从仓库移除指定包 star 收藏一个包 unstar 取消包收藏 stars 列出指定用户收藏的所有包 dist-tag 管理包的发布标签 [别名: dist-tags] ping 测试与配置的镜像仓库连通性 doctor 对当前 pnpm 安装环境做诊断检查 search 在仓库搜索包 [别名: s, se, find] rebuild 重新编译包 [别名: rb] pack 生成包的 tar 压缩包 publish 将包发布到仓库 stage 预打包待发布包把二次验证2FA延迟到后续操作 remove 从 node_modules 和 package.json 删除包 [别名: uninstall, rm, un, uni] patch 准备对第三方包打补丁 patch-commit 根据目录改动生成补丁文件 patch-remove 删除已存在的补丁文件 peers 检查未满足或缺失的对等依赖(peerDependencies)问题 set-script 在 package.json 中设置脚本 [别名: ss] test 执行 package.json 里定义的 test 脚本 run 执行 package.json 中定义的脚本 pipeline 以 CI 的方式执行命名的工作流任务冻结锁文件安装、基于基线筛选变更包、按依赖拓扑执行任务并缓存结果失败不终止 exec 在当前项目环境中执行 shell 命令 dlx 在临时环境中运行包 create 使用 create-* 脚手架模板新建项目 completion 输出 shell 自动补全脚本 start 执行 package.json scripts.start 里的命令 stop 执行 package.json scripts.stop 脚本如有定义 restart 重启项目依次执行 stop、restart、start 脚本以及对应的前置/后置脚本 find-hash 根据文件哈希列出包含该文件的包 runtime 管理运行时 [别名: rt] env 管理 Node.js 版本。已废弃推荐使用 pnpm runtime shim 为未全局安装的包创建上下文感知的命令垫片由项目决定使用哪个版本 bin 打印 pnpm 存放可执行脚本的目录 clean 安全删除当前项目或所有工作区子项目的 node_modules不会跟随 NTFS 链接进入目标目录。如果 package.json 存在 clean 脚本则内置命令会被覆盖 purge clean 的别名行为一致区别是当 package.json 存在 purge 脚本时会覆盖内置命令 ci 先 clean再执行带锁文件冻结模式的 install [别名: clean-install, ic, install-clean] root 打印 node_modules 的实际目录路径 prefix 打印当前包所在根目录 config 管理 pnpm 配置文件 [别名: c] get 获取指定配置项的值是 pnpm config get 的简写 set 设置指定配置项的值是 pnpm config set 的简写 pkg 管理 package.json 文件 pack-app 将 CommonJS 入口文件打包为多平台独立可执行程序 store 管理包全局存储目录 cache 查看与管理元数据缓存 cat-file 根据索引文件里存储的哈希打印文件内容 cat-index 打印全局存储中指定包的索引文件 ignored-builds 打印被禁止执行构建脚本的包列表 approve-builds 允许依赖包在安装阶段执行构建脚本 link 将本地包链接为项目依赖 [别名: ln] import 从外部锁文件生成 pnpm-lock.yaml dedupe 在锁文件中对依赖做去重优化 deploy 从工作区发布部署包 prune 移除多余无用的依赖包 fetch 根据锁文件把包下载到虚拟存储目录 unlink 取消本地包链接重新安装线上版本 [别名: dislink] docs 在浏览器打开包的文档主页 [别名: home] repo 在浏览器打开包的代码仓库地址 self-update 更新 pnpm 到最新版本或指定版本 setup 初始化配置 pnpm login 登录 npm 镜像仓库 [别名: adduser] team 管理组织团队与团队成员 owner 管理包的所有者 [别名: owners] logout 退出 npm 镜像仓库登录 with 单次调用使用指定版本 pnpm或当前版本忽略项目 packageManager 和 devEngines.packageManager 配置 edit pnpm 未实现该命令请直接使用 npm CLI profile pnpm 未实现该命令请直接使用 npm CLI token pnpm 未实现该命令请直接使用 npm CLI xmas pnpm 未实现该命令请直接使用 npm CLI help 打印本帮助信息或指定子命令的帮助文档 选项 -v, --version 打印 pnpm 版本号 --color[COLOR] 强制开启彩色输出 -y, --yes 所有交互提示自动选择 yes -C, --dir DIR 设置工作目录。可放在子命令前后任意位置和其他全局配置参数一样 [默认值: .] --store-dir DIR 创建包全局存储的目录。相对路径基于工作区根目录解析非工作区场景基于 --dir 目录解析 --state-dir DIR pnpm 存放本机持久化状态文件的目录 --npmrc-auth-file NPMRC_AUTH_FILE 指定 .npmrc 认证文件路径覆盖默认 ~/.npmrc [别名: --userconfig] --registry REGISTRY 解析和下载包的仓库基础地址。全局通用配置参数可作用于所有命令多层配置会合并部分自带 --registry 参数的命令也会读取该配置 --https-proxy HTTPS_PROXY HTTPS 仓库与压缩包请求的代理地址 --http-proxy HTTP_PROXY HTTP 仓库与压缩包请求的代理地址 --no-proxy NO_PROXY 不使用代理访问的主机列表 -r, --recursive 在工作区的所有项目执行命令而不仅仅是 --dir 指定的项目 --reporter REPORTER 输出日志格式 [默认值: default] [可选值: default, append-only, ndjson, silent] --loglevel LOGLEVEL 设置日志输出级别。等同于 pnpm 全局 --loglevel 参数silent 会强制使用静默输出覆盖 --reporter其他级别限制默认日志输出 [可选值: silent, error, warn, info, debug] -F, --filter FILTER 筛选工作区中需要执行命令的项目。可多次使用叠加筛选条件。支持名称匹配(scope/*)、路径(./pkg)、依赖查询(foo...)、排除(!bar)、目录({dir})、变更基线查询([since]) --filter-prod FILTER_PROD 类似 --filter但筛选时只追踪生产依赖 -w, --workspace-root 在工作区根项目执行命令 --fail-if-no-match --filter / --filter-prod 没有匹配任何项目时退出码置为1 --include-workspace-root recursive 递归命令也会包含根项目run / exec / add / test 默认不会包含根项目 --no-include-workspace-root 递归命令排除根项目覆盖 includeWorkspaceRoot: true 配置 --test-pattern TEST_PATTERN 匹配测试文件的 glob 规则用于 --filter 的 [since] 判断哪些改动算作测试变更 --changed-files-ignore-pattern CHANGED_FILES_IGNORE_PATTERN glob 规则忽略 --filter [since] 检测变更时不需要关注的文件 --sort 工作区项目按依赖拓扑顺序执行 --no-sort 不做拓扑排序按工作区定义顺序执行 --reverse 逆序处理工作区项目 --workspace-concurrency WORKSPACE_CONCURRENCY 工作区项目最大并行执行数量 --parallel 在所有选中项目并发执行脚本忽略依赖拓扑顺序 --stream 实时输出每个子项目日志每行附带项目前缀 --aggregate-output 等待脚本执行完毕后一次性输出全部日志块 --use-stderr 将日志输出定向到 stderr把 stdout 留给命令本身输出结果 --ignore-workspace 忽略上层 pnpm-workspace.yaml当作独立单项目运行 --workspace-packages WORKSPACE_PACKAGES glob 规则用于选定工作区项目覆盖 pnpm-workspace.yaml 的 packages 配置可多次配置 -h, --help 打印帮助文档使用 --help 查看更详细内容核心命令清单和 npm 几乎对齐npm install -g pnpm # 安装 pnpm pnpm -v # 查看版本 pnpm install # 安装项目全部依赖读取 package.json pnpm add axios # 添加生产依赖等价 npm install xxx pnpm add -D vite # 添加开发依赖devDependencies pnpm add vue3.4 # 添加指定版本 pnpm remove axios # 卸载包 pnpm run dev # 执行 package.json scripts等价 npm run dev pnpm dev # 简写脚本只有一个词时可以省略 run pnpm test pnpm start pnpm stop pnpm restart pnpm exec cmd # 在当前项目node_modules上下文执行shell命令 # pnpm dlx npx pnpm dlx create-vitelatest my-app # 临时执行包等价 npx重点 pnpm ls # 查看已安装依赖树 pnpm prune # 清理未使用依赖 pnpm update # 更新包 pnpm update vuelatest # 1. 初始化项目 pnpm init # 2. 添加依赖 pnpm add axios pnpm add -D vite # 3. monorepo场景只给 packages/utils 添加依赖 pnpm -F utils add lodash # 4. CI安装 pnpm ci # 5. 查看是谁引入lodash pnpm why lodash # 6. 临时运行脚手架 pnpm dlx create-vite命令别名说明pnpm init-生成 package.jsonpnpm installpnpm i安装项目所有依赖pnpm add pkg-添加依赖默认 dependenciespnpm add -D→ devDependenciespnpm remove pkgrm / un / uninstall删除包同时移除 package.json 声明pnpm updateup / upgrade更新包版本pnpm listls列出已安装包pnpm ll/la详细长格式pnpm outdated-检查哪些包有新版本pnpm audit-安全漏洞扫描pnpm prune-删除多余、未被引用的包pnpm rebuildrb重新编译原生模块node-gyp 类pnpm dlx-临时下载并执行包不安装到本地 / 全局替代 npxpnpm create-直接调用 create-xxx 脚手架pnpm create viteCI 专用pnpm ci等价 clean installlockfile 严格冻结不改动锁文件生产 CI 推荐别名ic / clean-installcnpm不是独立包管理器只是 npm 的一层封装脚本阿里早期开发。本质 npm 自动切换淘宝镜像源用来加速国内下载。旧地址registry.npm.taobao.org废弃新镜像https://registry.npmmirror.com# 全局安装 cnpm npm install -g cnpm --registryhttps://registry.npmmirror.com cnpm install注意事项cnpm 默认生成cnpm-lock.yaml不会更新 package-lock.json团队协作版本不一致风险大底层仍然调用 npm没有 pnpm/yarn 的性能优化不推荐新项目使用 cnpm推荐做法直接修改 npm / pnpm / yarn 的 registry 镜像源不用装 cnpm。优缺点优点一键切换国内源。缺点锁文件不一致无性能提升属于过时方案yarnYarnYet Another Resource Negotiator是 MetaFacebook推出当初为了解决早期 npm 的稳定性、锁文件问题分两个版本Yarn Classic(v1)/Yarn Berry(v2)Yarn Berry 也叫 Yarn Modern支持 PnPPlugnPlay不再使用 node_modules。Yarn Berry (v2 / v3 / v4)默认PnP 模式不生成 node_modules通过 zip 直接读取包节省大量磁盘可开启 node_modules 兼容模式锁文件yarn.lock严格依赖无幽灵依赖monorepo 能力很强注意Yarn 和 npm lock 文件不能混用。优缺点优点v1 历史稳定Berry PnP 省磁盘monorepo 强大缺点v1 已逐步淡出PnP 模式对部分老工具、插件兼容性坑多现在新项目优先 pnpm2、nodejs 版本管理工具fnm vs nvmnode version manager对比维度fnmnvm语言Rust 二进制Shell 脚本终端启动速度⚡极快慢每次启动执行脚本Windows 支持✅原生支持❌原版不支持要用 nvm-windows自动切换✅内置--use-on-cd需要额外插件文件兼容.node-version/.nvmrc.nvmrc推荐人群Windows / Mac / Linux追求终端速度老 Linux 项目习惯 nvmnvm (Node Version Manager)nvm 是 Node Version Manager 的简称是 Node.js 版本管理工具专门解决多项目 Node 版本冲突问题。类似 conda 管理 python 环境。核心作用一台 Mac 同时安装多个 Node.jsNode14/16/18/20/22 共存一键切换当前终端使用的 Node 版本每个 Node 环境独立隔离npm 全局包互不干扰避免系统自带 Node /brew 安装 Node 带来的权限报错、版本锁定问题和直接 brew install node 的区别brew同一时间只能存在一个 Node多项目版本冲突无解nvm多版本自由切换前端开发标准方案安装步骤Mac zsh前置依赖xcode-select --install一键安装 nvmcurl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash写入 zsh 配置关键否则重启终端 nvm 失效echo export NVM_DIR$HOME/.nvm [ -s $NVM_DIR/nvm.sh ] \. $NVM_DIR/nvm.sh [ -s $NVM_DIR/bash_completion ] \. $NVM_DIR/bash_completion ~/.zshrc # 生效配置 source ~/.zshrc # 验证是否安装成功 nvm --version输出版本号即代表正常。查看本地已安装的 Node命令nvm ls输出说明- v20.16.0当前终端正在使用的版本default - lts/* (- v20.16.0)全局默认版本带* 默认查看可安装的 Node 版本查看所有线上版本nvm ls-remote只看长期稳定版 LTS开发推荐nvm ls-remote --lts安装 Node.js安装最新 LTS 稳定版日常首选nvm install --lts安装指定大版本nvm install 20 # 安装 Node20nvm install 18 # 安装 Node18精确指定小版本nvm install 16.20.0切换 Node 版本临时切换仅当前终端窗口有效重启失效nvm use 18nvm use lts设置全局默认版本新开终端自动加载nvm alias default 20 # 将 Node20 设为默认nvm alias default lts # 将最新LTS设为默认查看当前正在使用的版本nvm currentnode -vnpm -v卸载不需要的 Node 版本nvm uninstall 16 # 卸载 Node16注意不能卸载当前正在 use 的版本需先切换到其他版本再删。全局包迁移。每个 Node 版本的 npm 全局包是隔离的比如 pnpm、yarn、typescript 不会跨版本共用。全局包迁移 可以实现 不同 Node 共享工具。nvm reinstall-packages 18 # 把当前版本全局包复制到 Node18npm i -g pnpm yarn typescript vite vue/cli # 推荐全局 (任意 Node 安装一次即可迁移)项目自动匹配 Node 版本。无需手动 nvm use。1项目根目录创建.nvmrc文件。指定本项目使用 Node20echo 20 .nvmrc2进入项目目录自动切换nvm use常用命令# 基础信息 nvm --version # 查看nvm版本 nvm current # 当前node版本 nvm ls # 本地已装node列表 nvm ls-remote --lts # 线上所有LTS版本 # 安装卸载 nvm install --lts # 安装最新稳定版 nvm install 18.18.2 # 安装指定版本 nvm uninstall 16 # 删除版本 # 版本切换 nvm use 18 # 临时切换 nvm alias default 20 # 设置全局默认 # 包迁移 nvm reinstall-packages 18 # 复制全局依赖到其他版本nvm install 8.0.0 # 安装指定精确版本号 nvm use 8.0 # 切换使用 8.0 系列下最新的小版本8.0.x 最高版 nvm run 6.10.3 app.js # 用 node 6.10.3 直接运行 app.js nvm exec 4.8.3 node app.js # 临时把环境PATH指向4.8.3执行 node app.js nvm alias default 8.1.0 # 设置终端默认 node 版本为 8.1.0 nvm alias default node # 设置终端默认始终为本地已安装的最新 node 正式版 nvm install node # 安装当前最新的 Node 正式版 nvm use node # 切换使用本地已装的最新 Node 正式版 nvm install --lts # 安装最新长期支持稳定版LTS nvm use --lts # 切换使用本地已装的最新 LTS 稳定版 nvm set-colors cgYmW # 自定义 nvm 命令行文字配色青、绿、粗黄、品红、白切换 node 后全局命令找不到各 Node 环境隔离执行nvm reinstall-packages 目标版本迁移工具。之前用 brew 装过 node和 nvm 冲突先卸载 brew 的 nodebrew uninstall --ignore-dependencies nodebrew autoremovewindows 中 nvmC:\nvm -h Usage: nvm command [flags] Node Version Manager for Windows v2.0.0 (Community Edition). Flags: -h, --help Show context-sensitive help. -v, --version Display the version of nvm. Commands: install (i,add) Install one or more Node.js versions. uninstall (rm,un) Uninstall one or more Node.js versions. use Switch the default Node.js version. pin Pin project Node.js version (ex: write .nvmrc). list (ls) List the installed/available Node.js versions. alias Manage Node.js version aliases. default Show the default version. env Display nvm environment details. cache View and manage the nvm cache. config (cfg) View and manage the nvm configuration. on Manage Node.js with nvm. off Stop managing Node.js with nvm. Run nvm command --help for more information on a command. Additional help available at https://docs.nvm-windows.comfnm (Fast Node Manager)Fnm (Fast Node Manager) 是一个快速而简单的 Node.js 版本管理工具使用 Rust 编写。跨平台支持macOS、Windows、Linux。对标 nvmnode version manager主打更快启动、切换速度。githubhttps://github.com/Schniz/fnm核心特点Rust 单二进制文件没有 shell 脚本终端启动极快远快于 bash 版 nvm稀土掘金全平台支持macOS / Linux / WindowsPowerShell / CMD原生支持 Windows这点比原版 nvm 强很多支持自动版本切换进入项目目录读取.node-version/.nvmrc自动切 Node 版本兼容 nvm 的配置文件迁移成本低支持国内镜像加速下载 Node性能对比nvm 每次打开 shell 都会加载脚本拖慢终端fnm 采用懒加载打开终端几乎无感。安装 fnmmacOS# brew推荐 brew install fnm # 脚本安装 curl -fsSL https://fnm.vercel.app/install | bashLinuxcurl -fsSL https://fnm.vercel.app/install | bashWindowsPowerShell# winget 推荐 winget install Schniz.fnm # 脚本 iwr -useb https://fnm.vercel.app/install | iex配置 shell关键不配置无法自动生效安装后必须在 shell 配置文件写入环境加载zshmacOS 默认~/.zshrceval $(fnm env --use-on-cd)bash~/.bashrceval $(fnm env --use-on-cd)PowerShell$PROFILEfnm env --use-on-cd | Out-String | Invoke-Expression--use-on-cd开启进入目录自动切换 Node 版本最常用重启终端验证fnm --version常用命令# 查看已安装 Node 版本 fnm list # 查看远程可安装版本 fnm list-remote # 安装最新 LTS fnm install --lts # 安装指定大版本/精确版本 fnm install 20 fnm install 20.14.0 # 切换到某个版本当前shell生效 fnm use 20 # 设置全局默认 Node 版本新开终端默认用这个 fnm default 20 # 查看当前正在使用的 node fnm current # 删除本地某个 node 版本 fnm uninstall 18 # 创建别名 fnm alias lts20 20.14.0项目自动切换 Node在项目根新建.node-version文件写入20.14.0之后cd进入该目录fnm 自动执行fnm use切换对应 Node。设置国内镜像加速 Node 下载# 环境变量写入shell配置 export FNM_NODE_DIST_MIRRORhttps://npmmirror.com/mirrors/node