vscode扩展插件开发实战记录
最近在做一个前端动态主题替换的项目,我们架构侧定义了一批颜色变量(基于Css Variables),要求所有项目中,不得写死色值,所有颜色设置都要使用css变量来定义。
此要求一出,相关项目负责人立刻反馈了开发成本提升的问题,希望架构侧能提供一些工具上的支持。因此就有了此插件的需求。
初始化项目
环境准备
- nodejs 建议使用 LTS 版本
- Yeoman 脚手架工具
- generator-code VSCode代码生成器
vscode官方推荐使用Yeoman脚手架系统来初始化插件项目,因此,首先第一步要安装yo,我们这里连同VSCode代码生成器一起安装了:
1 | npm install -g yo generator-code |
初始化项目
1 | yo code |
根据提示,自行按步骤选择或输入相关信息,系统会自动生成项目模板。
初始化成功后,vscode会提示是否用vscode单独打开项目独立窗口,我们按照默认打开项目。
运行项目
初始化成功的项目,已经自动生成launch.json
文件,我们只需要打开vscode运行和调试
面板,点击Run Extension
即可启动项目。
项目运行成功后,会自动打开一个vscode测试窗口。
在新窗口中,打开命令面板(ctrl+shift+p),输入hello world
,选择执行hello world
命令:
在窗口右下角弹出Hello world from vscode-css-var-replace
的提示框,就表示我们的项目已经运行成功并且生效。
调试
vscode插件的调试方式一般有两种:
console
:vscode中集成了标准的console系统,输出窗口位于编辑器底部调试控制台
;
- 直接在编辑器中打断点,然后运行过程中会在指定位置中断程序,把鼠标悬停在相应代码,即可弹出变量的相关信息。
以上,我们的demo已经成功跑起来了。
环境介绍
接下来,我们来了解一下开发和配置环境。
项目目录结构
1 | ├── CHANGELOG.md ## 插件更新日志说明文档,用来后期版本迭代的说明 |
package.json
package.json
是开发vscode插件的核心配置文件,插件的名称、描述、搜索关键词、激活时机和激活命令等都是在此配置
activationEvents
1 | "activationEvents": [ |
激活时机,类似于VUE的声明周期的概念。在VS Code中,插件都是懒加载的,所以你得为VS Code提供插件激活的时机。
vscode中默认提供了以下激活时机:
onLanguage:${language}
: 特定语言文件打开时激活。onCommand:${command}
: 当调用命令时激活。onDebug
: 调试会话(debug session)启动前激活。workspaceContains:${toplevelfilename}
: 文件夹打开后,且文件夹中至少包含一个符合glob模式的文件时触发。onFileSystem:${scheme}
: 从协议(scheme)打开的文件或文件夹打开时触发。通常是file-协议,也可以用自定义的文件供应器函数替换掉,比如ftp
、ssh
。onView:${viewId}
: 指定的视图id展开时触发。onUri
: 插件的系统级URI打开时触发。这个URI协议需要带上vscode或者vscode-insiders协议。URI授权必须是插件的唯一标识,剩余的URI是可选的。*
: 当VS Code启动时触发。为了保证良好的用户体验,只在你的插件没有其他任何激活事件的前提下,添加这个激活事件。
contributes
我们可以在此注册插件的激活方式,插件的激活方式主要有以下三种:
首先,参考我们当前项目的配置
1 | "contributes": { |
以上配置,分别注册了三种激活方式:
commands
: 注册命令,在vscode
使用快捷键(ctrl+shift+p
)打开命令面板,输入replace selected code
来激活插件menus
: 注册右键菜单,在vscode
点击右键打开右键菜单,选择replace selected code
来激活插件keybindings
: 注册快捷键,在vscode
中,使用快捷键(ctrl+f10
)来激活插件
相关关键词
menus
下的editor/context
是配置场景自定义菜单,定义这个菜单出现在哪里;when
控制菜单合适出现;command
定义菜单被点击后要执行什么操作;alt
定义备用命令,按住alt键打开菜单时将执行对应命令;group
定义菜单分组;
目前插件可以给以下场景配置自定义菜单:
- 资源管理器上下文菜单 -
explorer/context
- 编辑器上下文菜单 -
editor/context
- 编辑标题菜单栏 -
editor/title
- 编辑器标题上下文菜单 -
editor/title/context
- 调试callstack视图上下文菜单 -
debug/callstack/context
- SCM标题菜单 -
scm/title
- SCM资源组菜单 -
scm/resourceGroup/context
- SCM资源菜单 -
scm/resource/context
- SCM更改标题菜单 -
scm/change/title
- 左侧视图标题菜单 -
view/title
- 视图项菜单 -
view/item/context
- 控制命令是否显示在命令选项板中 -
commandPalette
when语句语法有很多,这里列举几个常用的:
resourceLangId == javascript
:当编辑的文件是js文件时;resourceFilename == test.js
:当当前打开文件名是test.js时;isLinux
、isMac
、isWindows
:判断当前操作系统;editorFocus
:编辑器具有焦点时;editorHasSelection
:编辑器中有文本被选中时;view == someViewId
:当当前视图ID等于someViewId时;
configuration
通过configuration
我们可以设置一个属性,这个属性可以在vscode的settings.json中设置,然后在插件工程中可以读取用户设置的这个值,进行相应的逻辑。
参考我们当前项目的配置
1 | "configuration": [{ |
此配置声明了vscode-css-var-replace.files
属性,我们可以在vscode
设置文件settings.json
中配置此CSS
变量替换插件的CSS
变量声明文件。
1 | "vscode-css-var-replace.files": [ |
功能实现
实现替换的核心类
1 | // process.ts |
在extension.ts
中对需要的功能进行注册,主要使用vscode.commands.registerTextEditorCommand
相关的api
,来为package.json
中的contributes
配置项中的事件绑定方法或者监听器。
1 | // extension.ts |
核心功能相对较简单,只针对当前的需求,没考虑过多的优化。如果有啥意见或建议,欢迎指出。
插件打包
vscode
插件支持打包成单独的vsix
文件,并通过手动安装到vscode
中使用。插件打包功能依赖vsce
(Visual Studio Code Extensions
)。
安装
1 | npm install -g vsce |
用法
1 | vsce package |
我在开发这个插件时,打包过程出了点问题,插件默认配置有一些干扰,需要手动配置
package.json
的scripts
,添加package: vsce package
,并且清理掉README.md
内容,才能正常打包,这些都是多次尝试得出的结果,并没有查到相关资料。
插件发布
插件开发完了,我们分享给他人使用呢?通常有三种方式
- 直接把源码发给别人,用调试的方式使用,一般不推荐;
- 把我们打包好的
vsix
文件发给别人,然后手动安装,如果你的插件没什么通用性,或者涉及机密不方便发布到应用市场,可以尝试采用这种方式; - 注册开发者账号,发布到官网应用市场,这个发布和
npm
一样是不需要审核的。
发布到应用市场的流程
在网站https://dev.azure.com/vscode获取一个
access token
,这个token
用来创建一个publisher
创建
publisher
1 | vscr create-publisher (publisher name) |
- 登入一个
publisher
1 | vscde login (publisher name) |
- 打包
1 | vsce package |
- 发布
1 | vsce publish |