vscode 扩展开发从入门到颈椎病康复

2023-11-15

 
笔者从业以来,各路插件开发无算,而 vscode 把插件开发体验做到了极致。其开发体验,如沐春风,如丝般顺滑,经常写完了还想删掉再写一遍!
 
vscode 扩展的内置脚手架细心且精致,一键生成后即可运行。vscode 库类型完美,因此开发者可以仅通过 IDE 提示来猜到 API,省去了很多文档查阅成本。最后,vscode 扩展开发文档丰富、开发体系清晰。
 
废话少说,让我们进入正题吧。
 
认识 vscode
 
vscode 由 electron 开发,通过 webview 渲染,编辑器基于 monaco editor 。可以通过切换开发人员工具来验证,如下图:
vscode 扩展设计理念
 
1、extension host
vscode 扩展运行进程与 vscode 主进程互相独立,以避免有 bug 的扩展阻塞 vscode 主进程运行。
 
2、activation events
为保证 vscode 性能。所有 vscode 扩展都是按需加载的。每个扩展应该声明加载时机,常用的声明方式如下:
  • onLanguage:python 当用户打开 python 代码文件时。`
  • onCommand:sayHello 当用户执行 sayHello 命令时。 command 的概念稍后介绍。
  • workspaceContains:pont-config.json 当项目中包含 pont-config.json 文件时。
  • * 一直打开,不推荐。
更多细节可以参看文档: Visual Studio Code Activation Events - package.json
 
3、vscode UI 组件
vscode UI 组件非常简洁,也几乎没有可扩展性。这个设计,意在引导扩展开发者保持扩展 UI 的简洁和视觉风格统一。
当然,如果你执意要自定义组件,则可以调用 createWebviewPanel API,自定义 html、css、js 组成一个 iframe,来完全自定义一个 UI 组件。
 
manifest
 
任何插件系统都需要一个 manifest 文件,来声明插件相关的元信息,vscode 也不例外。
vscode 的 manifest 文件内置在 package.json 中。下面介绍 package.json 中属于 vscode manifest 部分的字段。
 
1、Contribution Points
一个 vscode 扩展除了可以增强 vscode 的功能,还可以提供自定义 snippets、theme、快捷键、配置集,而这些都可以通过 contributes 字段来支持。
 
contributes 字段用得比较多的有 configuration 、 commands 、 keybindings 、 snippets 、 jsonValidation 等。下面一一介绍:
 
1)、configuration
自定义你扩展的配置项。你可以在扩展中通过如下命令获取用户的配置值:
vscode.workspace.getConfiguration('myExtension');
 
示例:
{
  "contributes": {
    "configuration": {
      "type": "object",
      "title": "TypeScript configuration",
      "properties": {
        "typescript.tsdk": {
          "type": ["string", "null"],
          "default": null,
          "description": "Specifies the folder path containing the tsserver and lib*.d.ts files to use."
        }
      }
    }
  }
}
 
 
2)、commands
在 vscode 中,cmd + p 可以打命令面板,你可以在此执行所有的命令。vscode 中所有行为都会被定义为命令,然后在菜单项行为、快捷键行为定义中引用该命令。
 
3)、keybindings
定义快捷键和它对应的 command。
 
4)、snippets
定义并提供 snippets(代码片段)
 
5)、jsonValidation
有没有记得,你在编辑 tsconfig.json 等配置文件的时候,vscode 有充分的补全和属性提示?这个功能可以通过定义一份配置文件对应的 json schema 来提供。
 
官方文档
 
更多详细介绍请参看官方文档: https://code.visualstudio.com/docs/extensionAPI/extension-points
 
示例介绍
 
vscode-pont (vscode-pont 是一个智能接口代码生成器,下期笔者会详细介绍)为例。package.json 文件的 contributes 中,定义了 jsonValidation,使 vscode-pont 的配置文件 pont-config.json 编辑智能化。另外定义了一个快捷键,及其对应的命令。
 
vscode 扩展开发实践
 
vscode 扩展一般用 Typescript 开发,其完整、健全的类型系统,可以让你几乎不用看文档完成插件开发。扩展开发可以使用 vscode API 和 node API ,你也可以用 npm 包的方式使用任意依赖。你也可以用 Web API 来写自定义组件。
 
1、Yo Code - 脚手架安装
 
安装命令如下:
 
npm install -g yo generator-code yo code
 
如下图所示:
 
2、填写扩展基本信息
 
yo 会提示你填写扩展项目的基本信息,如项目名、项目id、描述、发布人,是否初始化git等。按部就班填写即可。如下图所示:
3、运行和调试
yo 会初始化一个 hello world 的扩展,点击运行查看效果。
插件运行后,会新开一个 vscode 窗口,你可以在此验证你的扩展效果,也可以在源码中一步步调试。
 
4、进阶
接下来,我们将基于 hello-world,做一个显示你打开代码的注释率的扩展 —— 让 vscode 状态栏显示当前代码的注释率。
 
1)、更新 activationEvents
package.json 中更新 activationEvents 属性。定义插件的加载时机。
如下所示,当在 vscode 打开 tsx 和 ts 代码时,则加载当前扩展。
 
"activationEvents": [ "onLanguage:typescript", "onLanguage:typescriptreact" ],
 
2)、定义 UI 层
 
vscode 库类型和注释完美,大多数时候,我们通过 vscode 的智能提示,就能找到我们想要的 API。 我们先了解一下 vscode 下一些常用的命名空间:
 
  • workspace 当前工作区相关,文件树相关 API。
  • window 当前视窗相关,编辑器相关 API。
  • commands 注册 command 。
 
然后在 vscode 这些命名空间中探索其 API,得到如下 UI 层代码:
 
// 如果目前存在打开的代码 Tab 页。
if (vscode.window.activeTextEditor) {
   // 展示注释率
   showRate(vscode.window.activeTextEditor);
}

// 如果当前切换了代码 Tab 页,则重新计算注释率
vscode.window.onDidChangeActiveTextEditor(showRate);
 
状态栏展示代码注释率的代码如下:
 
// 创建一个状态栏显示栏目。
const rateBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 1);

function showRate(editor: vscode.TextEditor) {
    // 获取当前Tab页代码
    const code = editor.document.getText();
    // 计算代码注释率
    const rate = analysisCode(code);

    // 展示注释率
    rateBar.text = rate;
    rateBar.color = 'yellow';
    rateBar.show();
}
 
3)、分析代码注释率
这一步与vscode无关。计算方法就仁者见仁,智者见智了。为了防止各种 edge case,笔者分析代码的抽象语法树,统计其中属于注释的语法节点,来计算注释率。代码如下:
 
function analysisCode(code: string) {
    const ast = ts.createSourceFile(
        "",
        code,
        ts.ScriptTarget.ES2015,
        true,
        ts.ScriptKind.TSX
    );

    let commentLine = 0;
    let commentPoses = [];

    function findCommentPos(node: ts.Node) {
        if (!commentPoses.find(num => num === node.getFullStart())) {
            commentPoses.push(node.getFullStart());
        }

        if (node) {
            ts.forEachChild(node, findCommentPos);
        }
    }

    ts.forEachChild(ast, findCommentPos);

    commentPoses.forEach(pos => {
        const comments = ts.getLeadingCommentRanges(code, pos);

        comments && comments.forEach(comment => {
            const commentCode = code.slice(comment.pos, comment.end);
            console.log(commentCode);
            commentLine += commentCode.split('\n').length;
        });
    })

    return '代码注释率: ' + (commentLine / code.split('\n').length * 100 + '').slice(0, 4) + '%';
}
 
4) 发布
如果你是第一次进行 vscode 扩展发布,需要先申请发布账号。
 
发布账号申请成功后,用如下命令进行扩展发布:
npm install -g vsce vsce publish
 
本文中的这个示例,源码笔者已经上传到 Github。源码地址: https://github.com/nefe/vscode-extension-tutorial ,并且已发布到 vscode 扩展市场。笔者可在扩展市场中搜索 hello-world:
vscode 插件开发案例
 
这里介绍一些笔者团队开发的一些扩展。
 
toolkits
提供 iron-redux 的 snippets,和 iron-redux 的动态 action 创建功能。
 
kiwi
kiwi 是笔者团队开发的一站式国际化解决方案。其主要功能如下:
  • 中文抽取
 
  • 中文回显
使用 I18N 后,代码丧失了一部分可读性,因此扩展还提供了中文回显功能。
  • 中文查找
使用了 I18N 之后,代码中不再有中文,当业务中碰到问题需要定位对应代码位置非常困难。因此扩展提供了中文查找功能。
 
vscode-pont
下期介绍,敬请期待...
 
敲重点
新能源前端团队技术氛围好,团队大神多(妹纸也多),业务扩张,前途无量! 热烈欢迎联系笔者转岗~
 
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vscode 扩展开发从入门到颈椎病康复 的相关文章

  • 如何使用放心的方式在正文中发送 JsonObject 以进行 post 请求?

    我有一个使用 Google Gson 创建的 JsonObject JsonObject jsonObj gson fromJson response1 json JsonElement class getAsJsonObject 我还对现
  • 如何使用 Jersey 将嵌套列表封送为 JSON?我得到一个空数组或一个包含数组的单元素字典数组

    我正在开发一个使用 Jersey 将对象转换为 JSON 的项目 我希望能够写出嵌套列表 如下所示 data one two three a b c 我想要转换的对象首先将数据表示为 gt gt 我认为 Jersey 会做正确的事情 以上输
  • 如何将 JSON 数据从 Android 发送到 php url?

    我想将登录信息从我的应用程序发送到 php url 因为这我的应用程序将崩溃 任何人都可以帮助我解决这个问题 这是我的服务器登录方法 我想将数据发送到此登录方法 Method public method login Parameters 3
  • 关于JSON和序列化的问题

    我的视图模型有一个强类型视图 其中包含一个对象 Person 和一个技能列表 人是很直率的 我像这样使用 Html Helpers Html TextBoxFor m gt m Person FirstName 我提交表格并得到我想要的 问
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • 如何使用 Retrofit 解析嵌套 json....?

    我不知道该怎么办使用 Retrofit 解析 json 熟悉使用 Retrofit 解析简单的 json 但不熟悉解析嵌套Json using Retrofit 这是我的 Json 数据 current observation image
  • Angular 4 显示其中的数据

    我不喜欢从 API 返回到我的 Angular 4 应用程序的数据 这是 JSON 的示例 我不关心美元 但这是我正在处理的数据类型 最终目标是在页面上展示 Coin Price BTC 4 281 28 ETH 294 62 etc JS
  • JSON 中的哈希到底是什么?

    我正在学习 JSON 但我发现你也可以将所谓的 哈希 放入 JSON 中 我在哪里可以找到什么是哈希 或者你能向我解释一下什么是哈希吗 另外 什么是哈希图 我有 C 和 C 经验 正在学习 JS Jquery 和 JSON 哈希是一个稀疏数
  • Mandrill 验证错误

    很高兴能在 StackOverflow 上提出我的第一个问题 多年来我一直依靠它自学了很多东西 我的问题是这样的 尝试通过 Mandrill 的 API 发送邮件时出现以下错误 status error code 1 name Valida
  • JSONP 使用 JQuery 从 HTTPS 协议获取 JSON

    我正在尝试获取从 https 安全站点发送的 JSON 客户端希望不要使用任何服务器端语言 全部都是 Javascript 我读到 当使用 Jquery 中的 ajax 函数时 我必须使用 JSONP 才能从安全站点加载 JSON 我的第一
  • IE9 JSON 数据“您要打开还是保存此文件”

    开始使用 IE9 测试我的 jQuery 应用程序 看来我在这里可能遇到麻烦了 我注意到 当我将 JSON 数据返回到 Javascript 方法时 我总是收到此提示 您想打开或保存此文件吗 并为我提供了 3 个按钮 打开 保存和取消 当然
  • SQL Server 抱怨无效的 json

    我正在使用 Azure 数据工厂和 Azure SQL 数据库编写 ETL 工具 数据工厂捕获映射数据流的输出并将其作为字符串插入到 SQL Server 表 Audit OperationsEventLog 的 StatusMessage
  • 如何在 JSON 中转义双引号

    我试图显示双引号 但它显示了反斜杠之一 maingame day1 text1 Tag 1 text2 Heute startet unsere Rundreise Example text Jeden Tag wird ein neues
  • 将 JSON 反序列化为表

    我需要根据通过 API 接收的数据填充 ABAP 中的表 我正在使用以下 ABAP 函数从 json 填充现有的 ABAP 表 JSON 是正确的 表中包含相应的表 ui2 cl json gt deserialize EXPORTING
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 如何在 ASP.NET MVC 3 的 Razor 视图中编码嵌入的 javascript?

    如何在以下上下文中正确编码 JavaScript 我的 JSON 对象中的值是由应用程序管理员设置的 因此我假设它们需要正确编码 对于 HTML 和 JavaScript 都是如此 我在用着System Web Script Seriali
  • Kubernetes / kubectl - “必须指定容器名称”,但看起来确实如此?

    我正在调试 kubectl 的日志输出 其中指出 Error from server BadRequest a container name must be specified for pod postgres operator 49202
  • 来自 iPhone/iPad 的 json Web 服务

    有人可以帮助我解决如何从 iphone 或 ipad 使用 json Web 服务的问题吗 这里我的要求是使用 API 密钥实现 json webservice 如果可能的话发布一些教程或示例链接 谢谢 规范的 JSON 处理库是here
  • jq:将对象数组转换为对象

    我收到了来自curl的回复 格式如下 list value 1 id 12 value 15 id 13 value 4 id 14 给定 id 之间的映射 如下所示 12 newId1 13 newId2 14 newId3 我想做这个
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J

随机推荐

  • syncthing数据同步应用-docker部署

    syncthing应用场景类似于rsync 在数据传输通道的两端都部署服务 再通过密钥验证的方式完成最终数据同步 而syncthing较之更加简单 因配备了Web UI 配置上难度降低了不少 相关资料 https syncthing net
  • go语言命令行库的安装与使用 -- cobra

    文章目录 前言 一 go env的配置 镜像源的设置 GOPROXY 二 cobra的安装与cobra cli的安装 1 cobra的安装 1 测试是否安装成功 2 cobra cli的安装 cobra cli的使用 前言 看了许多cobr
  • Vue3.0+ts—watch使用

    引入Vue的对象 ref reactive watch ref 用来声明响应式的基础类型的变量 reactive用来声明响应式的对象类型的变量 watch 引入watch对象 以便调用 import ref reactive watch f
  • 若依框架添加页面步骤

    本文代码使用的是ruoyi分离版 http doc ruoyi vip ruoyi vue 一 导入表 1 1查看数据库表 1 2使用后台代码生成模块 二 编辑表信息 若依框架前后端分离版本自动生成代码的详细步骤 1 若依框架的下载和本地运
  • Java Web-servlet技术-通过表单向servlet提交数据

    通过表单向servlet提交数据 1 创建名为ComputeBill的servlet文件 2 重写init 和service package myservlet import java io IOException import java
  • 游戏服务器维护请更换服务器,更换游戏服务器

    更换游戏服务器 内容精选 换一换 支持 您可以先将弹性公网IP从原弹性云服务器解绑 如何解绑请参考解绑定和释放弹性公网IP 再将弹性公网IP绑定到目标弹性云服务器 如何绑定请参考绑定云资源 相关操作 为弹性云服务器更换绑定的弹性公网IP 请
  • Tomcat官网地址

    Tomcat官网地址 https tomcat apache org https tomcat apache org
  • 《再也不怕elasticsearch》es聚合使用与原理剖析

    大家好我是迷途 一个在互联网行业 摸爬滚打的学子 热爱学习 热爱代码 热爱技术 热爱互联网的一切 再也不怕elasticsearch系列 帅途会慢慢由浅入深 为大家剖析一遍 各位大佬请放心 虽然这个系列帅途有时候更新的有点慢 但是绝对不会烂
  • 去除 Zotero + Obsidian 复制粘贴参考文献表时的多余空行(ctrl+shift+C)

    前言 最近在用 Zotero 做文献管理 用 Obsidian 记笔记 但是使用的时候 有一个问题不大 但是有时候很烦人的情况 粘贴参考文献格式 在粘贴的时候总会莫名多出来几个空行 需要手动删除 举个例子 下面是某个文献库 我希望将第一篇文
  • 广告营销用户点击预测分析

    广告营销用户点击预测分析 零 数据集以及数据集简介以及任务分析 一 数据预处理 1 加载检查数据 1 特殊特征 2 特殊特征的处理 3 特殊特征处理后生成的新特征 2 数据类型与缺失值处理 1 查看数据信息 2 数据补全以及类型转换 3 补
  • 为什么 Thread 类的 sleep() 和 yield () 方法是静态方法?(详解)

    首先明确一点 在一个线程拿到锁的时候 其他线程向拿到锁就必须要等待 author FanQie date 2022 7 30 10 43 public class SleepYield private static Object resou
  • docker 运行pytorch 程序报错---ERROR: Unexpected bus error encountered in worker.

    1 错误 ERROR Unexpected bus error encountered in worker This might be caused by insufficient shared memory shm 2 原因 Pytorc
  • springboot项目部署云服务器,SpringBoot项目的云服务器部署

    1 场景还原 springboot配置相当简单 人人皆知 怎么把springboot工程部署到云服务器上呢 可能有人会说 博主你前篇不是讲了java工程的云部署把 但是我想澄清一点的是 我前篇的工程都是ssm框架搭建的 而springboo
  • 20个免费视频素材平台推荐

    视频剪辑大神的视频素材是从哪里找的 视频素材不知道去哪里找 那可以看看本文 本文总结了素材的方方面面 包括图片 图标以及视频音频的素材网站整理 再也无需为视频素材烦恼 1 新CG儿 一个特别良心的素材网站 模板和视频都非常丰富 重要的是基本
  • 蓝桥杯精选赛题算法系列——迷宫——DFS

    已收录此专栏 今天我们会全面学习 DFS 的相关知识 包括理论 模板 真题等 深度优先搜索 DFS Depth First Search 和宽度优先搜索 BFS Breadth First Search 或称为广度优先搜索 是基本的暴力技术
  • Apache Flink不止于计算,数仓架构或兴起新一轮变革

    2021 年初 在 InfoQ 编辑部策划的全年技术趋势展望中 我们提到大数据领域将加速拥抱 融合 或 一体化 演进的新方向 本质是为了降低大数据分析的技术复杂度和成本 同时满足对性能和易用性的更高要求 如今 我们看到流行的流处理引擎 Ap
  • electron globalShortcut 快捷键与系统全局快捷键冲突

    用 electron 开发自己的接口测试工具 Post Tools 在设置了 globalShortcut 快捷键后 发现应用中的快捷键与系统全局快捷键冲突了 导致系统快捷键不可正常使用 快捷键配置 export function init
  • GTest学习笔记(七)

    参考博客 Advanced googletest Topics GoogleTest 前言 参数化测试允许对代码进行多种输入的测试 而不需要复制很多相同的代码 本文主要介绍GTest的参数化测试的适用环境 编写方式以及参数化的抽象测试 1
  • 架构设计之道【精】

    一 本质 在了解架构本质之前先了解下架构的定义 百度百科对架构的定义 架构又名软件架构 是有关软件整体结构与组件的抽象描述 用于指导大型软件系统各个方面的设计 从定义中我们提炼出几个关键字 组件 结构 关系 组件 也可以称为软件元素或者是架
  • vscode 扩展开发从入门到颈椎病康复

    笔者从业以来 各路插件开发无算 而 vscode 把插件开发体验做到了极致 其开发体验 如沐春风 如丝般顺滑 经常写完了还想删掉再写一遍 vscode 扩展的内置脚手架细心且精致 一键生成后即可运行 vscode 库类型完美 因此开发者可以