Skip to content

Latest commit

 

History

History
109 lines (103 loc) · 6.22 KB

插件开发篇-1.vscode插件开发回顾总结.md

File metadata and controls

109 lines (103 loc) · 6.22 KB

vscode插件开发回顾总结

前言

  • 前后断断续续花费了大概快两个星期的时间,终于完成了课程配套vscode插件的MVP版本,算是从vscode插件开发小白晋升到了菜鸟,过程中有很多踩坑的经历,记录一下就当是这次的一个总结吧(本文仅适用于踩坑求解),vscode插件开发的系列文章教程网上也有一些,这里就不重复了。 接下来就直奔主题啦~
  • 开发的插件: avator

踩坑实录
1.网页端拉起vscode并激活插件时获取到的uri协议路径不对

    //若想通过网页端拉起vscode并激活指定插件,则拉起链接应当符合以下格式:
    ` vscode://[publisherName].[pluginName]/your-url?aaa=xxx&bbb=xxx... `
    // 如:vscode://bellcodedev.python-course-plugin/diy?a=1&b=2
    // 因此,若想成功激活vscode插件,则在插件的package.json文件中一定要配置publisher字段

2.无法获取插件启动页html文件

    // 在vscode插件入口js文件中若想加载指定的html文件作为插件的webview启动页时,加载的本地html资源路径需以插件全局上下文对象的扩展路径 + html文件的相对路径,格式如下: 
    const resourcePath = path.join(context.extensionPath, templatePath);
    // 如: const resourcePath = path.join(context.extensionPath, 'src/view/index.html');

3.自定义webview启动页内无法调用vscode相关操作

    // 相比普通的浏览器网页,vscode插件内的webview页面内独有一个acquireVscodeApi()方法,可用于调用vscode相关操作
    // 如在webview引入的js文件中,可在顶部加入如下代码即可使用vscode在webview中提供的方法:
    const vscodeApi = acquireVscodeApi();
    vscodeApi.xxx

4.webview页面与vscode插件之间的通信

    // 紧接上一坑,在拿到vscodeApi后,即可实现webview同vscode插件之间的消息通信
    // 1.webview向插件发送消息,在webview中通过vscodeApi.postMessage(),如:
    vscodeApi.postMessage({ type: 'init', value: { ...params } });    // 传输的对象格式可自定义,满足自己的需求即可
    // 2.在webview中监听来自插件的消息
    window.addEventListener('message', handler);
    handler = message => {
        const { type, value } = message;
        switch (type) {
            case 'init':
                //...
                break;
            case 'complete':
                //...
                break;
            default:
                //...
        }
    }
   // 3.在插件中向webview发送消息
   const webviewPanel = vscode.window.createWebviewPanel(
       'study_ststem',  // 标识类型
       '学习系统' // webview的头标题
       vscode.ViewColumn.one,   //创建并显示webview时该webview的显示位置
       {
           enableAcripts: true,  //是否启动JS
           retainContextWhenHidden: true,   //设置此项可在当前webview转为背景选项卡(即未聚焦)时不销毁当前webview,避免再次显示时重新渲染(但设置为true时会有一定的性能影响)
           //...    其他配置项
       }
   )
   webviewPanel.webview.postMessage({ type: 'showInit', value: { ...params }});
   // 4.插件接收来自webview发送的消息
   webviewPanel.webview.onDidReceiveMessage( message => {
       webviewMessageHandler(message);  //自定义webviewMessageHandler函数处理消息
   })
    

5.webview页面的头部icon显示

    // icon资源的加载:
    welcomePanel.iconPath = Uri.file(path.join(context.extensionPath, 'images/webview-icon-path.png'));

6.webview页面的头部icon显示

    // icon资源的加载:
    welcomePanel.iconPath = Uri.file(path.join(context.extensionPath, 'images/webview-icon-path.png'));

7.开发过程中数据持久化存储

    // vscode插件的全局上下文context对象有提供一个globalState对象,可通过该对象的get/update方法来获取和存储想持久化的数据哦,如下示例:
    const userName = context.globalState.get(USER_NAME, '');
    context.globalState.update(USER_NAME, 'ferris');

8.vscode StatusBar按钮icon自定义问题

    // vscode插件开发过程中,若想在vscode底部工具栏加上自己插件的操作按钮,则可通过注册一个StatusBarItem来实现,但目前还无法实现给Item添加自定义icon图标,仅能使用官方提供的icon(官方仓库的issue也有人反馈,可能还没提上议程吧。。。相关issue可见:https://github.com/microsoft/vscode/issues/72244),因此目前还是只能使用官方提供的icon具体用法如下:
    const statusBarButton = vscode.window.createStatusBarItem(vscode.StatusBarAlignmet.Left, 100);
    // 此处的按钮格式:  按钮文本 + 官方提供的icon名,可选icon的链接:https://code.visualstudio.com/api/references/icons-in-labels#icon-listing
    statusBarButtom.text = `[buttontext] $(arrow-up)}`;

9.开发vscode插件相关操作命令

    npm install -g yo generator-code    //安装官方脚手架工具
    yo code         //借助官方脚手架生成hello world项目
    npm i vsce -g   //开发打包并发布至插件市场都必须安装的工具
    vsce package    //本地打包生成插件的vsix文件,可用于本地上传发布或直接分享给他人直接本地安装插件
    vsce publish    //直接打包发布至vscode插件应用市场
    vsce publish patch  //发布至插件应用市场并自动递增版本号
    vsce ls-publishers  //查看本地当前插件开发者
    vsce login      //登陆指定的插件开发者账号
    ...

后记

  • 当然啦,肯定还有很多坑是我没遇到的,毕竟,坑是踩不完的,且踩且珍惜~开发过程中遇到任何问题,首先应当想到的是从官方文档中去找解决方案,官方文档始终是最权威的,其次就是官方对应的仓库issue啦,相关链接已经贴在文末啦。以上就是这次vscode插件开发的一个小小结~

参考链接:
vscode插件开发官方文档
vscode官网issue