vscode插件开发

这篇具有很好参考价值的文章主要介绍了vscode插件开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

如何编写一个vscode插件

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

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

生成的项目目录结构如下:vscode插件开发vscode插件的核心实现主要在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结尾的文件vscode插件开发vscode插件的安装支持本地安装和插件应用市场两种安装形式。本地安装的话,可以通过以下步骤安装上一步生成的.vsix文件。vscode插件开发发布到应用市场安装的话,就需要在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 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。
文章来源地址https://www.toymoban.com/news/detail-413516.html

到了这里,关于vscode插件开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端vscode必备插件

    1、Auto Rename Tag⭐ 修改标签会同步修改 2、Auto Import - ES6, TS, JSX, TSX 自动查找、解析并为所有可用导入提供代码操作和代码完成。适用于 JavaScript (ES6) 和 TypeScript (TS) 3、Code Runner⭐ 快速运行 调试js 4、CSS Peek 跳转对应 css 5、DotENV 高亮ENV文件 6、Error Lens 显示错误 7、ESLint 8、GitL

    2024年02月03日
    浏览(39)
  • 前端vscode必备插件推荐

    目录 一、前言 二、工具推荐 1.《Chinese (Simplified) (简体中文) Language》 2.《ESLint》 3.《Git History》 4.vscode-icons  5.Path Intellisense 6.《Vetur》 7.《GitLens — Git supercharged》 8.《Image preview》 9.Debugger for Chrome 10.Prettier 11.AnyRule  13.Vue Language Features (Volar) 14.Vite 15.Code Spell Checker 16.Error Lens

    2023年04月09日
    浏览(57)
  • 【VScode】前端必备插件(全)

    Chinese (Simplified) 适用于 VS Code 的中文(简体)语言包 Auto Close Tag 自动闭合HTML/XML标签 Auto Rename Tag 自动重命名配对的HTML/XML标记 ,完成另一侧标签的同步修改 Path Intellisense 自动提示文件路径,支持各种快速引入文件,支持自动补全 Bracket Pair Colorizer 给括号加上不同的颜色,便

    2024年02月09日
    浏览(50)
  • 前端vscode必备插件(强烈推荐)

    目录 一、前言 二、工具推荐 1.《Chinese (Simplified) (简体中文) Language》 2.《ESLint》 3.《Git History》 4.vscode-icons  5.Path Intellisense 6.《Vetur》 7.《GitLens — Git supercharged》 8.《Image preview》 9.Debugger for Chrome 10.Prettier 11.AnyRule  13.Vue Language Features (Volar) 14.Vite 15.Code Spell Checker 16.Error Lens

    2024年02月06日
    浏览(65)
  • 作为前端开发,你了解MutationObserver吗?

    目录 前言 演变过程 基础概念 MutationObserver observe(target, options) attributes:是否监听标签属性变化 childList:是否监听子节点变化 characterData:是否监听文本节点内容的变化 attributeOldValue:是否记录属性变化前的值 characterDataOldValue:是否记录文本节点内容变化前的值 subtree:是否

    2024年02月08日
    浏览(40)
  • VSCode前端必备插件2022版(持续更新)

    VSCode作为我们前端主流的开发工具,优势自然在于它的扩展插件,可以有效地提高开发效率和团队协作,本文提高的都是UP主亲测,最底下贴入我的vscode设置,如果有发现不错的插件,小伙伴们也可以私信UP主,觉得UP主推荐的不错的小伙伴们,请多多支持!话不多说直接上。

    2023年04月26日
    浏览(45)
  • 【vscode编辑器插件】前端 php unity自用插件分享

    “思考是最困难的工作,这也许是为什么很少有人这样做。” - 亨利·福特(Henry Ford) 无论是什么语言,我都会选择使用vscode进行开发,我愿称vscode为万能编辑器,他之所以这么强大,得益于丰富的免费插件市场 vscode插件五花八门,但也不是装越多越好,不必要和垃圾插件

    2024年02月07日
    浏览(61)
  • 简直不能相信!这款IDE仅插件10秒写出飞机大战游戏,太神奇了!

    昨天分享了一款可以帮我们写代码的插件 CodeGeex ,其实能帮我们解决大部分问题,讲道理已经很好了对不对? but ,他就是最好的插件吗? 肯定不是,这不又让我又发现了一款可以平替的插件 TONGYI Lingma (阿里云出品智能编码助手通义灵码)。 可能有同学会问了,那六哥这

    2024年02月06日
    浏览(43)
  • Vscode常用插件及设置(前端版,实时更新ing

    写完代码后鼠标右击将代码在浏览器中运行 汉化Vscode html、css、js、less图标显示 代码块写完后使用Live Server,每次修改代码Ctrl+S后浏览器无需再刷新即可跟着变化, 与win+左键或win+右键搭配爽歪歪,直接效率起飞!!! 外联样式提示插件 错误提示信息 将.less文件生成一个.

    2024年02月02日
    浏览(46)
  • 我做了一个 VSCode 插件版的 ChatGPT

    大家好,我是风筝 其实很早之前就想学学 VSCode 插件开发了,但是又不知道做什么,加上我这半吊子前端水平,迟迟没有动手。 最近 ChatGPT 火的一塌糊涂,我也一直在用,真的非常好用,有些问题之前需要 Google 搜索,现在用 ChatGPT 基本上都能直接解决,效率提升了不少。

    2024年02月03日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包