前端从零到一开发vscode插件并发布到插件市场
- 背景
- 目标
- 成果展示
- 一条龙实现过程
- 安装插件脚手架和工具
- 创建项目
- 运行
- 调试
- 打包
- 第一次打包前的必要操作
- 发布
- 第一次发布前账号准备
- 注册Azure DevOps发布账号-获取token
- 注册vscode开发者账号
- 终端登录vsce
- 发布方式2-手动上传插件
- 进阶
- 开发代码片段插件
- 创建代码片段
- 配置package.json
- 结果展示
- 其他
- package.json介绍
- contributes
背景
vscode作为前端开发神器,功能十分强大,这背后是大量vscode插件在支持。比如用react的snippets插件,只需输入rfc即可快速生成一个模版,大大提高了我们的开发效率,也可提早下班。
作为多年的资深前端,假如我们开发一个好用的插件,同事用上我们的插件,不得大大的说声牛逼😎,同时也是提高段位和收入的好方法。
开发插件的路并非一帆风顺,今天就记录下开发插件的过程和踩过的坑
所有的步骤都已走通,如果有帮助,请小伙伴们点赞关注😄
下边进入主题
目标
- 初级:掌握注册、开发、发布全流程-用小demo实现
- 进阶:开发代码片段差价
成果展示
大家可在vscode搜索taro-code
输入代码提示效果
一条龙实现过程
安装插件脚手架和工具
# 安装插件脚手架-可快速生成项目
npm install -g yo generator-code# 安装插件发布工具
npm install -g vsce
创建项目
终端 yo code
注意:创建时不要选pnpm,否则后续很麻烦
运行
npm run watch
调试
在 VSCode 中按下 F5 会进入调试状态,这时候会自动打开一个名为 扩展开发宿主 的新窗口。
再在新窗口中,按下 command + shift + p 或 ctrl + shift + p,在里面输入我们插件注册的命令名,按下回车就能触发回调。
打包
打包指令:
vsce package// 列出已发布的扩展
vsce ls// 成功标志
跟目录下出现 taro-code-0.0.1.vsix 文件即可
第一次打包前的必要操作
- 第一次打包需要修改readme.md的内容-否则报错
- package.json填写发布人,仓库信息
{// 1.添加开发者账号"publisher": "jerrycc",// 2.添加仓库,处理报错"repository": "git+https://github.com/username/xxx.git""scripts": {}
}
- 添加LICENSE.md
根目录下增加LICENSE.md文件,即可
发布
vsce publish -p token令牌
第一次发布前账号准备
参考:https://blog.csdn.net/qq_36947128/article/details/136171963
注册Azure DevOps发布账号-获取token
目的:使用token在终端登录vsce账号,然后才能发布
- 进入 https://dev.azure.com/
- 创建项目,生成token
- 生成token时一定注意 1. 选 all accessible organizations, 2.点击右下角的 Show all scopes 找到 Marketplace 选择 Manage。 否则发布会失败
- 将生成的token保存,否则找不到,注:可以重新生成。
认真看,下边两项不能选错,否则发布失败
注册vscode开发者账号
- 若没有vscode账号需要去注册:https://marketplace.visualstudio.com/manage/createpublisher?managePageRedirect=true。
- vscode发布者中心:https://marketplace.visualstudio.com/manage
终端登录vsce
// 输入账号
vsce login jerrycc// 回车后输入token
ga2fokrzz6drvuwddy3x2onyluenvvbkipa5jpigv7sf77yttgma// 登录成功
// 发布
// vsce publish
发布方式2-手动上传插件
访问Visual Studio Marketplace,并登陆上一节中创建的Microsoft账户,然后点击右上角的Publish extension
进阶
开发代码片段插件
创建代码片段
示例:root/snippets/tarocode.code-snippets,注意后缀名
注:是json格式,可以用此网站转化 https://snippet-generator.app/
{"zyfbtn": {"prefix": "zyfbtn","body": ["<div>"," <button>我是zyfbtn</button>","</div>",""],"description": "zyfbtn"}
}
代码转化为json
配置package.json
为了支持react和ts,可配置4份
"contributes": {"snippets": [{"language": "javascript","path": "./snippets/tarocode.code-snippets"},{"language": "javascriptreact","path": "./snippets/tarocode.code-snippets"},{"language": "typescript","path": "./snippets/tarocode.code-snippets"},{"language": "typescriptreact","path": "./snippets/tarocode.code-snippets"}],
}
搞定
结果展示
其他
package.json介绍
{// 插件的名字,应全部小写,不能有空格"name": "fast-admin",// 插件的友好显示名称,用于显示在应用市场,支持中文"displayName": "fast-admin",// 描述"description": "Quickly generate admin page",// 版本号"version": "0.0.1",// 插件最低支持的vscode版本"engines": {"vscode": "^1.48.0"},// 插件应用市场分类,可选值: [Programming Languages, Snippets, Linters, Themes, Debuggers, Formatters, Keymaps, SCM Providers, Other, Extension Packs, Language Packs]"categories": ["Other"],/** 扩展的激活事件数组,可以被哪些事件激活扩展:** 1.onLanguage:${language}** 2.onCommand:${command}** 3.onDebug** 4.workspaceContains:${toplevelfilename}** 5.onFileSystem:${scheme}** 6.onView:${viewId}** 7.onUri** 8.***/"activationEvents": ["onCommand:fast-admin.helloWorld"],// 插件的主入口"main": "./extension.js",// 贡献点,整个插件最重要最多的配置项,下面单独列出"contributes": {// 命令"commands": [{"command": "fast-admin.helloWorld","title": "Hello World"}]},// 同 npm scripts"scripts": {"lint": "eslint .","pretest": "npm run lint","test": "node ./test/runTest.js"},// 开发依赖"devDependencies": {"@types/vscode": "^1.48.0","@types/glob": "^7.1.3","@types/mocha": "^8.0.0","@types/node": "^14.0.27","eslint": "^7.6.0","glob": "^7.1.6","mocha": "^8.0.1","typescript": "^3.8.3","vscode-test": "^1.4.0"},// 以下为一些非关键配置// 关键字,用于应用市场搜索"keywords": ["vscode", "plugin", "fast", "admin"],// 发布者,如果要发布到应用市场的话,这个名字必须与发布者一致"publisher": "kukudelaomao",// 插件图标,至少128x128像素"icon": "images/icon.png",// 许可"license": "SEE LICENSE IN LICENSE.txt",// 问题"bugs": {"url": "https://github.com/kukudelaomao/fast-admin/issues"},// 仓库"repository": {"type": "git","url": "https://github.com/kukudelaomao/fast-admin"},// 主页"homepage": "https://github.com/kukudelaomao/fast-admin/blob/master/README.md"
}
contributes
- configuration:设置
- commands:命令
- menus:菜单
- keybindings:快捷键绑定
- languages:新语言支持
- debuggers:调试
- breakpoints:断点
- grammars
- themes:主题
- snippets:代码片段
- jsonValidation:自定义JSON校验
- views:左侧侧边栏视图
- viewsContainers:自定义
- activitybar
- problemMatchers
- problemPatterns
- taskDefinitions
- colors
"contributes": {// 插件配置项"configuration": {"type": "object",// 配置项标题,会显示在vscode的设置页"title": "vscode-plugin-demo","properties": {// 这里我随便写了2个设置,配置你的昵称"vscodePluginDemo.yourName": {"type": "string","default": "guest","description": "你的名字"},// 是否在启动时显示提示"vscodePluginDemo.showTip": {"type": "boolean","default": true,"description": "是否在每次启动时显示欢迎提示!"}}},// 命令"commands": [{"command": "extension.sayHello","title": "Hello World"}],// 快捷键绑定"keybindings": [{"command": "extension.sayHello","key": "ctrl+f10","mac": "cmd+f10","when": "editorTextFocus"}],// 菜单"menus": {// 编辑器右键菜单"editor/context": [{// 表示只有编辑器具有焦点时才会在菜单中出现"when": "editorFocus","command": "extension.sayHello",// navigation是一个永远置顶的分组,后面的@6是人工进行组内排序"group": "navigation@6"},{"when": "editorFocus","command": "extension.demo.getCurrentFilePath","group": "navigation@5"},{// 只有编辑器具有焦点,并且打开的是JS文件才会出现"when": "editorFocus && resourceLangId == javascript","command": "extension.demo.testMenuShow","group": "z_commands"},{"command": "extension.demo.openWebview","group": "navigation"}],// 编辑器右上角图标,不配置图片就显示文字"editor/title": [{"when": "editorFocus && resourceLangId == javascript","command": "extension.demo.testMenuShow","group": "navigation"}],// 编辑器标题右键菜单"editor/title/context": [{"when": "resourceLangId == javascript","command": "extension.demo.testMenuShow","group": "navigation"}],// 资源管理器右键菜单"explorer/context": [{"command": "extension.demo.getCurrentFilePath","group": "navigation"},{"command": "extension.demo.openWebview","group": "navigation"}]},// 代码片段"snippets": [{"language": "javascript","path": "./snippets/javascript.json"},{"language": "html","path": "./snippets/html.json"}],// 自定义新的activitybar图标,也就是左侧侧边栏大的图标"viewsContainers": {"activitybar": [{"id": "beautifulGirl","title": "美女","icon": "images/beautifulGirl.svg"}]},// 自定义侧边栏内view的实现"views": {// 和 viewsContainers 的id对应"beautifulGirl": [{"id": "beautifulGirl1","name": "美女1"},{"id": "beautifulGirl2","name": "美女2"},{"id": "beautifulGirl3","name": "美女3"}]},// 图标主题"iconThemes": [{"id": "testIconTheme","label": "测试图标主题","path": "./theme/icon-theme.json"}]},
参考:
搭建到发布:https://blog.csdn.net/m0_74802419/article/details/136228018
处理打包报错:https://blog.csdn.net/crper/article/details/137558270
vscode如何发布:https://blog.csdn.net/bulucc/article/details/137837339
1.解决vsce发布失败的问题 2.如何开发代码片段 https://blog.csdn.net/qq_36947128/article/details/136171963
将代码转化为json 格式: https://snippet-generator.app/