吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

教你如何開發VS Code插件?

jf_8lIj6kO1 ? 來源:熊的貓 ? 2023-11-27 10:51 ? 次閱讀

前言

由于之前的國際化的項目中總是要統計老項目中待翻譯的內容,然后再交由業務進行翻譯,如果總是人為統計不僅相當耗費精力和時間,而且還不能保證是否有遺漏,因此想通過編寫一個i18n-helper插件來實現這個功能。

然而,大家的需求總是出奇的相似(因為已經有很多類似的插件存在了),因此沒必要重復造輪子了,但是如何開發 vscode 插件的過程可以記錄下來,分享給大家!

跑通官方插件示例

好了,話不多說,我們先按著官方文檔跑一下它的插件用例吧!

生成插件目錄

安裝腳手架

npm install -g yo generator-code

初始化插件目錄

終端運行yo code,按照提示生成目錄即可。

a0ba0e44-8b95-11ee-939d-92fbcf53809c.jpg

調試插件

由于官方文檔缺少一些細節,很容易導致小白調試插件失敗,再常見的有如下情況。

找不到 Hello World 命令

進入對應項目目錄后,按照官方文檔的指示可通過如下兩種方式進行調試:

按快捷鍵 F5

點擊編輯器左下方的Run Extension

a0d8baba-8b95-11ee-939d-92fbcf53809c.jpg

接著按下Ctrl + Shift + P,并輸入Hello World命令,發現無法找到對應的命令:

a0ec566a-8b95-11ee-939d-92fbcf53809c.jpg

這個原因主要是因為 vscode 版本不一致造成的:

package.json文件中指定的vscode版本號

a0fba5d4-8b95-11ee-939d-92fbcf53809c.jpg

當前實際的vscode版本號:

a11adcce-8b95-11ee-939d-92fbcf53809c.jpg

解決方案自然就是保持版本的一致性

升級vscode版本

適用于當前版本號低于package.json文件中指定的版本號

【注意】現在vscode版本的更新模型已經調整為“默認”模式,所以現在不會收到vscode需要更新的信息,也無法進行通過“檢查更新”按鈕來進行更新

a143713e-8b95-11ee-939d-92fbcf53809c.jpg

修改package.json文件中的vscode對應版本號

這種方式比較簡單直接,就是修改為和當前正在使用的vscode版本保持一致即可,如下:

a17fc60c-8b95-11ee-939d-92fbcf53809c.jpg

Hello World 命令報錯

經過上述操作后,重新啟動調試,按下Ctrl + Shift + P,并輸入Hello World命令,就可以找到對應的命令了,但是執行該命令時報錯了:

a18cccbc-8b95-11ee-939d-92fbcf53809c.jpg

原因就在于我們沒有編譯文件,此時注意查看package.json文件中的main字段會發現:

a1a1d080-8b95-11ee-939d-92fbcf53809c.jpg

很明顯,我們沒有編譯源文件生成目標文件,此時我們只需要通過npm run watch啟用監聽模式,讓其進行編譯即可:

a1c9bd2a-8b95-11ee-939d-92fbcf53809c.jpg

此時在執行命令,就會發現成功了:

a1dbb44e-8b95-11ee-939d-92fbcf53809c.jpg

【實戰】編寫 VSCode 插件

插件的三個概念

激活事件(針對V1.74.0之前的VSCode版本)

即插件激活的時機,目的是支持用戶在輸入Hello World命令后能夠激活插件

例如,使用onCommand進行注冊onCommand:extension.helloWorlda1e770e0-8b95-11ee-939d-92fbcf53809c.jpg

發布內容配置

VS Code通過package.json進行擴展,通過配置插件清單字段便于開發插件

例如,使用contributes.commands綁定一個命令 IDextension.helloWorld,目的是讓Hello World命令就可以在命令面板中匹配到等

VS Code API

插件代碼中需要調用的一系列JavaScript API使用VS Code的一些功能特性

例如,通過vscode.commands.registerCommand將一個函數綁定到對應的命令 IDextension.helloWorld上,激活命令時執行的就是該函數等

目錄結構比較簡單就不過多介紹了。

在 VSCode 中預覽 SVG 文件?標簽預覽

當然相關的svg插件已經有不少了,這里只是用這個簡單的需求來舉個例子,方便讓大家更容易理解。

SVG 文件在 VSCode 中的原始展示效果

a1f933b6-8b95-11ee-939d-92fbcf53809c.jpg

發布內容配置 — package.json 文件

面向用戶的命令

首先,我們要注冊命令,讓用戶能夠使用我們的插件,這里我們就簡單支持如下兩種方式:

Ctrl + Shift + P 匹配命令

只需要在package.json中的contributes.commands進行如下配置即可,詳情可見contributes.commands

"contributes": {
    "commands": [
          {
            "command": "svg-viewer.previewsvg",
            "title": "Preview SVG"
          }
     ]
}

鼠標右鍵菜單選擇命令

這種方式相對于上面的方式來講更簡便,只需要在package.json中的contributes.menus進行如下配置即可,詳情可見contributes.menus

"contributes": {
    "menus": {
      "editor/context": [
        {
          "command": "svg-viewer.previewsvg"
        }
      ]
}

上述鼠標右鍵菜單選擇命令的配置有一點不好,那就是安裝此插件后,在任何文件中右鍵都會顯示Preview SVG選項,此時調試效果如下:

a210e998-8b95-11ee-939d-92fbcf53809c.jpg

a22f8cea-8b95-11ee-939d-92fbcf53809c.jpg

因為我們的本意是預覽SVG文件,而不是其他文件,因此對于不符合的文件就沒有必要展示此選項了,此時可以通過when 子句上下文來控制顯示隱藏命令選項,此時配置更改為:

"contributes": {
    "menus": {
      "editor/context": [
        {
          "command": "svg-viewer.previewsvg",
          "when": "resourceExtname == '.svg'"
        }
      ]
}

調試效果如下:

a23f4bee-8b95-11ee-939d-92fbcf53809c.jpg

a2550312-8b95-11ee-939d-92fbcf53809c.jpg

使用 VSCode API

注冊命令

上述我們配置好了命令,現在就需要注冊命令了,也就是決定當命令激活時需要做些什么事情,即只需要在extension.ts文件的activate方法中做如下修改即可:

// 執行命令時被激活
export function activate(context: vscode.ExtensionContext) {
  // 使用控制臺輸出診斷信息(console.log)和錯誤(console.error)
  // 這行代碼只會在你的擴展被激活時執行一次
  console.log('Congratulations, your extension "svg-viewer" is now active!');


  // 注冊命令,commandId 參數必須與 package.json 中的 command 字段匹配
  let disposable = vscode.commands.registerCommand(
    "svg-viewer.previewsvg",
    () => {
      // 具體要做的內容
    }
  );


  context.subscriptions.push(disposable);
}

使用 Webview

平時我們通過瀏覽器使用標簽可以查看svg文件的效果,例如:

a26d7dfc-8b95-11ee-939d-92fbcf53809c.jpg

那么在VSCode中可不可以也以這樣的方式來實現呢?

那當然是可以的。

我們可以使用如下代碼編輯器中創建一個Webview,然后其中的html選項內容就可以用我們常見的html 結構來填充,并作為最終結果來進行渲染,例如:

  // 創建并顯示新的 webview
  const panel = vscode.window.createWebviewPanel(
    "SVGPreview", // 只供內部使用,即 webview 的標識
    "SVG Preview", // 面板標題
    vscode.ViewColumn.One, // 給新的 webview 面板一個編輯器視圖
    {} // Webview 選項
  );


  // 設置HTML內容
  panel.webview.html = `
    
      
        
        
        SVG Preview
      
      
        
      
    
`;

獲取目標文件的 base64 格式

由于我們打開相應svg文件后右鍵進行預覽,那么第一步就得先獲取當前這個文件的路徑,這就又得需要使用的VSCode API了,如下

 const editor = vscode.window.activeTextEditor;
leturl=editor.document.fileName;//獲取到的就是對應文件的絕對路徑

a27fc0c0-8b95-11ee-939d-92fbcf53809c.jpg

但是如果你直接把這個路徑作為標簽的src屬性是沒法沒正常渲染的,大致如下:

a29edb4a-8b95-11ee-939d-92fbcf53809c.jpg

既然如此,那么我們可以把這個svg文件讀取到,然后把它轉成base64的格式,再交由標簽使用即可,此時我們就需要使用到node內置的fs模塊了,即:

  const fs = require("fs");
  const content = fs.readFileSync(url);
return`data:image/svg+xml;base64,${content.toString("base64")}`;

源代碼 & 效果展示

需要查看源碼的可點此獲取:源代碼

經過上述的處理我們就可以在VSCode中預覽svg文件了,效果如下:

a2ea6056-8b95-11ee-939d-92fbcf53809c.gif

在 VSCode 中預覽 SVG 文件 —標簽預覽

上述方案雖然可以實現我們需要的功能,但是對于svg文件來講還是復雜了,因為在瀏覽其中是可以直接渲染標簽的,而svg文件的內容不就是標簽嗎,那么我們只需要把文件內容讀取出來,直接填充到webview.html中就好了,根本不需要轉成base64格式。

這個方案比較簡單,這里直接貼出extension.ts文件中的代碼了:

import * as vscode from "vscode";


// 執行命令時被激活
export function activate(context: vscode.ExtensionContext) {
  const fs = require("fs");


  // 注冊命令,commandId 參數必須與 package.json 中的 command 字段匹配
  let disposable = vscode.commands.registerCommand(
    "svg-viewer.previewsvg",
    () => {
      const url = getActiveTextUrl();
      const content = fs.readFileSync(url, "utf-8");
      opedWebview(content);
    }
  );


  context.subscriptions.push(disposable);
}


// 獲取當前文件路徑
export function getActiveTextUrl(): string {
  let url = "";
  const editor = vscode.window.activeTextEditor;


  if (editor) {
    url = editor.document.fileName;
  }


  return url;
}


// 創建并顯示新的 webview
export function opedWebview(content: string) {
  const panel = vscode.window.createWebviewPanel(
    "SVGPreview", // 只供內部使用,即 webview 的標識
    "SVG Preview", // 面板標題
    vscode.ViewColumn.One, // 給新的 webview 面板一個編輯器視圖
    {} // Webview 選項
  );


  // 設置HTML內容
  panel.webview.html = getWebviewContent(content);
}


// 渲染模版
export function getWebviewContent(content: string) {
  return `
    
      
        
        
        SVG Preview
        
      
      
        ${content}
      
    
    `;
}


// 停用命令時執行
exportfunctiondeactivate(){}

發布

發布到官網應用市場

通過這個地址注冊開發者賬號,然后按提示發布到官網應用市場即可。

a304f31c-8b95-11ee-939d-92fbcf53809c.jpg

使用 vsce 打成 vsix 插件

這種方式可以實現即使沒有發布到應用市場,也可以直接通過對應文件的方式進行插件的安裝和使用。

安裝 vsce 工具

安裝命令npm i vsce -g

打包生成 .vsix 文件

直接使用vsce package命令進行打包,完成后就會生成一個.vsix文件,這個也就是在后續安裝插件時要使用的文件。

【注意】在使用這個命令打包時,可能會出現vsce所需要支持的VSCode最低版本和當前使用版本之間存在出入,導致打包失敗:

a31ac7fa-8b95-11ee-939d-92fbcf53809c.jpg

特別是如果按照前文的方式直接修改package.json文件中的版本號時,此時最好還是將VSCode版本進行升級,而不是手動修改版本號。

安裝 vsix 插件

按照如下方式操作并選擇對應的.vsix文件即可.

a331be2e-8b95-11ee-939d-92fbcf53809c.jpg

通過本篇文章,希望能讓你從一個VSCode 插件開發的小白變成大白,能夠為團隊賦能,或者作為自己的一個技能亮點。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SVG
    SVG
    +關注

    關注

    0

    文章

    129

    瀏覽量

    16487
  • vscode
    +關注

    關注

    1

    文章

    157

    瀏覽量

    7854

原文標題:從小白到大白 — 如何開發 VS Code 插件

文章出處:【微信號:玩轉VS Code,微信公眾號:玩轉VS Code】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Zephyr領進門系列:MCUXPresso for VS Code插件安裝

    一套PC端的Zephyr OS開發環境。話不多說,開整! 1.??安裝VS Code 相信不少小伙伴已經將VS Code當作裝機必備工具了,
    的頭像 發表于 12-19 09:53 ?1234次閱讀
    Zephyr領進門系列:MCUXPresso for <b class='flag-5'>VS</b> <b class='flag-5'>Code</b><b class='flag-5'>插件</b>安裝

    基于VS Code開發嵌入式

    很多朋友在開發嵌入式的時候,一般常用Keil MDK、IAR等IDE工具,不過這些都是收費的,而且非常笨重,跨平臺開發不方便,依次筆者將推薦使用VS Code
    的頭像 發表于 04-23 17:24 ?5003次閱讀
    基于<b class='flag-5'>VS</b> <b class='flag-5'>Code</b><b class='flag-5'>開發</b>嵌入式

    使用MCUXpresso for VS Code插件開發Zephyr的hello world

    本期來到Zephyr實戰經驗演練,小編帶著大家一起使用MCUXpresso for VS Code插件開發一個屬于Zephyr的hello world。
    的頭像 發表于 01-03 09:21 ?645次閱讀
    使用MCUXpresso for <b class='flag-5'>VS</b> <b class='flag-5'>Code</b><b class='flag-5'>插件</b><b class='flag-5'>開發</b>Zephyr的hello world

    芯海 32 位 MCU 開發調試 ,基于 VS Code 插件實現芯海 32 位 MCU 開發調試

    編譯器命令行參數、GCC 鏈 接腳本、JLink 配置等,而且在推廣和移植時也會遇到比較多的問題。因此我們開發了基于 VS Code插件,目的是統一
    發表于 05-16 10:46

    VS Code中通過PlatformIO插件開發STM32

    ??其實使用Arduino框架開發STM32并不新鮮,但以前大部分人是用Arduino IDE開發的,本文介紹一下在VS Code中,通過PlatformIO
    發表于 12-06 06:09

    【應用筆記】基于VS Code插件實現芯海32位MCU開發調試

    、GCC鏈接腳本、JLink配置等,而且在推廣和移植時也會遇到比較多的問題。因此我們開發了基于VS Code插件,目的是統一開發工具、提高
    發表于 08-31 17:10

    【應用筆記】基于VS Code插件實現芯海32位MCU開發調試 不回修改為release 模式,求解答

    基于VS Code插件實現芯海32位MCU開發調試 不回修改為release 模式,求解答。 目前編譯后,一直是debug 模式,如何修改
    發表于 10-31 10:43

    關于VS Code實現遠程開發的配置方法詳細教程

    VS Code幾乎是所有的程序員必備的工具之一,據說全球一般的開發者都使用過VS Code這款工具。
    的頭像 發表于 04-27 10:15 ?2960次閱讀
    關于<b class='flag-5'>VS</b> <b class='flag-5'>Code</b>實現遠程<b class='flag-5'>開發</b>的配置方法詳細教程

    微軟官方開發VS Code擴展介紹

    【導語】:CodeTour(代碼之旅)是微軟官方開發VS Code 擴展,允許記錄和回放代碼的演練和思路。 簡介 CodeTour 是一個 VS
    的頭像 發表于 10-22 17:13 ?1945次閱讀

    STM32開發VS Code + GDB下載調試

    STM32開發VS Code + GDB下載調試
    發表于 11-30 19:06 ?7次下載
    STM32<b class='flag-5'>開發</b>之 <b class='flag-5'>VS</b> <b class='flag-5'>Code</b> + GDB下載調試

    vs code 調試STM32

    本次環境搭建主要參考如下文檔或博客使用VSCode和VS2017編譯調試STM32程序VS Code 搭建stm32開發環境STM32高級開發
    發表于 12-06 09:36 ?19次下載
    <b class='flag-5'>vs</b> <b class='flag-5'>code</b> 調試STM32

    使用VS Code開發Arduino

    之下用VS Code(Visual Studio Code)作為編輯器來說就好用多了。現在我們可以在VS Code中安裝Arduino
    發表于 12-14 18:49 ?3次下載
    使用<b class='flag-5'>VS</b> <b class='flag-5'>Code</b><b class='flag-5'>開發</b>Arduino

    基于IAR for arm9.30.1在VS Code調試仿真RA

    開發環境 IDE:IAR for arm9.30.1 +VS Code 仿真器:J-Link V9 芯片型號:R7FA2L1AB2DFM 本文檔是基于芯片R7FA2L1AB2DFM,理論所有ARM
    的頭像 發表于 01-16 13:20 ?2648次閱讀

    在嵌入式中如何利用VS Code進行遠程開發呢?

    VS Code幾乎是所有的程序員必備的工具之一,據說全球一般的開發者都使用過VS Code這款工具。
    的頭像 發表于 11-07 09:27 ?805次閱讀
    在嵌入式中如何利用<b class='flag-5'>VS</b> <b class='flag-5'>Code</b>進行遠程<b class='flag-5'>開發</b>呢?

    MCUXpresso for VS Code保姆式教程免費送!

    背景 NXP 在 2023 年 7 月 31 日正式發布了 MCUXpresso for VS Code? 插件,使得廣大的 VS Code
    的頭像 發表于 11-16 08:55 ?1376次閱讀
    MCUXpresso for <b class='flag-5'>VS</b> <b class='flag-5'>Code</b>保姆式教程免費送!
    华硕百家乐的玩法技巧和规则 | 网上百家乐官网赌场娱乐网规则 | 全讯网博客| 石城县| 大赢家百家乐官网的玩法技巧和规则| 大同县| 网络百家乐路单图| 大发888官方正版网| 真人百家乐官网大转轮| 赌片百家乐的玩法技巧和规则| 密山市| 波音百家乐现金网| 362娱乐城开户| 榆次百家乐官网的玩法技巧和规则| 百家乐博彩的玩法技巧和规则 | 百家乐怎么看大小| 理塘县| 百家乐折桌子| 玉门市| 百家乐官网网页游戏网址| 乐百家乐彩现金开户| 网上现金棋牌| 百家乐概率计算过程| 超级皇冠网分布图| 百家乐网站新全讯网| 定陶县| 三公百家乐玩法| 百家乐官网怎么玩能赢钱| 网上百家乐真的假| 凯旋门百家乐官网娱乐城| 网上的百家乐怎么才能赚钱| 百家乐官网3带厂家地址| 澳门百家乐娱乐场开户注册| 玩百家乐官网优博娱乐城| 威尼斯人娱乐城代理注册| 星际百家乐官网娱乐城| 大发888注册送50| 扑克王百家乐官网的玩法技巧和规则 | 全讯网vc8888.com| 骰子百家乐官网的玩法技巧和规则 | 百家乐官网大娱乐场开户注册 |