个人文档
  • AI编程Cursor
  • GPT使用笔记
  • npm常用库合集
  • 同步用
  • 小Demo们
  • 工具网站教程集合
  • HTML、CSS 工具方法集合
    • HTML 全局属性
    • css常用功能
    • font-face 字体|子集相关
    • iframe父子页面传值
    • input输入优化
    • loading状态
    • nodejs使用谷歌邮箱发邮件
    • 为 Dom 自定义事件监听
    • 初始html的head标签配置
    • 拼音输入中文汉字的事件监听
    • 文字颜色效果
    • 文档片段范围 Range
    • 移动端开发-rem
    • 等宽字体推荐
    • 网站SEO优化注意点
    • 邮件html模板
  • JS 工具方法集合
    • Axios 简单使用
    • Axios 简单封装
    • Gitbook的安装和使用
    • Github 登录开发
    • HTML转为纯文本
    • JS 中强大的操作符
    • cookie 操作
    • js 动态加载js资源
    • js 常用功能语句
    • js取代trycatch的方法封装
    • js接口下载二进制
    • script 标签的异步属性
    • 判断当前是移动端还是pc端
    • 刷新token队列管理
    • 前端多线程 Web Worker
    • 加密-AES对称加密
    • 加密-node进行rsa加密解密
    • 地区省市区三级联动的地址数据 + 功能
    • 复制插件
    • 开发时环境变量
    • 得到随机图片
    • 数字格式整理集合
    • 数学计算插件
    • 时间格式整理
    • 获取ip地址
    • 获取url传参
    • 进制转换和位运算符
    • 页面隐藏|激活|关闭的监听
  • JS 知识点研究
    • Babel 历史和原理
    • Babel 配置和使用
    • Function 的 apply、call、bind
    • HTTP浏览器缓存粗解
    • Source map 文件还原为源码
    • TS常用技巧
    • js 的加载和模块化
    • js 的新数据类型 Symbol
    • js的代理对象 proxy 和 defineProperty
    • js的原型链 prototype
    • vite 打包体积优化
    • webpack 可视化打包文件大小插件
    • webpack 基础使用配置
    • webpack 版本5的报错
    • yeoman 开发脚手架的工具
    • 同步异步和微任务宏任务
    • 移动端调试---谷歌工具+eruda+vconsole
    • 转换-Blob URL
    • 转换-FileReader
    • 转换-Js文件类型和转换
    • 转换-前端开发的URL的编码和解码
    • 转换-字符串和Base 64的转换
  • Node 和 Npm 相关
    • Node 开发环境配置
    • express + jwt 校验
    • node 常用方法
    • node后台服务器-PM2
    • node基本使用
    • npm 中依赖的版本问题
    • npm 功能使用
    • npm指令说明和其他对比
    • nvm版本管理+自动切换node版本
  • React 学习
    • React Hook
    • React 项目基础开发
    • React.memo 和 React.PureComponent
    • React懒加载进阶
    • useContext Hook
    • useEffect Hook
    • useMemo 和 useCallback - Hook
    • useRef Hook
    • useState Hook
    • 同步修改变量功能封装 useVal for react
    • 轻便的传值组件
  • Rust 语言相关
    • Rust 基本
    • Rust 基础学习
    • Rust 调用 Object-C 的API
    • Tauri 基本使用
    • Tauri 是什么
  • VUE 学习
    • Vue3 使用
    • Vue3使用hook
    • Vue开发小技术点
    • vue路由切换时的动画效果
    • 花式引入组件和资源-打包时拆包减少js体积
  • Web3相关
    • Web3.0开发上-准备和概念理解
    • Web3.0开发下-功能代码示例
    • 以太坊区块链和Web3.0
    • 开发智能合约
  • python
    • pyenv版本管理工具
    • python初始化
    • python基本概念
    • venv虚拟环境
  • 个人其他
    • Steam Deck的基本设置和插件
  • 其他编程相关
    • Git教程和常用命令
    • Java开发-JDK和Maven的安装和卸载
    • Jenkins安装和基本使用
    • Linux系统指令
    • Mac 使用2K屏幕开启缩放
    • Mac 使用VS code打开项目
    • Mac 安装 Homebrew
    • Mac 的终端 shell 与 zsh
    • Mac 软件和插件
    • MacBook使用建议
    • Mac升降级到指定版本的系统
    • Mac安装Zsh
    • Mac安装软件各种提示
    • Mac系统脚本语言 AppleScript 的使用
    • Mac终端代理工具
    • Markdown(md)文档开发-Typora
    • Mysql 的安装和使用
    • Nginx 安装和基础使用
    • Nginx 稍微高深的配置
    • Slate - Api 的文档开发工具
    • Sublime配置
    • Ubuntu的 apt-get 使用
    • VScode配置
    • Windows 软件和插件
    • curl 工具使用
    • github 网站访问优化
    • host 文件
    • inquirer 终端中和用户交互
    • uTools的插件开发教程
    • vim 文本编辑功能
    • 使用 Github Pages 免费部署网站
    • 压缩指令 zip 和 unzip
    • 油猴的安装和开发(Tampermonkey)
    • 阿里云简略使用
  • 微信开发
    • 微信小程序开发
    • 微信开发必读
    • 微信开发提前购买域名
    • 微信手机打开的页面中授权登录
    • 微信扫码登录
    • 微信服务号登录+推送服务提醒
    • 自定义分享卡片-node.js实现
  • 数据结构与算法
    • KMP算法
    • Wildcard字符串分析算法
    • 二叉树
    • 字典树
    • 时间复杂度浅析
    • 算法神器——动态规划
Powered by GitBook
On this page
  • nvm版本管理+自动切换node版本
  • nvm使用
  • 安装
  • nvm自动切换node版本功能
  • nvm安装node失败的解决方法

Was this helpful?

  1. Node 和 Npm 相关

nvm版本管理+自动切换node版本

title: nvm版本管理+自动切换node版本 id: d4d343eb2df894cd3ee631396e674278 tags: [] date: 2000/01/01 00:00:00 updated: 2024/04/16 14:08:26 isPublic: true --#|[分隔]|#--

nvm版本管理+自动切换node版本

nvm 官方教程:https://github.com/nvm-sh/nvm。

在日常的前端或node后台开发中,使用的部分node依赖,可能不支持当前使用的node版本,这时候如果还想使用这个依赖愉快的开发,那只能切换node版本了。

然而,卸载和安装node的麻烦程度虽然还能接受,但在其他项目,依然使用高版本node的语法支持。

这时候就需要 nvm 了,nvm就是node版本管理器,使用它可以同时安装多个版本的node,然后可以通过一行命令,轻松切换当前系统,或者当前终端使用的node版本。

下面基于mac系统,进行一些步骤的讲解。

nvm使用

nvm下面需要联网的指令,访问的node下载源默认是国外的,可能延迟比较大、甚至直接超时访问失败。

所以可以设置修改node源为国内的淘宝源,可以从此页面查看淘宝提供的node源:https://npmmirror.com/。

修改源可以在安装 nvm 后,修改配置文件,如果想单次使用,则在使用nvm的需要联网的指令时,在前面添加配置:

# 原指令
nvm ls-remote

#在前面添加配置
NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ nvm ls-remote

主要为如下一些指令:

功能
指令

列出当前已安装的node,和可安装的lts(长期支持稳定版)版本

nvm ls

列出所有远程服务器的版本

nvm ls-remote

列出所有远程服务器的版本中的长期支持版 (LTS版本)

nvm ls-remote --lts

安装指定版本,可模糊安装,建议先查询后安装,比如 nvm install v16.19.1

nvm install <版本号>

安装最新稳定版 node

nvm install stable

删除已安装的指定版本,语法与install类似

nvm uninstall <版本号>

设置一个默认版本,新打开的终端使用的版本

nvm alias default <版本号>

给不同的版本号添加别名

nvm alias <别名> <版本号>

取消一个别名

nvm unalias <别名>

切换当前终端使用的版本,但只针对当前终端生效,不影响其他

nvm use <版本号 或 别名>

显示当前的版本

nvm current

删除已定义的别名

nvm unalias <别名>

在当前版本 node 环境下,重新全局安装指定版本号的 npm 包

nvm reinstall-packages <版本号>

安装

既然使用nvm‘托管’,那么自己之前安装的全局node包,就需要先卸载了,防止出问题。

卸载全局安装的node包

npm、cnpm、yarn等都会被一并删掉,稍后需要重新安。

下面的指令,可以查看已经安装在全局的模块node功能模块,以便删除这些全局模块后再按照不同的 node 版本重新进行全局安装。

但注意如果查询出来的某部分目录是在 **.nvm **的子级里面,说明这部分已经是 nvm 安装的node的了,就不用卸载这部分了。

npm ls -g --depth=0

下面,是卸载步骤

也可以用 type -a node 查看一下路径,不同机器和不通安装方式,位置可能不一样。

  1. 删除全局 node_modules 目录,里面其实只有几个文件夹,是npm和使用npm全局安装的比如yarn、cnpm等:

    sudo rm -rf /usr/local/lib/node_modules
  2. 删除 node,其实就是卸载node环境了:

    sudo rm /usr/local/bin/node
  3. 删除全局 node 模块注册的软链,懂linux指令语法的,大概可以看懂,下面这行的命令,就是先进入到系统的全局指令文件,筛选出其中依赖于 node_modules的所有指令(其实还是步骤1中的那几个指令),然后删除:

    cd  /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm

可以使用终端输node -v,如果提示node: command not found,就说明卸载完成了

安装 nvm

安装nvm有多种方式,下面是两种方式,建议在官网查看最新的安装语句(由于外网问题,很可能会安装失败,后面有其他安装方式):

curl方式:

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

wget方式:

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

上面两个语句,都会都会执行nvm的安装脚本,安装完成后,会有类似下面的打印:

=> Profile not found. Tried  (as defined in $PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.
=> Create one of them and run this script again
=> Create it (touch ) and run this script again
   OR
=> Append the following lines to the correct file yourself:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

意思是,我们需要在~/.bashrc、~/.bash_profile、~/.zshrc、~/.profile这四个文件的任意一个,加入nvm的这行指令,保存关闭,然后重启终端,就可以使用nvm指令了。

实际如果安装正常,nvm会自行在 ~/.zshrc 中插入。

v0.39.7版本的指令如下,可以直接在官网安装最新版本的nvm,粘贴最新版的指令(下面是官网提供的指令,也可以使用安装完成后,上面打印出来的指令):

export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

当添加完成后,比如是把指令写在了~/.zshrc文件中,那保存后记得要手动执行一下执行:

source ~/.zshrc

重载此文件后,nvm就可以正常使用了。

更换node的下载源

nvm的node源使用的是国外地址,导致一些nvm指令会网速慢、超时等。

如果想解决,就需要换用国内的源,可以使用淘宝提供的node源:https://npmmirror.com/mirrors/node/。

有了国内源地址,后面就是使用了,一个简单的临时使用方式,是使用 nvm 指令时,在指令前配置本次指令使用的源,比如:

NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/ nvm ls-remote

一劳永逸的方法就是,直接在上面提到的文件中(建议就在粘贴了nvm版本指令的文件中),添加以下指令:

export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node/

最后再:

source ~/.zshrc

重载此文件,使配置生效。

安装失败

上面的语句有可能会由于网络问题,而安装失败。

此时可以进入 nvm 官方教程(实际就是一个 github 页面),这里会提供多种安装方式(但最终貌似都需要克隆 nvm 的仓库,我们可以手动克隆仓库了)。

但是, github 同样有无法打开的可能,那我们也打开国产 「githup」- 码云搜索 nvm-sh,找到热血网友从 github 克隆至此的项目,一样的使用。

下面大致讲解其中比较简单的一种:

Git Install:

进入到 ~ 目录,使用 git 克隆 nvm 仓库:

cd ~/

git clone https://github.com/nvm-sh/nvm.git .nvm

进入,切换到最新版本分支(实际最新分支,可再去官网看一下):

cd .nvm

git checkout v0.39.7

执行一下安装指令,这个指令瞬间执行完成:

. ./nvm.sh

最后,再一下几个文件中的任意一个,~/.bashrc 、 ~/.profile ,或 ~/.zshrc,粘贴入一下代码:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

最后的最后,让系统重新读取一下这个文件,比如这个放进了 ~/.zshrc 文件中,那么执行:

source ~/.zshrc

完成,此时可以使用 nvm 了。

nvm自动切换node版本功能

这个功能本来不需要,但近几年发现,业务和项目太多时,可能真的就很需要了。

比如,接收过来项目,使用的 node 版本可能五花八门;自己公司开发的项目,使用固定某个 node 版本;偶尔自己研究些新技术,又可能会使用最新版的。

本来是进入某个项目,就使用 nvm use 来切换一下,但总的来说很麻烦,每次打开终端都要来这么一下。

所以还是犯懒,在网上找了找解决办法。

前置条件

后面两个解决办法,都有一个前提条件,需要在启动终端的文件夹下,或者父级文件夹,或者父父级文件夹...添加一个文件。

文件名:.nvmrc。

文件内容:你已安装、能够使用 nvm use 指令切换过去的node版本号,可以是版本全路径,也可以是省略小版本,比如:

v16.19.0

或者

v16

或者使用当前已安装的最新版本

lts/*

放置好文件,后面两项的功能才能生效。

方案一:使用指令去查找切换(推荐)

切换node的本质,就是在打开终端时,使用 nvm use [版本号] 切换一下。

如果对 mac 或者 linux 系统稍微有些了解的程序员,都知道 ~/.zshrc 或 ~/.bashrc 这么个文件(如果使用的shell是 zsh,那是 ~/.zshrc 文件,如果是 bash,那就是 ~/.bashrc 文件)。

这个文件会在用户每次打开一个新终端时,都自动执行一下。

所以我们把下面这段 shell 脚本代码,粘贴到 ~/.zshrc 或 ~/.bashrc 文件中,保存。

# 启动shell时,从当前目录向顶层目录逐层寻找 .nvmrc 文件,如果找到,就自动切换 node 版本至文件中标注的版本
local nvmrc_path="$(nvm_find_nvmrc)";
if [ -n "$nvmrc_path" ]
then
  local first_line=$(head -n 1 $nvmrc_path);
  echo "\033[44;33m 找到版本文件,即将切换node版本至:$first_line \033[0m";
  nvm use $first_line;
fi

如果已经按照上面的前置条件创建好了 .nvmrc 文件,写好内容,那直接到对应项目下重启终端,就会出现提示:

找到版本文件,即将切换node版本至:v16.19.0 
Now using node v16.19.0 (npm v9.4.1)

此时这个终端使用的 node,就是 v16.19.0 了。

方案二:使用指令去查找切换(不推荐)

网上找了找,找到了这个工具: avn 。

这个工具已不再更新了,所以安装时有点限制,不过使用没有限制。

在安装时,node版本最高只能是 node10(node@v10.24.1) ,否则会报错安装失败,不过安装完启动后,就可以随意切换 node 版本了,也就只是在安装时需要在指定 node 版本下安装。

首先新打开一个终端,保证现在使用的 node 版本是10或者10以下,否则会安装失败。

打开终端后,先全局安装:

npm install -g avn avn-nvm avn-n

然后启动这个工具:

avn setup

如果已经按照上面的前置条件创建好了 .nvmrc 文件,写好内容,那直接到对应项目下重启终端,就会出现提示:

avn activated v14.16.0 via ../.node-version (avn-nvm v14.16.0)

此时这个终端使用的 node,就是 v14.16.0 了。

nvm安装node失败的解决方法

最近遇到糟心事儿,家里的nvm安装node一直失败,看报错是网络问题。

当我执行以下指令:

nvm install v16.14.2

# 发现会先下载,下载速度奇慢
# https://nodejs.org/dist/v16.14.2/node-v16.14.2.tar.xz

# 下载出错后,会自动去下载,仍是下载速度奇慢
# https://nodejs.org/dist/v16.14.2/node-v16.14.2-darwin-x64.tar.xz

于是我把两个链接都复制到浏览器,结果很快下载完成了上面两个文件。

接着把两个文件夹都解压,得到两个文件夹,里面应该都是nodev16.14.2的包内容,但里面的内容又不一样。

于是把使用终端执行以下指令:

type -p node

# 得到以下输出,下面这个地址,是我当前的node的所在文件夹
# 可以发现,实际就是在 ~/.nvm/versions/node/ 文件夹中
# 这个文件夹就是 nvm 放置所有 node 版本的文件夹了
# /Users/majun/.nvm/versions/node/v16.14.2/bin/node

对比后,发现下载并解压后的两个node中,第二个链接解压出来的 node-v16.14.2-darwin-x64 文件夹中的内容,是和现有的node中的东西是一样的。

于是,我就把文件夹 node-v16.14.2-darwin-x64 按照这文件夹的命名规则,更名为 v16.14.2 后,放入这个文件夹中,最后在终端输入:

nvm ls

发现刚进去的v16.14.2出现在「已安装」的node版本列表中。

最终解决方案

所以我们可以自己下载需要的node版本,解压、更名后,放入nvm对应的文件夹中(默认为 ~/.nvm/versions/node/ )即可,下载链接如下:

https://nodejs.org/dist/[版本]/node-[版本]-darwin-x64.tar.xz
# eg:
https://nodejs.org/dist/v16.14.2/node-v16.14.2-darwin-x64.tar.xz
Previousnpm指令说明和其他对比NextReact 学习

Last updated 3 months ago

Was this helpful?