vscode的一些概念和原理,插件系统简单上手指南

news2025/5/18 4:58:52

VScode 技术栈和架构

使用的技术栈:

  1. Electron。
  2. Typescript。
  3. Node.js。
  4. Monaco Editor。 代码编辑器

主进程 (Main Process): 负责应用的生命周期管理、菜单、系统托盘等操作系统相关的功能。Electron 的主进程还负责启动渲染进程,并提供与 Node.js 之间的桥梁。

渲染进程 (Renderer Process): 运行实际的编辑器界面(由 Chromium 渲染),包括文本编辑器、面板、文件浏览器等。所有的界面展示和用户交互逻辑都在渲染进程中处理。

插件进程 (Extension Host Process): 这是运行插件的沙盒环境,插件在这个进程中运行,与主进程和渲染进程保持相对隔离,以确保插件之间的独立性和安全性。

技术选择原因

  1. 跨平台。Qt、Tauri 这些跨平台技术用的是C++、Rust等。而用 Electron 使用 HTML + CSS + JS 方式能降低贡献者的门槛。
  2. 可维护性。ts不用说,也是微软自己推出的技术链。
  3. 生态、可拓展性。Node 生态能能利用 Node 社区大量的已有包。

插件系统

基于 Node.js 的插件进程。VSCode 的插件系统基于 Node.js 实现,插件是在一个独立的 插件进程(Extension Host Process)中运行的。这个进程与主进程和渲染进程隔离,确保插件之间的相对独立性和安全性。(数据读取和独立性)。

插件通过 VSCode 提供的 API 与编辑器进行交互。允许对编辑器深度定制。

沙盒机制。防止了插件对编辑器的核心行为产生破坏性影响。


插件架构:
每个 VSCode 插件都是一个 npm 包,包含以下几个重要文件
package.json: 是插件的配置文件,定义了插件的基本信息(如名称、版本、描述等)、依赖项、激活事件(activation events)、贡献点(contributions)以及插件与 VSCode 的交互方式。
激活事件:用于定义插件何时被激活,如在打开特定类型的文件时,用户执行某个命令时等。
贡献点 (Contributions):用于定义插件可以扩展的功能,比如命令、配置、语言支持、调试配置等。


插件的贡献点 (Contributions):
• 命令 (Commands): 插件可以注册命令,这些命令可以绑定到编辑器中的快捷键或菜单上,用户可以通过命令面板调用这些命令。
• 语言支持 (Languages): 插件可以通过 LSP 提供语法高亮、自动补全、错误提示等功能。
• 调试器 (Debuggers): 插件可以添加自定义的调试器,扩展 VSCode 对特定编程语言或运行环境的调试能力。
• 视图 (Views): 插件可以自定义视图,如活动栏中的侧边栏视图、状态栏中的信息、面板中的自定义内容等。


插件的生命周期:
安装、加载和激活、运行、卸载

界面概念

UI容器Containers和元素Items
在这里插入图片描述

主要模块可划分为:

Activity Bar

Primary Sidebar

Secondary Sidebar

Editor

Panel

Status Bar

在这里插入图片描述
各模块里可能包含一个或多个下面的元素:

View

View Toolbar

Sidebar Toolbar

Editor Toolbar

Panel Toolbar

Status Bar Item

通用元素
Quick Pick
在这里插入图片描述
在这里插入图片描述
消息通知 Notifications

三种
在这里插入图片描述

Webviews

在这里插入图片描述

菜单 Context Menus

在这里插入图片描述

Settings

在这里插入图片描述

插件的能力范围
通用能力(Common Capabilities)
这是插件的核心功能,包括注册命令、绑定快捷键、管理上下文目录,存储工作台或全局数据,显示提示消息,管理设备文件系统,在耗时较长操作时调用进度条等

外观主题管理(Theming)
插件可以控制 VS Code 的外观,包括编辑器里代码的颜色和 VS Code 的 UI 颜色,也可以自定义文件的图标。

Declarative Language Features
插件可以声明一种新的编程语言的语法

Programmatic Language Features

Workbench Extensions

Debugging

UX Guidelines

Restrictions

三大概念
**激活事件(Activation Events)。**即定义激活插件的事件是什么。在第二章Hello World插件案例中,我们定义了一个事件 onCommand:helloworld.helloWorld,即当用户运行指定命令时、插件将被激活,这个命令的id是 helloworld.helloWorld。

插件配置清单(Contribution Points)

VS Code 通过在 package.json 的 contributes 字段 中声明插件的配置清单。比如在上面案例里,有一个配置是注册了一个名为 Hello World 的命令,用户可以在命令面板(Command Palette)中找到并执行这个命令;同时,绑定了一个命令Id helloworld.helloWorld。

// package.json
{
  ...

  "contributes": {
    "commands": [
      {
        "command": "helloworld.helloWorld",
        "title": "Hello World"
      }
    ]
  },

    ...
}

VS Code API

在上面的案例里,我们调用了其中一个api commands.registerCommand,它把一个命令id(helloworld.helloWorld)与一个 function 绑定起来。这相当于绑定了一个事件监听器:一旦有事件被触发(helloworld.helloWorld 命令),立即执行这个function。

import * as vscode from "vscode";

export function activate(context: vscode.ExtensionContext) {
  const disposable = vscode.commands.registerCommand(
    "helloworld.helloWorld", // 命令id
    () => {
      // 绑定的function
      // 定义要执行的内容
    }
  );
  context.subscriptions.push(disposable);
}

export function deactivate() {}

插件代码结构

.
├── .vscode
│   ├── launch.json     // Config for launching and debugging the extension
│   └── tasks.json      // Config for build task that compiles TypeScript
├── .gitignore          // Ignore build output and node_modules
├── README.md           // Readable description of your extension's functionality
├── src
│   └── extension.ts    // Extension source code
├── package.json        // Extension manifest
├── tsconfig.json       // TypeScript configuration

你需要关注的是两个关键的文件:

package.json:插件配置清单

extension.ts:插件的入口文件

{
  "name": "helloworld-sample",
  "publisher": "vscode-samples",

  "version": "0.0.1",

  "displayName": "Helloworld Sample",
  "description": "HelloWorld example for VS Code",
  "categories": ["Other"],

  "engines": {
    "vscode": "^1.51.0"
  },
  "main": "./out/extension.js",

  "activationEvents": [],
  "contributes": {
    "commands": [
      {
        "command": "helloworld.helloWorld",
        "title": "Hello World"
      }
    ]
  },

    ...
}

name 和 publisher
分别声明了 VS Code 的插件名称和发布者,在插件市场里,. 是插件的唯一识别码;如果你要发布一个插件,务必准确填写这两个字段。

version
插件版本号。每次打包发布插件之前,要更新该字段。

displayName、description 和 categories
分别描述了插件的名称、描述信息和分类。其中,displayName 仅作为显示使用,不会用于识别插件;categories 描述的是该插件所属的分类,内容必须按规则填写。

activationEvents 和 contributes
分别描述了 Activation Events 和 Contribution Points,是插件的激活方式。上述案例里声明了一个命令,名为 Hello World,它将在命令面板(Command Palette)出现,其命令id为 helloworld.helloWorld

main
描述了插件的入口文件

engines.vscode
声明了 VS Code API 基于的 VS Code 最低版本。如果当前的 VS Code 版本低于它,将无法调试或使用该插件

插件入口文件

import * as vscode from 'vscode';

export function activate(context: vscode.ExtensionContext) {
  console.log('Congratulations, your extension "helloworld-sample" is now active!');

  let disposable = vscode.commands.registerCommand('helloworld.helloWorld', () => {
    vscode.window.showInformationMessage('Hello World!');
  });

  context.subscriptions.push(disposable);
}

export function deactivate() {}

需要特别注意的是,入口代码文件默认是 ./src/extension.ts;但在 package.json 中,通过 main 字段声明的则是 ./out/extension.js,其实它就是代码文件 ./src/extension.ts 编译之后的的结果。
入口文件暴露了两个方法:

activate()
当插件注册的激活事件(Activation Event)发生时,该方法将被执行,是插件的入口方法

deactivate()
当插件失效时,会调用此方法;你可以在这里做一些数据清理的操作(一般不需要)

下面给出了一个案例,在插件激活并运行后,会弹出一个消息框,内容是“Hello World!”

什么是Webview API

我们使用的 vscode.window.createWebviewPanel 就是其中一个 Webview API。该方法将返回一个 vscode.WebviewPanel 实例,然后通过 panel.webview.html 设定里面的html内容。

Extension与Webview的通信。

Extension端发送
webview.postMessage(…);

Webview端监听
window.addEventListener(‘message’, event => { … })

Webview端发送
acquireVsCodeApi().postMessage(…)
Extension端监听
webview.onDidReceiveMessage(message => {…}, thisArgs, disposables)

构建一个双向通信的模型,其模型相当于搭建一个C/S架构:

webview是客户端,用于发送请求到服务端

extension是服务端,用于接收和处理来自客户端的请求

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

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

相关文章

Excel:多种方法实现1列转多列表格(含vba实现)

要求:将A列中的名字放到右边的表格里面 一、当数据较少的时候手动实现更快 实现的步骤: 1.先按照下面的方式填充右边的表格 然后选中a2、a7所在的前两行进行下拉填充 2.填充完毕表格的样子 3.选中该表格所在的区域 → 点击菜单栏“开始” → 查找 → 替…

python之selenium接管打开的谷歌浏览器窗口——隐藏爬虫特征,跳过登陆弹窗验证

文章目录 引言使用selenium接管打开的谷歌浏览器总结 引言 我们知道通过selenium打开的浏览器与本地电脑上打开的浏览器是不同的,selenium通过插件打开浏览器页面会显示爬虫特征信息,且在访问某些网站时,很容易被检测出是一个爬虫机器&#x…

第十五周:机器学习

目录 摘要 abstrct 一、HW3——食物图片分类CNN 二、GAN计算推导 1、引入 2、最大似然估计 3、divergence的计算 4、总结 三、GAN的架构——fGAN 1、f-divergence 2、共轭函数 3、connetction with GAN 总结 摘要 本周进一步学习了GAN基本原理,主…

element el-tree 自定义图标

除了自定义以外,下方代码还包含 tree自动展开 点击节点后节点聚焦 节点的click事件 节点查询 <template><el-inputplaceholder"请输入要查询的节点"v-model"filterText"clearable></el-input><el-treehighlight-currentclass&quo…

【RabbitMQ】RabbitMQ 的七种工作模式介绍

目录 1. Simple(简单模式) 2. Work Queue(工作队列) 3. Publish/Subscribe(发布/订阅) 4. Routing(路由模式) 5. Topics(通配符模式) 6. RPC(RPC通信) 7. Publisher Confirms(发布确认) 上一篇文章中我们简单认识了RabbitM1: 【RabbitMQ】RabbitMQ 的概念以及使用Rabb…

【Qt】窗口关闭提示框

在关闭QWdiget窗口时弹出提示框 重写**closeEvent**函数 void closeEvent(QCloseEvent* event) override;QMessageBox *msgBox new QMessageBox(QMessageBox::Question, "信息提示", "是否保存当前数据&#xff1f;", QMessageBox::Save | QMessageBox::N…

github克隆项目中的子模块submodule时遇到“无法访问远程仓库,请检查权限“

问题描述 在拉取仓库的时候发现了新东西。 仓库中有两个文件夹提示 点击之后&#xff0c;发现跳转到了另一个仓库 &#xff0c;原来这是仓库的子模块&#xff0c;第一次见&#xff0c;也就是仓库中包含了其他的的仓库&#xff0c;就是这么简单的原理。 但是在拉取仓库以后发现…

VScode环境配置

目录 好用插件推荐 1.Auto Rename Tag 2.openbrowser 3.实时预览&#xff08;推荐&#xff09; VSCode常用的快捷键 1. 快速复制一行 2.快速复制一行代码选定多个相同的单词 3. 添加多个光标 4. 全局替换某写单词 5. 快速定位到某一行 6. 选择某个区块 7. 放大缩…

高一全栈开发;国产 Arc 浏览器;Tauri 2.0 发布 | 生活周刊 #3

发现新应用 Vectorcraftr Vectorcraftr 提供免费可商用的插画库&#xff0c;风格有很多&#xff0c;自行食用 书立 一款功能强大、特性丰富的笔记软件&#xff0c;包含富文本&#xff0c;双链&#xff0c;表格&#xff0c;富目录树&#xff0c;WebDAV &#xff0c;自由导出等…

WPF 为button动态设置不同的模板

有时候需要动态的设置一些按钮的状态模板。使一个button显示不同的内容&#xff0c;比如Button未点击安装显示&#xff1a; 安装后显示&#xff1a; 可以通过设置button的content&#xff0c;通过content来设置不同的模板来实现功能&#xff0c;以下是代码&#xff1a; MainWi…

【消息队列】Kafka从入门到面试学习总结

国科大学习生活&#xff08;期末复习资料、课程大作业解析、大厂实习经验心得等&#xff09;: 文章专栏&#xff08;点击跳转&#xff09; 大数据开发学习文档&#xff08;分布式文件系统的实现&#xff0c;大数据生态圈学习文档等&#xff09;: 文章专栏&#xff08;点击跳转&…

CentOS7安装Gitlab服务

文章目录 前言一、安装依赖二、安装gitlab1、上传安装2、修改配置 三、启动gitlab服务四、修改密码五、设置为中文&#xff08;低版本有问题&#xff09;六、常用命令 前言 文中gitlab版本为&#xff1a; gitlab-ce-14.2.7 一、安装依赖 gitlab需要安装如下依赖&#xff0c;否…

Linux编辑器-vim的配置及其使用

vim是一种多模式的编辑器&#xff1a; 1.命令模式&#xff08;默认模式&#xff09;&#xff1a;用户所有的输入都会当作命令&#xff0c;不会当作文本输入。 2.插入模式&#xff1a;写代码&#xff0c; 按「 i 」切换进入插入模式「 insert mode 」&#xff0c;按 “i” 进入…

2024/10/13周报

文章目录 摘要Abstract文献阅读题目1. 背景与问题提出2. 提出的CLATT方法2.1 卷积神经网络&#xff08;CNN&#xff09;2.2 长短期记忆网络&#xff08;LSTM&#xff09;2.3 注意力机制2.4 滑动窗口方法 3. 实验设计与结果3.1 数据集3.2 实验基线与评价指标3.3 实验结果与分析 …

使用清华大学开源软件镜像站下载JDK

在软件开发和日常使用中&#xff0c;Java Development Kit&#xff08;JDK&#xff09;是不可或缺的一部分。它提供了Java运行环境和开发工具&#xff0c;使得开发者可以编写、编译和运行Java应用程序。本文将指导你如何从清华大学开源软件镜像站&#xff08;TUNA&#xff09;下…

通信工程学习:什么是UART通用异步收发器

UART&#xff1a;通用异步收发器 UART&#xff0c;全称Universal Asynchronous Receiver/Transmitter&#xff0c;即通用异步收发传输器&#xff0c;是一种广泛应用于嵌入式领域的串行、异步、全双工通信协议。以下是关于UART的详细介绍&#xff1a; 一、定义与特点 定义&…

数据分析:R语言计算XGBoost二分类模型的SHAP值

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍SHAP用途计算方法:应用加载R包导入数据建模平均SHAP值计算单个样本的每个特征的SHAP值蜜蜂图依赖图单个样本的SHAP解释(Force Plot)其他方法计算SHAP值单个个体预测结果系统信息…

MLM之Llama-3:Llama 3.2的简介、安装和使用方法、案例应用之详细攻略

MLM之Llama-3&#xff1a;Llama 3.2的简介、安装和使用方法、案例应用之详细攻略 目录 Llama 3.2 简介 1、Llama 3.2 的特点 2、模型评估 轻量级指令调优基准 视觉指令调整基准 Llama 3.2 的安装和使用方法 1、下载模型 2. 开发环境准备 3. 使用模型进行推理和微调 4…

Ubuntu命令行快速部署C++语言的GDAL库

本文介绍在Linux系统的Ubuntu电脑中&#xff0c;在命令行中一句代码快速配置C 环境下的gdal库的方法。 在文章Ubuntu基于Docker快速配置GDAL的Python、C环境&#xff08;https://blog.csdn.net/zhebushibiaoshifu/article/details/133433838&#xff09;中&#xff0c;我们就介…

【JVM】内存模型

文章目录 内存模型的基本概念案例 程序计数器栈Java虚拟机栈局部变量表栈帧中局部变量表的实际状态栈帧中存放的数据有哪些 操作数栈帧数据 本地方法栈 堆堆空间是如何进行管理的? 方法区静态变量存储 直接内存直接内存的作用 内存模型的基本概念 在前面的学习中,我们知道了字…