RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

教你如何開發(fā)VS Code插件?

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

前言

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

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

跑通官方插件示例

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

生成插件目錄

安裝腳手架

npm install -g yo generator-code

初始化插件目錄

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

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

調(diào)試插件

由于官方文檔缺少一些細(xì)節(jié),很容易導(dǎo)致小白調(diào)試插件失敗,再常見的有如下情況。

找不到 Hello World 命令

進(jìn)入對應(yīng)項目目錄后,按照官方文檔的指示可通過如下兩種方式進(jìn)行調(diào)試:

按快捷鍵 F5

點擊編輯器左下方的Run Extension

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

接著按下Ctrl + Shift + P,并輸入Hello World命令,發(fā)現(xiàn)無法找到對應(yīng)的命令:

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

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

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

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

當(dāng)前實際的vscode版本號:

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

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

升級vscode版本

適用于當(dāng)前版本號低于package.json文件中指定的版本號

【注意】現(xiàn)在vscode版本的更新模型已經(jīng)調(diào)整為“默認(rèn)”模式,所以現(xiàn)在不會收到vscode需要更新的信息,也無法進(jìn)行通過“檢查更新”按鈕來進(jìn)行更新

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

修改package.json文件中的vscode對應(yīng)版本號

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

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

Hello World 命令報錯

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

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

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

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

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

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

此時在執(zhí)行命令,就會發(fā)現(xiàn)成功了:

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

【實戰(zhàn)】編寫 VSCode 插件

插件的三個概念

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

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

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

發(fā)布內(nèi)容配置

VS Code通過package.json進(jìn)行擴(kuò)展,通過配置插件清單字段便于開發(fā)插件

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

VS Code API

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

例如,通過vscode.commands.registerCommand將一個函數(shù)綁定到對應(yīng)的命令 IDextension.helloWorld上,激活命令時執(zhí)行的就是該函數(shù)等

目錄結(jié)構(gòu)比較簡單就不過多介紹了。

在 VSCode 中預(yù)覽 SVG 文件?標(biāo)簽預(yù)覽

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

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

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

發(fā)布內(nèi)容配置 — package.json 文件

面向用戶的命令

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

Ctrl + Shift + P 匹配命令

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

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

鼠標(biāo)右鍵菜單選擇命令

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

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

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

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

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

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

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

調(diào)試效果如下:

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

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

使用 VSCode API

注冊命令

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

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


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


  context.subscriptions.push(disposable);
}

使用 Webview

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

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

那么在VSCode中可不可以也以這樣的方式來實現(xiàn)呢?

那當(dāng)然是可以的。

我們可以使用如下代碼編輯器中創(chuàng)建一個Webview,然后其中的html選項內(nèi)容就可以用我們常見的html 結(jié)構(gòu)來填充,并作為最終結(jié)果來進(jìn)行渲染,例如:

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


  // 設(shè)置HTML內(nèi)容
  panel.webview.html = `
    
      
        
        
        SVG Preview
      
      
        
      
    
`;

獲取目標(biāo)文件的 base64 格式

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

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

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

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

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

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

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

源代碼 & 效果展示

需要查看源碼的可點此獲?。涸创a

經(jīng)過上述的處理我們就可以在VSCode中預(yù)覽svg文件了,效果如下:

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

在 VSCode 中預(yù)覽 SVG 文件 —標(biāo)簽預(yù)覽

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

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

import * as vscode from "vscode";


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


  // 注冊命令,commandId 參數(shù)必須與 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);
}


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


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


  return url;
}


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


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


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


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

發(fā)布

發(fā)布到官網(wǎng)應(yīng)用市場

通過這個地址注冊開發(fā)者賬號,然后按提示發(fā)布到官網(wǎng)應(yīng)用市場即可。

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

使用 vsce 打成 vsix 插件

這種方式可以實現(xiàn)即使沒有發(fā)布到應(yīng)用市場,也可以直接通過對應(yīng)文件的方式進(jìn)行插件的安裝和使用。

安裝 vsce 工具

安裝命令npm i vsce -g

打包生成 .vsix 文件

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

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

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

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

安裝 vsix 插件

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

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

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






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • SVG
    SVG
    +關(guān)注

    關(guān)注

    0

    文章

    127

    瀏覽量

    16407
  • vscode
    +關(guān)注

    關(guān)注

    1

    文章

    155

    瀏覽量

    7696

原文標(biāo)題:從小白到大白 — 如何開發(fā) VS Code 插件

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

收藏 人收藏

    評論

    相關(guān)推薦

    Zephyr領(lǐng)進(jìn)門系列:MCUXPresso for VS Code插件安裝

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

    基于VS Code開發(fā)嵌入式

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

    芯海 32 位 MCU 開發(fā)調(diào)試 ,基于 VS Code 插件實現(xiàn)芯海 32 位 MCU 開發(fā)調(diào)試

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

    VS Code中通過PlatformIO插件開發(fā)STM32

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

    如何使用VS Code開發(fā)Arduino?

    如何使用VS Code開發(fā)Arduino?
    發(fā)表于 02-14 07:53

    【應(yīng)用筆記】基于VS Code插件實現(xiàn)芯海32位MCU開發(fā)調(diào)試

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

    【應(yīng)用筆記】基于VS Code插件實現(xiàn)芯海32位MCU開發(fā)調(diào)試 不回修改為release 模式,求解答

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

    關(guān)于VS Code實現(xiàn)遠(yuǎn)程開發(fā)的配置方法詳細(xì)教程

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

    微軟官方開發(fā)VS Code擴(kuò)展介紹

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

    STM32開發(fā)VS Code + GDB下載調(diào)試

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

    vs code 調(diào)試STM32

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

    使用VS Code開發(fā)Arduino

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

    基于IAR for arm9.30.1在VS Code調(diào)試仿真RA

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

    在嵌入式中如何利用VS Code進(jìn)行遠(yuǎn)程開發(fā)呢?

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

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

    背景 NXP 在 2023 年 7 月 31 日正式發(fā)布了 MCUXpresso for VS Code? 插件,使得廣大的 VS Code
    的頭像 發(fā)表于 11-16 08:55 ?1244次閱讀
    MCUXpresso for <b class='flag-5'>VS</b> <b class='flag-5'>Code</b>保姆式教程免費送!
    RM新时代网站-首页