vscode 插件_vscode插件体系详解

vscode 作为一款网红 IDE,其丰富的插件让人叹为观止,通过 vscode 提供的插件机制,我们几乎可以自定义 vscode 的所有细节。事实上很多 vscode 的核心功能也是通过插件实现的。

本文我们将从以下三个方面详述 vscode 的插件机制:

  • 插件的基本结构

  • 插件执行环境

  • 插件的运行流程

阅读本文后续内容,需要对 vscode 的插件开发有基本的了解。关于 vscode 的插件开发可参考 vscode 的官方教程 。

1. 插件基本结构

vscode 的官方教程 中有详细的插件开发文档;并且在 github 上提供了丰富插件案例, 从 UI 定制到代码自动补全都有可借鉴性很高的 demo。本文并不打算详诉插件开发的细节,我们更多的关注 vscode 是如何设计和实现这套插件架构的。

我们首先从一个插件项目的 package.json来了解其基本结构。 package.json中 main 指定了插件的入口函数,而 contributes 和 activationEvents 分别描述的插件的扩展点和触发事件。如下面代码所示:

"main": "./out/extension.js","contributes": {
        "commands": [        {
          "command": "extension.helloWorld",       "title": "Hello World"   }    ]}"activationEvents": [    "onCommand:extension.helloWorld"]

扩展点和触发事件是两个比较重要的概念,我们先简单解释下,后续讲到插件注册时再详细描述。

contributes(扩展点)用于定义插件要扩展 vscode 哪部分功能;vscode 暴露出多个扩展点,包括 commands (命令面板)、configuration (配置模板)等

activationEvents(触发事件)用于定义插件何时执行,当指定的事件发生时插件才会执行

有一类特殊的插件的 activationEvents为通配符 *,这类插件称为 EagerExtensions,它们会在插件环境初始化完成后自动执行,而不需要其他事件触发。

2. 插件执行环境

vscode 的第三方插件的质量往往难以保证,因此需要设计一套隔离机制,将核心功能和第三方插件的执行环境隔离,保证第三方插件挂了,vscode 的核心功能依然可用。由于不想增加理解成本,本文所讲的 vscode 插件机制是指纯 web 版 vscode,和基于 electron 的桌面版 vscode 原理类似。

插件环境初始化入口的在 vs/workbench/services/extensions/browser/extensionService.ts的构造函数中, _initialize函数中的第一步就是初始化插件执行环境。

protected async _initialize(): Promise<void> {
        perf.mark('willLoadExtensions');    this._startExtensionHostProcess(true, []);  //启动插件worker进程,建立rpc通道,注入api    this.whenInstalledExtensionsRegistered().then(() => perf.mark('didLoadExtensions'));    await this._scanAndHandleExtensions();     this._releaseBarrier();}

2.1 环境隔离与通信

(1)worker 进程创建

插件环境初始化的第一步就是创建一个 webworker 用于运行插件逻辑,防止不可信的插件影响到 vscode 核心功能。通过调用 vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts的 start方法创建一个新的webworker作为插件的执行环境。

const url = getWorkerBootstrapUrl(require.toUrl('../worker/extensionHostWorkerMain.js'), 'WorkerExtensionHost');const worker = new Worker(url, { name: 'WorkerExtensionHost' });
(2)主进程与 worker 信道建立

webWorkerExtensionHostStarter.ts的 start方法在创建 webworker 后就封装一个 IMessagePassingProtocol接口返回。如下代码所示:

start(){
       .....   const protocol: IMessagePassingProtocol = {
            onMessage: emitter.event,  send: vsbuf => {
          const data = vsbuf.buffer.buffer.slice(vsbuf.buffer.byteOffset, vsbuf.buffer.byteO
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VSCode 是一款流行的代码编辑器,并且内置了对 Git 的支持。然而,在使用 VSCode 和 Git 进行协作开发时,经常会遇到一些困难。 首先,可能会遇到的一个常见问题是 VSCode 无法检测到已经安装的 Git。解决这个问题的方法是确保已经正确安装了 Git 并将其添加到环境变量中。还可以在 VSCode 的设置中配置 Git 的路径,使其能够正确找到 Git 的安装位置。 其次,还可能会遇到无法进行 Git 操作的情况。这可能是因为当前打开的文件夹不是一个 Git 仓库,或者 Git 仓库中存在冲突的文件。解决这个问题可以通过在 VSCode 中打开包含 Git 仓库的文件夹或者使用命令行工具来进行 Git 操作。 此外,还有可能会遇到合并冲突的情况。当多个开发者同时修改同一个文件时,可能会在合并时引发冲突。解决这个问题可以使用 VSCode 的内置的冲突解决工具,允许用户手动解决冲突并进行合并。 最后,有时会发现在 VSCode 中进行的 Git 操作没有生效或者没有正确显示。这可能是因为 VSCode 的 Git 插件版本不兼容当前使用的 Git 版本。解决这个问题可以尝试更新 VSCode 和 Git 插件到最新版本,或者在 VSCode 的设置中进行相关配置。 总结来说,VSCode 使用 Git 时可能会遇到一些坑,但这些问题大多可以通过正确安装和配置 Git,打开正确的文件夹或者仓库,并更新相关软件来解决。熟悉这些问题的存在并了解如何解决它们,将使得在 VSCode 上使用 Git 更加顺利和高效。 ### 回答2: 在使用VSCode时,有时可能会遇到一些与Git相关的问题,以下是一些常见的坑以及解决方法。 1. Git安装问题:在使用VSCode之前,我们需要确保已正确安装了Git。如果遇到Git安装失败或无法识别的情况,可以尝试重新安装或更新Git,并确保将Git可执行文件路径添加到系统环境变量中。 2. 版本控制:在VSCode的左侧边栏中有一个Git图标,可以使用它来管理版本控制。如果没有看到该图标,可能需要手动打开版本控制功能。确保已打开工作区,右键单击文件夹并选择“初始化Git仓库”。 3. 提交更改:在编辑器中通过对文件进行更改后,可以单击Git图标,然后单击“加号”将更改添加到暂存区。之后可以在提交信息框中输入一些有意义的消息,并点击“√”来提交更改。如果未选择文件或未输入提交信息,提交操作可能会失败。 4. 分支管理:在VSCode中,可以通过在分支选择器旁边的下拉菜单中创建新分支、切换分支以及合并分支。在这一过程中,确保已经保存并提交所有修改,否则可能会导致分支切换或合并失败。 5. 冲突解决:在多人协作开发时,可能会出现冲突。当多人在同一行或同一区域进行修改时,Git无法自动解决冲突。在这种情况下,需要手动解决冲突。VSCode会自动标记冲突,并提供解决冲突的选项。 6. 远程仓库:通过VSCode,可以方便地添加、克隆或推送到远程仓库。只需在左侧边栏单击Git图标,然后点击“...”按钮,选择相应的操作。确保已正确配置远程仓库的URL、用户名和密码。 以上是在使用VSCode时可能遇到的一些与Git相关的坑以及解决方法。通过仔细阅读文档、搜索网络上的解决方案以及多尝试,我们可以更好地使用VSCode进行Git版本控制,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值