文章目录
- 什么是Volta
- 下载volta
- 注意安装过node.js的一定要先卸载,不然会有路径冲突等问题
- VOLTA_HOME对应的目录要是非管理员目录
- 设置 系统环境变量VOLTA_HOME=D:\DevTools\volta
- 官方推荐msi安装包
- volat -v 查看有没有成功
- 命令
- install
- 项目固定版本pin
- Volta 是 目录级别生效
- 查看版本与切换
- 卸载node或工具
- 手动下载node包,让volta管理
- 全局安装 局部安装
- npm缓存
- nvm
- 注意安装过node.js的一定要先卸载,不然会有路径冲突等问题
- 安装页面的路径不要选择需要管理员权限的目录,在用户可写目录,这样就完全不用管理员权限打开cmd
- nvm下的全局安装
- .npmrc 配置文件中,prefix 和 cache,决定了 npm 如何存放全局工具和下载过的包资源
- 局部安装/全局安装
- npm install = 给当前项目装依赖,默认装进当前项目根目录的 node_modules
- 自己下载了nodejs的压缩包怎么让nvm管理
- Node 通常自带 npm,但 npm 可以独立升级;nvm 主要围绕 Node 管理 npm,Volta 则能更明确地把 Node 和 npm 分开管理
什么是Volta
下载volta
注意安装过node.js的一定要先卸载,不然会有路径冲突等问题
VOLTA_HOME对应的目录要是非管理员目录
设置 系统环境变量VOLTA_HOME=D:\DevTools\volta
官方推荐msi安装包
再用 MSI 安装 → 这时 Volta 会自动用 D 盘路径
Volta Windows Installer
下载 .msi 文件后直接双击安装
volat -v 查看有没有成功
命令
install
项目固定版本pin
只在该项目生效
Volta 是 目录级别生效
查看版本与切换
卸载node或工具
手动下载node包,让volta管理
没试过不知道可行不,这里有手动的教程
全局安装 局部安装
VOLTA_HOME 是 Volta 统一存放所有运行环境、全局工具和代理快捷方式的物理根目录(默认在 ~/.volta 或
C:\Users<用户名>\AppData\Local\Volta) VOLTA_HOME = Volta 的总仓库(包含所有 Node
镜像、下载缓存和统一的 $VOLTA_HOME/bin 出口在 Volta 的设计规范里,volta install 专门用来安装全局工具和配置全局环境;而安装到项目局部,必须回归使用包管理器本身(如
npm / pnpm / yarn) Volta 从设计上就明确划分了职责边界:全局层(Global Tools & Runtimes)
→ \rightarrow→归 volta 管volta install node@20→ \rightarrow→设置全局默认 Node
版本volta install typescript→ \rightarrow→全局安装 CLI 工具(任何地方都能敲
tsc)项目局部层(Project Dependencies)→ \rightarrow→归 npm / pnpm / yarn 管npm
install express→ \rightarrow→安装项目生产依赖(写入 package.json 的
dependencies)npm install -D typescript→ \rightarrow→安装项目开发依赖(写入
devDependencies,位于局部的 ./node_modules) 当你敲下 npm install 时:Volta 的代理机制会感知当前项目 package.json 里的 “volta” 锁定的 Node/npm 版本。
它会自动切换到那个版本的 npm 引擎去执行安装。
包会被精准安装在当前项目的 ./node_modules 目录下,绝不会跑到全局的 VOLTA_HOME 里。
如果你想为当前项目指定/锁定使用哪一个 Node 或 npm 版本,不要用 volta install,而是用 volta pin
#锁定当前项目使用 Node 20.19.6 volta pin node@20.19.6 # 锁定当前项目使用 npm 10.8.2 volta pin npm@10.8.2在普通环境或 NVM 中,我们习惯敲 npm install -g typescript。但在 Volta 体系下,强烈推荐使用 volta
install typescript 如果你用 npm install -g: 它是由 当前激活的那个 npm 去执行安装的。
全局工具会强行绑定在“你当前使用的 Node 版本”目录下。
Node.js 和 npm 在物理上是强绑定的!
当你下载任何一个版本的 Node.js(比如 Node v20.19.6)时,官方安装包里自带了一个特定版本的 npm(比如 npm v10.8.2)。
Volta 的工作原理,是把官方的 Node.js 压缩包下载下来,原封不动地解压到 $VOLTA_HOME/tools/image/node/20.19.6/ 这个镜像文件夹里。
只要你运行原生 npm 命令,npm 默认的行为逻辑就是把全局包写进它自己所在的那套 Node 版本的根目录下
致命痛点:当你切换到另一个项目的 Node 版本时,之前 npm -g
安装的工具可能会因为底层 Node 版本不兼容而报错,或者直接“找不到命令”。 在 Volta 环境下,如果你执行了传统的 npm
install -g ,这个包会被安装到 Volta 为当前 Node 版本所构建的私有镜像目录(Image
Directory)中物理路径 = $VOLTA_HOME/tools/image/node/当前Node版本/node_modules \text{物理路径} = \text{\$VOLTA\_HOME/tools/image/node/当前Node版本/node\_modules}物理路径=$VOLTA_HOME/tools/image/node/当前Node版本/node_modules
当前 Node 是 v20.19.6 ──> 你敲 npm install -g typescript
└─> 物理装到了: VOLTA_HOME/tools/image/node/20.19.6/…切换到项目 A (指定 Node v18) ──> 敲 tsc 运行
└─> 💥 报错或找不到 tsc!
失效原理:
作用域死锁:用 npm -g 安装的包,其物理源码和可执行脚本强行绑私在了 Node v20.19.6 的镜像文件夹内。
代理断链:Volta 的 Shim 垫片(位于 $VOLTA_HOME/bin)根本不知道你通过 npm -g 偷偷装了个新工具,因此它不会在 $VOLTA_HOME/bin 目录下为你创建全域代理快捷方式。
当你切到别的 Node 版本或离开当前会话时,系统就彻底找不到这个命令了
如果你敲的是 npm install -g typescript
干活的主体是 npm。
npm 只是 Node.js 自带的一个普通脚本。当它执行 -g 时,它会遵循它诞生第一天起就写死的底层逻辑:“把我收到的包,扔到我现在这个 Node 版本的 node_modules 文件夹里。”
此时 Volta 只是在旁边看着,并没有干涉 npm 的内部行为。所以,这个包被 npm 强行锁死在了当前 Node 版本的物理镜像内部
如果你敲的是 volta install typescript
干活的主体变成了 Volta 引擎本身(Rust 编写的系统级程序)。
Volta 会拦截这次安装请求,它会绕过 npm 的默认全局路径,做两件黑科技事情:
独立抽离:把 typescript 的源码下载并存放在一个独立的文件夹中(例如V O L T A H O M E / t o o l s / i m a g e / p a c k a g e s / t y p e s c r i p t ),不和任何特定的 N o d e 版本混住。注入全域代理( S h i m ):在系统的 P A T H 目录( VOLTA_HOME/tools/image/packages/typescript),不和任何特定的 Node 版本混住。 注入全域代理(Shim):在系统的 PATH 目录(VOLTAHOME/tools/image/packages/typescript),不和任何特定的Node版本混住。注入全域代理(Shim):在系统的PATH目录(VOLTA_HOME/bin)下生成一个名为 tsc 的代理小文件
npm缓存
Volta → 决定“这次用哪个 npm 版本”
npm → 自己读取 npm 配置 → 决定 cache 在哪里
npm config get cache → 查询“当前这个 npm 最终解析出来的 cache”
npm 缓存通常可以被不同 Node/npm 版本共用;Volta 或 nvm 只是决定“现在运行哪个 Node/npm”,缓存目录本身是 npm 自己的。
不同 npm 版本共用同一个 cache 没问题
nvm
nvm管理node.js版本的工具,由于下载node.js时,会自动下载npm,所以间接管理了npm
注意安装过node.js的一定要先卸载,不然会有路径冲突等问题
https://blog.csdn.net/weixin_57844432/article/details/127788884
使用 3)https://github.com/coreybutler/nvm-windows/releases 地址,下载xx.zip
| 变量 | 作用 |
|---|---|
| NVM_HOME | nvm 的根目录,存放 nvm.exe 和管理文件。比如:你以后卸载 nvm 就看这个文件夹。 |
| NVM_SYMLINK | Node.js 的“实际使用目录”,也就是node.exe放在哪。nvm 切换 Node 版本时,会通过这个目录来更新 PATH 指向的 Node。 |
安装时,nvm 会自动把这两个目录加到 环境变量 PATH 中,并且自动设置NVM_HOME,NVM_SYMLINK2个键值对的环境变量
所以你在 PowerShell / CMD 中输入 node 就能识别。
安装页面的路径不要选择需要管理员权限的目录,在用户可写目录,这样就完全不用管理员权限打开cmd
NVM_HOME的路径就是2)对应的可以设置为D:Soft\NVM\nvm
NVM_SYMLINK的路径就是3)对应的可以设置位D:Soft\NVM\nvm\nodejs
D盘下的program files也不行
nvm下的全局安装
在 nvm 下,“全局安装”并不是全系统的,而是“当前 Node 版本的全局”
即“全局安装是『每个 Node 版本一份』”
在 nvm 中,“全局安装”只对当前 Node 版本有效
切 Node = 换一套全局工具
.npmrc 配置文件中,prefix 和 cache,决定了 npm 如何存放全局工具和下载过的包资源
npm 的配置文件(.npmrc)分为两个层级:
项目级:当前项目根目录下的 .npmrc。
用户全局级:位于你用户主目录下的文件(Windows 在 C:\Users<用户名>.npmrc,Linux/macOS 在~/.npmrc)。
在 NVM 环境下,如果不手动修改 prefix,它的默认路径直接挂载在各自 Node 版本安装根目录的子路径下。
当你切换 Node 版本时,npm config get prefix 会随着当前激活的版本动态改变:
当你执行
npm install -g <package>时,npm 实际上在后台分两步写入文件,这两步分别用到了这两个路径:
写源码:把该工具的源码和依赖下载并解压到npm root -g对应的文件夹中(即 node_modules)。
生成快捷可执行命令:在prefix根目录下生成可执行脚本/软链接(Windows 下是 .cmd / .ps1 文件,Linux/macOS 下是 bin/ 目录里的 symlink),这样你才能在终端里直接敲命令运行它
prefix 是根目录,npm root -g 是放包的 node_modules 文件夹。
prefix 是全局环境的根目录,而 npm root -g 是这个根目录里专门用来存放全局代码包的文件夹
系统要在终端里执行命令行工具时,去 prefix 找(PATH 对应的目录)。
Node.js 要加载包的源码时,去 npm root -g 找。
prefix 目录(或其下的 bin 目录)必须被包含在系统的 PATH 环境变量中,全局安装的 CLI 命令才能在终端里直接敲出来
下面的配置直接写入用户全局级的 .npmrc 文件中。
npm config set prefix "D:\npm-global"npm config set cache "D:\npm-cache"
因为这个 .npmrc 文件对你电脑上的所有 Node 版本是共享的,所以无论你切换到 Node 18、Node 20 还是 Node 22,npm 都会去读取同一个 .npmrc,强制把所有 npm install -g 的包全部下载到你指定的目录里
cache 共用,通常没什么问题
npm 的默认缓存本来就是用户级的:%LocalAppData%\npm-cache
也就是说不同 Node/npm 版本本来就常常共用一个缓存目录。你改成:D:\npm-cache
也是很正常的
但 prefix 共用要谨慎
prefix 决定:npm install -g xxx
把“全局包”装到哪里。npm 官方说明,全局安装就是装到 prefix 对应的位置
如果你设:prefix=D:\npm-global
那么多个 Node 版本就都会看到同一个全局 npm 工具目录:
Node 20 ─┐
Node 22 ─┼→ D:\npm-global
Node 24 ─┘
这在技术上能做到,但 nvm-windows 官方并不推荐把不同 Node 版本的全局模块强行共用
因为某些全局包:
- 依赖特定 Node 版本
- 带 native module
- 不同 Node ABI 不兼容
- 一个 Node 版本升级包后,可能导致旧 Node 不能用了
nvm-windows 官方说明,默认情况下不同 Node 版本的 global npm modules 就是不共享的,并且维护者也明确说“没有一种可靠的方式可以让不同 Node 版本安全共用所有
global modules”。
所以我建议你这样分:
cache
→ 可以统一放 D:\npm-cache
→ 推荐
prefix
→ 可以统一放 D:\npm-global
→ 但如果你经常切换跨度较大的 Node 版本,要谨慎
另外,修改 prefix 后别忘了把:
D:\npm-global
加入 Windows 的 PATH,否则你虽然安装成功了,直接输入:
xxx
Windows 可能找不到这个命令。npm 官方的 Windows 文档也特别提醒了 prefix 和 PATH 要对应。
NVM 默认不会按 Node 版本隔离缓存,所有版本的 npm 和 npx 均共享同一个系统全局缓存目录。
npm config get prefixnpm config get cache
| 操作 | 全局安装路径 (prefix) | 缓存路径 (cache) |
|---|---|---|
| 查看 | npm config get prefix | npm config get cache |
| 设置 | npm config set prefix “自定义路径” | npm config set cache “自定义路径” |
,prefix 和 cache 是两个非常核心的路径设置,它们决定了 npm 如何存放全局工具和下载过的包资源
npm 缓存通常可以被不同 Node/npm 版本共用;Volta 或 nvm 只是决定“现在运行哪个 Node/npm”,缓存目录本身是 npm 自己的。
不同 npm 版本共用同一个 cache 没问题
局部安装/全局安装
当你在 PowerShell 或终端里直接敲一个命令(例如 tsc)时,操作系统只会在系统的全局环境变量 PATH
所包含的目录里去找这个可执行文件。全局安装(-g)时:npm 会把可执行脚本直接塞进系统的 PATH 目录里,所以操作系统能直接认出 tsc。
局部安装时:可执行脚本被放在你当前项目的 ./node_modules/.bin/ 目录下。系统的 PATH
默认是不包含你当前项目的文件夹的,所以操作系统会直接报错:tsc : 无法将“tsc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称…
npm install = 给当前项目装依赖,默认装进当前项目根目录的 node_modules
npm install 就是装到当前项目根目录的 node_modules 里
自己下载了nodejs的压缩包怎么让nvm管理
把对应的.zip压缩包放到NVM_HOME对应的目录下,解压,然后把文件夹的名字改成v版本号,此时nvm list就可以看到这个版本了
Node 通常自带 npm,但 npm 可以独立升级;nvm 主要围绕 Node 管理 npm,Volta 则能更明确地把 Node 和 npm 分开管理
nvm → 核心是管理 Node 版本 → npm 通常跟着每个 Node 安装 → 但当前 Node 的 npm 可以单独升级
而: Volta → 明确把 Node、npm、Yarn 等都作为 tool 管理 → Node 和 npm 可以分别选择版本 而且
Volta 还有一个很能说明这个关系的参数: volta run --bundled-npm … 意思是: 不用我另外选择的
npm,强制使用这个 Node 原本捆绑的 npm
Node.js 是运行 JavaScript 的程序,npm 是安装 JavaScript 包的工具。安装 Node.js
时通常会顺便带一个 npm,所以看起来它们像绑定在一起,但其实 npm 可以单独升级。nvm 主要用来切换不同 Node 版本,因此 npm
往往跟着对应的 Node 一起变化;Volta 则可以更明确地分别管理 Node 和 npm 的版本。
Node.js
= 运行 JavaScript
npm
= 安装/管理包
Node 安装包
= 通常顺便带一个 npm
nvm
= 主要切 Node 版本
Volta
= 可以分别管 Node 和 npm
npm cache
= npm 自己的缓存
= npm config get cache