vscode插件开发

news2024/11/23 23:49:11

作为一个前端开发相信,大家对于vscode非常熟悉。vscode是微软开源的一款基于 Electron 开发的代码编辑器。并且vscode支持通过插件来扩展编辑器的功能,比如Prettier插件帮助我们快速格式化代码,ES7+ React/Redux/React-Native snippets插件帮助我们快速快速编写react代码......这些插件极大地优化了开发体验。那么插件是如何开发的呢?接下来会详细的介绍一下如何开发一个vscode插件。

vscode为插件提供了哪些扩展能力

vscode主要提供了6种开放能力:通用能力、主题、声明类语言特性(我把它称为基础支持)、程序类语言特性(高级支持)、工作区UI扩展、调试。4471b633aa6bdb753108fb40614306b9.jpeg

如何编写一个vscode插件

开发vscode插件需要本地环境安装了node.js和git,然后借助脚手架yomen和generator-code来快速生成项目框架

// 安装yomen generator-code
npm install yo generator-code
// 根据提示选择配置,快速生成项目框架,
yo code

生成的项目目录结构如下:5314f28a142ff13f67f22b66884b5536.pngvscode插件的核心实现主要在package.json和extension.js文件中。package.json:插件的声明文件,包含 2 个重要配置项 activationEvents、contributes。

  • activationEvents主要用于指定插件的触发事件。基于性能的考虑,vscode 插件都是lazy load的,只有激活的时候才启用插件。例子中用到的是onCommand,在 Hello World 命令被调用时,插件才会被激活。

目前支持11种激活事件:

  • onLanguage:${language} :当打开特定语言时插件被激活

  • onCommand:${command}:调用某个 VSCode命令时插件被激活

  • onDebug:Debug 时插件被激活

  • workspaceContains:${toplevelfilename}:当打开包含某个命名规则的文件夹时插件被激活

  • onFileSystem:${scheme}:以某个协议(ftp/sftp/ssh等)打开文件或文件夹时插件被激活

  • onView:${viewId}:指定 id 的视图展开时插件被激活

  • onUri:插件的系统级URI打开时插件被激活

  • onWebviewPanel:webview触发时插件被激活

  • *:VSCode启动时插件被激活。

  • contributes主要是描述插件的拓展点,定义插件要扩展vscode哪部分功能。常用扩展项有代码片段(snippets)、命令(commands)、菜单(menus)、快捷键(keybindings)、主题(themes)。通常完成命令的开发后,会将其与菜单/快捷键进行关联,以便调用。

extension.js:插件的执行入口文件,通常包括激活(activate)和禁用(deactivate)2 个方法。vscode会在激活插件的时候会执行active钩子,在卸载插件的时候会执行deactivate钩子。

接下来通过开发一个jumpNpm的插件来看一下如何实现一个vscode插件 实现功能:

  • 根据package.json里的npm包名字按commond键+点击跳转到本地node_modules下

  • 鼠标悬浮在npm包名字上的时候,显示当前包的名字、版本、协议信息的提示

{
  "name": "jumpNpm",
  "displayName": "jumpNpm",
  "description": "",
  "version": "0.0.1",
  "engines": {
    "vscode": "^1.73.0" // 插件支持的最低vscode版本
  },
  "categories": [
    "Other"
  ],
  "activationEvents": [
    "onLanguage:json" // 注册命令事件
  ],
  "main": "./extension.js",
  "contributes": {},
  "scripts": {
    "lint": "eslint .",
    "pretest": "yarn run lint",
    "test": "node ./test/runTest.js"
  },
  "devDependencies": {
    "@types/glob": "^8.0.0",
    "@types/mocha": "^10.0.0",
    "@types/node": "16.x",
    "@types/vscode": "^1.73.0",
    "@vscode/test-electron": "^2.2.0",
    "eslint": "^8.26.0",
    "glob": "^8.0.3",
    "mocha": "^10.1.0",
    "typescript": "^4.8.4"
  },
  "dependencies": {}
}

由于用在package.json里的npm包,只用打开json文件的时候激活插件,所以配置了"activationEvents": ["onLanguage:json"]

const vscode = require('vscode');
const path = require('path');
const fs = require('fs');
const utils = require('./utils');

function activate(context) {
  // 注册如何实现跳转到定义,第一个参数表示仅对json文件生效
  const definitionProvider = vscode.languages.registerDefinitionProvider(['json'], {
    provideDefinition(document, position, token) {
      // 当前文件完整路径
      const filePath = document.fileName;

      if (!filePath.endsWith("package.json")) return;

      // 当前文件所在目录
      const workDir = path.dirname(filePath);
      // 光标所在单词
      const pkgName = document.getText(document.getWordRangeAtPosition(position));

      if (!pkgName) return

      // 更改 Node.js进程到package.json文件工作目录
      process.chdir(workDir);

      const destPath = utils.resolvePath(pkgName);

      // 判空
      if (destPath && fs.existsSync(destPath)) {
        // new vscode.Position(0, 0) 表示跳转到某个文件的第一行第一列
        return new vscode.Location(
          vscode.Uri.file(destPath),
          new vscode.Position(0, 0)
        );
      }
    }
  })

  const hoverProvider = vscode.languages.registerHoverProvider('json', {
    provideHover: function (document, position) {
      const filePath = document.fileName;
      const workDir = path.dirname(filePath);
      const word  = document.getText(document.getWordRangeAtPosition(position));

      if (!filePath.endsWith("package.json")) return;

      const content = require(filePath)

      if (content?.dependencies[word] || content?.devDependencies[word]) {
        // 更改 Node.js进程到package.json文件工作目录
        process.chdir(workDir);
        const destPath = utils.resolvePath(word);
        const packageContent = require(destPath);
        // hover内容支持markdown语法
        return new vscode.Hover(`* **名称**:${packageContent.name}\n* **版本**:${packageContent.version}\n* **许可协议**:${packageContent.license}`);
      }
    }
  })
  context.subscriptions.push(definitionProvider, hoverProvider);
}

function deactivate() {}

module.exports = {
  activate,
  deactivate
}

出于安全性考虑,vscode不支持直接操作dom,只能使用vscode封装的api来操作编辑器,也就是头部require的vscode对象。这里是对json文件的内容进行跳转命令,所以使用vscode.languages.registerDefinitionProvider注册一个监听json文件的provider,然后将返回的实例添加至 context.subscriptions 中。当命令被激活时,会执行相应的回调方法。

如何调试vscode

使用Yomen生成的模板自带vs code运行能力,切换到调试面板点击运行就会创建一个新的vscode窗口(Extension Development Host),可以在该窗口进行调试。每次修改了代码通过command+shift+F5刷新

打包

插件的打包需要借助vsce这个工具打包成vsix文件

// 全局安装vsce
npm install -g vsce
// 打包
vsce package

打包后会生成一个以.vsix结尾的文件a1d14ebcba2495001567c3473242dc0c.pngvscode插件的安装支持本地安装和插件应用市场两种安装形式。本地安装的话,可以通过以下步骤安装上一步生成的.vsix文件。0328108f02a3159b53e7a8db6eb01ec3.png发布到应用市场安装的话,就需要在Azure DevOps上注册账号,并创建一个组织来获取PAT(Personak access tokens)。

// 登陆 需要PAT
vsce login <plublisher name> 
// 打包
vsce package
// 发布
vsce publish

发布的注意事项:

  • PAT网站不会存储,需要自行保存

  • plublisher name需要和pacage.json里的保持一致

参考文章

  • https://code.visualstudio.com/api/get-started/your-first-extension

    https://code.visualstudio.com/docs/extensionAPI/vscode-api

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

3548d55eb1815c45b2db3970b2c1d99d.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53693.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kotlin高仿微信-第31篇-支付-服务

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

hadoop集群中存在配置较低的数据节点应用如何应对磁盘数据溢满的问题之rebalance

现象 登录hdfs web ui发现集群中一个节点的负载远高于另外的节点 分析 一般情况下集群在数据盘配置一样&#xff0c;几乎使用不到rebalance&#xff0c;但是我们的集群中有一个比较小的数据节点&#xff0c;因此我们需要关注各节点数据分布情况&#xff0c;及时进行rebalan…

手撕一个图片色卡提取器,可自定义提取色卡数量!

在一些特殊的业务场景中&#xff0c;我们需要一次性提取一张图片中的色卡信息&#xff0c;并且需要使用十六进制的颜色表示方法进行展示。 今天得空做了一个小工具&#xff0c;用来自定义的提取某一张图片中的色卡信息&#xff0c;需要提取某张图片中的色卡可以自行选择。 实现…

Python基础之SQLite数据库

Python与SQLite数据库 一、概述 对于非常简单的应用而言&#xff0c;使用文件作为持久化存储通常就足够了&#xff0c;但是大多数复杂的数据驱动的应用则需要全功能的关系数据库。 SQLite 的目标则是介于两者之间的中小系统。它量级轻、速度快&#xff0c;没有服务器&#xf…

数学辅导微信小程序设计与实现的源码+文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把数学辅导管理与现在网络相结合&#xff0c;利用java技术建设数学辅导微信小程序&#xff0c;实现数学辅导的信息化。则对于进一步提高数学辅导管理发展&#xff0c;丰富数学辅导管理经验能起到不少的促进作用。 数学辅导微…

【python】 int、float、double与16进制字符串的互相转换

import structdef intToHex(num): # int转16进制return hex(num)[2:].upper()def hexToInt(hexString): # 16进制转intreturn int(hexString, 16)def floatToHex(floatValue): # float转16进制return struct.pack(>f, floatValue).hex().upper()def hexToFloat(hexString…

chloris.earth ——Chloris 全球生物量 2003 - 2019 数据平台

概述 Chloris 全球生物量 2003 - 2019 数据集提供了地球陆地木本植被生态系统地上生物量存量和变化的估计值。它涵盖 2003 年至 2019 年期间&#xff0c;按年度时间步长计算。全球数据集的空间分辨率约为 4.6 公里。 这些地图和数据集是通过结合来自星载卫星的多个遥感测量结果…

如何保证PCB孔铜高可靠?

PCB板上电路导通&#xff0c;都是靠线路或过孔来传导的&#xff0c;从PCB制造流程可以看出&#xff0c;PCB完成铜厚是由PCB基铜厚度加板电厚度加图电厚度三部分组成&#xff0c;PCB孔铜厚度&#xff0c;是在两个电镀流程中完成&#xff0c;即全板电镀孔铜的厚度加图形电镀孔铜厚…

k8s概念

文章目录k8s概念为什么叫他k8s以及谁开发的k8s是什么k8s特点时光回溯传统部署时代&#xff1a;虚拟化部署时代容器部署时代&#xff1a;容器的优点为什么需要k8s&#xff0c;他能做什么&#xff1f;Kubernetes 不是什么&#xff1f;k8s概念 为什么叫他k8s以及谁开发的 kubern…

EO.Web浏览器 v2023.0.18.0 for .NET -- EO.WebBrowser

.NET PDF 和 Web 浏览器从未如此简单 使用 PDF 文件生成/处理能力快速扩展您的 .NET 应用程序&#xff0c;或者将流行的 Chromium 浏览器引擎与广泛的自定义选项&#xff08;如自定义资源加载器和 JavaScript 扩展&#xff09;无缝集成用于 UI 或后台任务。 当前&#xff1a;v2…

steam搬砖项目,小白也能月入过万的副业项目

steam搬砖这个项目&#xff0c;我们做了3年了&#xff0c;项目很稳定。由于项目是轻资产&#xff0c;门槛低&#xff0c;按照我们的方法&#xff0c;只要你足够勤快&#xff0c;这是一个能帮你赚取人生的第一桶金的项目。 仅代表个人收益 steam项目原理就是&#xff1a;倒卖cs…

移动端异构运算技术 - GPU OpenCL 编程(基础篇)

一、前言 随着移动端芯片性能的不断提升&#xff0c;在移动端上实时进行计算机图形学、深度学习模型推理等计算密集型任务不再是一个奢望。在移动端设备上&#xff0c;GPU 凭借其优秀的浮点运算性能&#xff0c;以及良好的 API 兼容性&#xff0c;成为移动端异构计算中非常重要…

小巧有劲的按摩好手,能装兜里的护理工具,小鸟斗士筋膜枪体验

现在很多朋友为了身体健康&#xff0c;平时都会去做些简单的健身&#xff0c;因为之前长期不运动&#xff0c;所以健身后很容易有肌肉酸痛等问题&#xff0c;对此&#xff0c;筋膜枪是个很好用的工具&#xff0c;可以有效促进血液循环&#xff0c;还能够缓解久坐所导致的腰背酸…

java面试强基(16)

说说 List, Set, Queue, Map 四者的区别&#xff1f; List(对付顺序的好帮手): 存储的元素是有序的、可重复的。Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序&#xff0c;存储的元素是有序的、可…

壳寡糖/肉桂醛修饰乳清蛋白,乳清浓缩蛋白-羟丙基甲基纤维素复合材料

产品名称&#xff1a;壳寡糖修饰乳清蛋白 英文名称&#xff1a;Chitosan-whey protein 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 壳寡糖&#xff0c;又叫…

【图文详解】入职必备——SVN使用教程

一、SVN基本操作 1、进入svnbucket官网&#xff0c;创建一个空项目&#xff0c;学习svn 2、创建好测试项目后&#xff0c;复制对应地址 3、右键点击“SVN 检出” 4、粘贴“版本库URL”&#xff0c;填写“检出至目录”&#xff0c;最后点击“确定” 5、完善“用户名”和“密码”…

3.9、以太网交换机自学习和转发帧的流程

3.9、以太网交换机自学习和转发帧的流程 1.以太网交换机工作在数据链路层&#xff08;也包括物理层&#xff09; 说明&#xff1a;目前市场上也有包含网络层部分功能的交换机&#xff0c;称为三层交换机 2.以太网交换机收到帧后&#xff0c;在帧交换表中查找的目的MAC地址所…

cilantro 点云均值漂移算法(MeanShift)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 均值漂移算法是一种非常经典的层次聚类方式,已在二维图像中得到了广泛的应用。这里我们也已二维图像为例来阐述其整个计算过程: 算法基本思想:如下图所示,左侧为实际的图像特征的分布,右侧为基于图像特征分布计…

马斯克让猴子学会意念打字!还用人脑模型演示背后原理,电线入脑清晰可见...

杨净 Pine 发自 凹非寺量子位 | 公众号 QbitAI一鸽再鸽&#xff0c;马斯克Neuralink终于官宣新进展。果然不出所料&#xff0c;与此前大家预想的意念打字相关。不过get这项技能的不是人类&#xff0c;而是他们的老朋友——猴子。根据黄色提示“指哪打哪”&#xff1a;我可以吃点…

第 04 章_逻辑架构

第 04 章_逻辑架构1. 逻辑架构剖析1. 1 服务器处理客户端请求1.2 Connectors1.3 第 1 层&#xff1a;连接层1.4 第 2 层&#xff1a;服务层1. 5 第 3 层&#xff1a;引擎层1. 6 存储层1. 7 小结2. SQL执行流程2. 1 MySQL 中的 SQL执行流程3. 优化器 &#xff1a;4. 执行器 &…