首页 > 编程语言 >【nvm】关于自动切换Node版本的解决方案

【nvm】关于自动切换Node版本的解决方案

时间:2023-10-26 11:15:16浏览次数:55  
标签:Node use workspaceFolders vscode 解决方案 nvmrc nvm

本地会开发多个不同的 NodeJS 项目,每个项目可能需要的 Node 版本不同,有的老项目还在用 10.xx ,有的要求 12.xx/14.xx/16.xx/18.xx 。

总之,每个项目都需要不同的 Node 版本。很多时候我都是在启动项目遇到报错了才会意识到要切换 Node 版本。

于是我开始搜寻关于多项目自动切换 Node 版本的解决方案。

于是找到了 vscode-nvmrc 这类的插件,自动切换版本

vscode-nvmrc 设计思路

项目根目录新建.nvmrc文件,这是nvm的官方文件,当使用nvm use时会自动查找这个文件,而windows系统一般使用的是nvm-for-windows,它是由另一个开发者维护的windows版本,并不支持nvm use查找.nvmrc
不过这并不影响vscode插件中实现nvm use功能,只不过了解下.nvmrc是nvm的官方文件
话不多说,上代码,很简单,vscode插件方法vscode.window.onDidChangeWindowState中读取下.nvmrc文件,e.focused表示当vscode窗口显示时触发,切换vscode实例时能够触发,然后调用child_process.exec 运行nvm use

vscode-nvmrc代码仓库

点击查看代码
function resolveRootPathAndNvmuse(context: vscode.ExtensionContext) {
  const workspaceFolders = vscode.workspace.workspaceFolders;
  if (workspaceFolders && workspaceFolders.length > 0) {
    const rootPath = workspaceFolders[0].uri.fsPath;
    if (rootPath) {
      const url = resolve(rootPath, ".nvmrc");
      nvmuse(url, context);
    }
  }
}
  1. 这段代码的主要目的是在 VSCode 扩展中解析工作区的根路径,并检查是否存在一个名为 ".nvmrc" 的文件,然后调用 nvmuse 函数,传递 ".nvmrc" 文件的路径和扩展上下文作为参数。

  2. 扩展上下文 (context):vscode.ExtensionContext 是 VSCode 扩展开发中的一个重要概念,它用于管理扩展的生命周期和资源。通常,扩展需要将其上下文传递给扩展的各个部分,以确保它们可以正确地注册命令、提供功能等。

  3. 获取工作区信息:代码首先使用 vscode.workspace.workspaceFolders 获取当前打开的工作区(Workspace)的文件夹信息。工作区是一个包含一个或多个项目文件夹的容器,允许您协同开发多个相关项目。

  4. 检查工作区文件夹:如果存在一个或多个工作区文件夹 (workspaceFolders),则代码会进一步处理。通常,VSCode 支持多个工作区文件夹,但这段代码只处理第一个文件夹。

  5. 获取工作区根路径:代码使用 workspaceFolders[0].uri.fsPath 获取第一个工作区文件夹的根路径,并将其存储在 rootPath 变量中。

  6. 解析 ".nvmrc" 文件路径:接下来,代码使用 resolve 函数来构建 ".nvmrc" 文件的完整路径,其中 resolve 函数的具体实现不在代码段中,但它通常用于构建文件路径。这个路径会存储在 url 变量中。

  7. 调用 nvmuse 函数:最后,代码调用 nvmuse 函数,传递 ".nvmrc" 文件的路径 (url) 和扩展的上下文 (context) 作为参数。这意味着扩展将执行某些操作,可能是与 Node Version Manager (NVM) 相关的,使用指定的 ".nvmrc" 文件路径。

这其实能满足大部分的需要,但并不能满足我。

我的习惯是将不同类型的项目以服务公司为主体放在VScode中的一个“工作区”内。

而一个服务公司有 admin 项目(node 12.18.0),Vue3项目(node 16.11.0),Vue2项目(node 12.18.0)

于此同时发现了另一个异常:

当我在项目根目录下执行 echo "v16.11.0" > .nvmrc 理论是会创建一个.nvmrc的文件,此时我只需要继续执行 nvm use 就可以快速切换node版本了。

但我却碰到了一个奇怪的异常:

image

无法定位到 .nvmrc 并且执行的是.0.0的版本。

翻阅文档得到答案

If:
PowerShell

❯ nvm use
.0.0
node v.0.0 (64-bit) is not installed.

First, run:

nvm on

Then:
PowerShell

type .\.nvmrc | %{$_ -replace "v",""} | %{nvm install $_}
type .\.nvmrc | %{$_ -replace "v",""} | %{nvm use $_}

标签:Node,use,workspaceFolders,vscode,解决方案,nvmrc,nvm
From: https://www.cnblogs.com/zhuanzhuan1996/p/17788760.html

相关文章

  • 谷歌、AMD、英特尔加入挑战,英伟达AI解决方案还能继续“遥遥领先”吗?
     编译|谢年年要问世界范围内人工智能解决方案谁最“遥遥领先”?那肯定是英伟达!然鹅这一情况很有可能会发生变动。谷歌正在构建自己的人工智能基础设施!除了谷歌,在软件方面,Meta的PyTorch2.0和OpenAITriton同样发展迅速。AMD的GPUs、英特尔的Gaudi、Meta的MTIA以及微软的Athena,它......
  • centos7安装node-v18版本真是难呢
    背景背景就是上一篇文章提到的,部署gitbook这个文档中心的话,是需要先安装node,然后,如果你的node版本过高的话,一般会报错,此时,网上很多文章就是降node版本解决,但其实用高版本也是有办法的,只是麻烦点,要改改代码;但是,我下载了高版本的node安装时,发现在centos7上还装不了,可谓一波未平一波......
  • Node.js 的ORM(Sequelize) 的使用
    Sequelize是一个Node.js的ORM。什么是ORM呢?对象关系映射(ObjectRelationalMapping)。什么意思?就是在编程语言中,很容易创建对象,如果在面向对象的语言中,它也只有对象,但在关系型数据库中,它只有关系(表)。如果想在程序中操作关系型数据库,就要在对象和表之间做转换,比如,取出对象......
  • 【前端开发】基于vue+elemnt-ui流程图设计器解决方案
    前言越来越多的企业都在研发低代码平台,其中流程引擎是核心之一,拥有一个可以拖拽设计审批流程的设计器是相当重要的。介绍审批流程设计器是一种工具,用于创建和设计审批流程。它通常是一个可视化的设计器界面,可以方便地添加和配置审批节点、终审节点、消息节点等,并能够通过连线将......
  • 应用案例|基于三维机器视觉的机器人货品拣选系统应用解决方案
    Part.1 行业背景随着电子商务和全球供应链的蓬勃发展,仓储和物流行业面临着巨大的挑战,快速增长的订单量和消费者对更快交付的需求加剧了物流压力。Part.2 行业痛点传统的货品拣选工作通常由人工完成,然而,人工拣选和搬运货物的成本高、效率低,容易出现错误。基于三维机器视觉的机器人......
  • VMware Aria Suite 8.14 发布 - 云管理解决方案 (下载索引)
    VMwareAriaSuite8.14-云管理解决方案(下载索引)请访问原文链接:https://sysin.org/blog/vmware-aria-suite/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org云管理套包VMwareAriaSuite(以前称为vRealizeSuite)和vCloudSuiteVMwareAriaSuite(vRealizeSu......
  • 智慧停车视频解决方案:如何让AI助力停车管理升级?
    一、项目背景停车场的管理区域由于面积比较大,进出车辆多,所以在保安方面决不能有任何的麻痹和松懈,继续采用过去保安方式已远远不能满足现代安全防范的需求。为满足停车场的安全和科学系统化管理的需要,以及为了对随时发生的情况进行全面、及时的了解和掌握,对意外情况能迅速做出正确判......
  • 智慧停车视频解决方案:如何让AI助力停车管理升级?
    一、项目背景停车场的管理区域由于面积比较大,进出车辆多,所以在保安方面决不能有任何的麻痹和松懈,继续采用过去保安方式已远远不能满足现代安全防范的需求。为满足停车场的安全和科学系统化管理的需要,以及为了对随时发生的情况进行全面、及时的了解和掌握,对意外情况能迅速做出正确......
  • 多线程指南:探究多线程在Node.js中的广泛应用
    前言最初,JavaScript是用于设计执行简单的web任务的,比如表单验证。直到2009年,Node.js的创建者RyanDahl让开发人员认识到了通过JavaScript进行后端开发已成为可能,在后端开发中,用到最多的就是多线程以及线程之间的同步功能,今天小编就为大家介绍一下如何使用Node.js实现多线程的应......
  • 【Springboot文件上传】前后端双开,大文件秒传、断点续传的解决方案和优雅实现
    思路和解决方案探讨秒传这里指的“秒传”,是指:当用户选择上传一个文件时,服务端检测该文件之前是否已经被上传过,如果服务器已经存有该文件(完全一样),就立马返回前端“文件已上传成功”。前端随即将进度条更新至100%。这样给用户的感觉就是“秒传”的感觉。对于每一个上传到服务......