從零開始開發一款屬於你的Visual Studio Code 插件

2021-02-20 VS Code 中文社區

視頻日期:2019年12月9日 

會議主題:微軟技術暨生態大會 2018

會議日期:2018年10月25日 

演講題目:從零開始開發一款屬於你的 Visual Studio Code 插件 

主講人:韓駿 - 微軟開發工具事業部

❞預熱部分主講人介紹

截止18年開會,主講人已經開發過 16 款 VS Code 插件,其中很多插件備受好評。比如 Code Runner 已經有 400 多萬下載量, GitHub 上收穫 1k 星標。

主講人有著很深的 VS Code 的插件開發經驗。

VS Code 介紹

Visual Studio Code 是一款微軟推出的編輯器,具有以下特點:

跨平臺(macOS, Linux, Windows)

談到 VSC 的開發,就有兩點不得不提:Electron 框架與 Monaco Editor 。

VSC 是完全基於 Electron 進行開發的。

Electron 框架具有以下特點:

基於 Node.js (作為後端)和 Chromium (作為前端);使用 HTML 、 CSS 和 JavaScript 開發跨平臺桌面 GUI 應用程式;使用者有:Atom 、 Skype 、 GitHub Desktop 、 Slack ...

還有一個重要的組件,是 Monaco Editor 。其實, Monaco Editor 在微軟內部有很多應用。

Monaco Editor 有以下特點:

基於瀏覽器的代碼編輯器:intelliSense ,代碼驗證,語法高亮,文件比較...支持主流瀏覽器:IE 11 , Edge , Chrome , Firefox , Safari 和 Opera ;使用者:Azure DevOps , OneDrive , Edge Dev Tools , Gitee Web IDE 。VSC 插件簡介

VSC 有超過 8000 個插件(截止演講的 2018 年),內容包含語言、調試器、代碼格式化、代碼片段、鍵盤映射、主題...

VSC 如此受歡迎,離不開其豐富的插件生態。

VSC 的插件開發

可以分為四個步驟:

I 設計部分

設計部分的第一個關鍵詞:「靈感」。那麼,怎樣獲取靈感?

第一點:從自身需求出發。以 Code Runner 為例:韓老師在微軟曾開發過許多語言,自己曾有過一個需求:「是否可以省去在 terminal 中進入某個目錄運行代碼這個環節,而直接運行自己所需測試的十幾行代碼片段呢?」韓老師發現並沒有相應插件,於是他開發了 Code Runner 。

第二點:去發現別人的需求,比如去 GitHub issues 或者 feature request 去發現別人的需求。比如在開發前端時,自動補全 Tag 是一個很有用的功能,但當時 VSC 並未實現,於是韓老師開發了 Auto Close Tag 插件。

第三點:查考老牌編輯器已有功能。因為 VSC 屬於新興編輯器,功能尚不完備,可以參考其他編輯器,獲取需求靈感,從而開發相應插件。

設計部分的第二個關鍵詞:「目標用戶」

以 Code Runner 為例,其目標用戶可定位成:

初學者:初學者可能僅僅想了解語言的語法,無需了解編譯過程,因此使用 Code Runner 可以輕鬆運行代碼,省去其他編譯命令;「懶人」:Code Runner 提供了多個快捷鍵與觸發動作,大大提升調試效率;II 實現部分

首先,應該配置好開發環境,有三點關鍵步驟:

Yeoman and VS Code Extension generator

其中 Yeoman 和 generator 可從 npm 配置:

npm install -g yo generator-code

接下來,我們通過一個 Demo 來演示 VS Code 的開發。

「第一步」,確認已經安裝配置好了 Yeoman 與 VS Code Extension generator,打開 terminal ,輸入 yo code 。

「第二步」,在命令行中會供你選擇 Extension 的種類,這裡推薦大家使用基於 TypeScript 進行開發,即選擇 New Extension (TypeScript) 。

「第三步」,依照命令行中的提示,輸入名字、 ID 、description 、 Publish Name 等等。完成基礎配置後,會生成屬於你的新插件的項目文件夾,其中會配置好了 VS Code 的 Engine 。

「第四步」,使用 VSC 打開你剛剛生成的項目,如下圖。

可以注意到,(通過 sky fording )生成了許多文件,但其實,值得注意的只有兩個文件:

在 package.json 中,關注 contributes ,其定義了一個 Command :

"contributes": {
"commands": [
{
"command": "extension.helloWorld",
"title": "Hello World"
}
]
}

同時注意:

"activationEvents": [
"onCommand:extension.helloWorld"
]

這裡表示,該 event 是由 command 激活的。這是出於性能的考慮,在 VSC 中,插件一般都是 lazy load 的,只有激活才啟用插件。

而 Extension.ts 可以理解為一個激活的函數。

// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {

// Use the console to output diagnostic information (console.log) and errors (console.error)
// This line of code will only be executed once when your extension is activated
console.log('Congratulations, your extension "hello-piper" is now active!');

// The command has been defined in the package.json file
// Now provide the implementation of the command with registerCommand
// The commandId parameter must match the command field in package.json
let disposable = vscode.commands.registerCommand('extension.helloWorld', () => {
// The code you place here will be executed every time your command is executed

// Display a message box to the user
vscode.window.showInformationMessage('Hello Piper!');
});

context.subscriptions.push(disposable);
}

當 command 出現時,上述實例會 showInformationMessage('Hello Piper!')。

「第五步」,我們嘗試調試這個插件。在左側的 Run 工具欄中點擊 debug 按鈕, VSC 會為我們打開一個加載好該插件的新 VSC 。

在新 VSC 中 Ctrl+Shift+P 輸入我們之前定義好的命令,可見有效。如下圖。

以上就是建立 VSC 插件項目的過程,有經驗的開發人員可以閱讀微軟官方文檔 https://code.visualstudio.com/api 進行插件開發。

❞❝

以上為視頻前 25 分鐘內容。

「第六步」,接下來韓老師現場修改 vscode-translator 插件,以此為例講解關於插件開發的更多操作。以下是詳細內容。

vscode-translator 的項目地址:https://github.com/formulahendry/vscode-translator

首先來看 package.json 。

"commands": [{
"command": "translator.translate",
"title": "Translate"
},
{
"command": "translator.replaceWithTranslation",
"title": "Replace with Translation"
},
{
"command": "translator.toggleCaptureWord",
"title": "Toggle - Capture Word"
}
]

在 commands 內註冊了關於 Translate 的命令。

"menus": {
"editor/context": [{
"command": "translator.translate",
"group": "navigation@1"
},
{
"command": "translator.replaceWithTranslation",
"group": "navigation@2"
}
]
}

在 menus 中配置相應命令,可以增加「右鍵彈出菜單命令」的效果。

"keybindings": [{
"command": "translator.translate",
"key": "ctrl+alt+z"
}

很多人喜歡使用鍵盤快捷鍵進行操作,鑑於此,韓老師增加了 keybindings 項。

接著我們來看 Extension.ts ,其中也是註冊 translate 的相關 Function 。

進入 Extension.ts 註冊的函數文件:translator.ts ,我們可以看到:通過 activeTextEditor 對象可以拿到當前 selection 的內容(即需要被翻譯的文本)。之後,通過 translate 函數,得到被翻譯好的文本。在當前版本中,使用的是有道 API :

public static async translate(source: string, showErrorMessage: boolean = false): Promise<string> {
try {
const result = (await axios.get(`https://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=${encodeURIComponent(source)}`)).data;
return result['translateResult'].map((translateResult: any) => translateResult.map((sentence: any) => sentence['tgt']).join('')).join('\n');
} catch (error) {
if (showErrorMessage) {
vscode.window.showErrorMessage(error.toString());
}
return "";
}
}

至於 hover 功能(滑鼠懸浮於文本上),這利用了 VS Code 提供的 HoverProvider 的功能。

import { Hover, HoverProvider, Position, TextDocument } from 'vscode';
export class TranslatorHoverProvider implements HoverProvider {}

「第七步」,關於發布該插件。

VS Code 提供了 VSCE ,可以很方便地發布插件。可以通過 npm 來進行安裝。

在發布前,需要進行測試。

韓老師展示了 Azure Pipelines 的全平臺測試過程(在 Windows/Mac OS/Linux 平臺測試 CI/CD )。

使用 VSCE publish 來發布。

「第八步」,將本地項目與 Azure 配置好後,可以在 Azure 的 Application Insights 上查看用戶的下載情況與行為。

以上為視頻前 39 分鐘內容, DEMO 部分結束。

韓老師分享了三個 Tips :

Tip 1:快速迭代。帕累託法則(二八定律)是指,80%的用戶往往只會用20%的功能。因此,發布第一個版本的插件時,不需要實現全部功能,就可以看出該插件的前景。

Tip 2:可以使用 VS Code Insider ,該版本每天都會更新,可以最快速地查看新功能。

Tip 3:為插件加一些快捷方式。其實插件的轉換率(使用人數除以下載數量)的很低,為插件增加快捷方式方便人員使用,可以大幅提高轉換率。

III 推广部分

推廣越早越好。

推廣渠道可以有博客論壇等等,比如 Stack Overflow , v2ex , 知乎等等。

IV 維護部分

首先,維護應該是數據驅動的,可以關注:

Fail Fast , 如果插件效果不好,或許應該儘早放棄。

最後老師講了講開源與社區:老師幾乎的所有的工具都是開源的。開源是一種雙贏的模式,一個好的項目會吸引很多人 pull request 和 issue ,可以讓開發者學習很多,也可以幫助插件項目快速迭代成長。

相關焦點

  • 10 個好用的 Visual Studio Code 插件
    無論你是經驗豐富的程式設計師,還是剛開始從事第一份工作的程式設計師「小白」,你都想讓程序開發變得更容易。使用正確的工具,你就能夠做到這點。 如果你正在使用的 IDE 是 Visual Studio Code,那可以讓它變得更合你的「口味」。其中一個方式就是安裝正確的插件。你可以儘可能多地安裝插件,從而讓編程變得更容易。
  • 10個好用的Visual Studio Code插件
    無論你是經驗豐富的程式設計師,還是剛開始從事第一份工作的程式設計師「小白」,你都想讓程序開發變得更容易。使用正確的工具,你就能夠做到這點。 如果你正在使用的 IDE 是 Visual Studio Code,那可以讓它變得更合你的「口味」。其中一個方式就是安裝正確的插件。你可以儘可能多地安裝插件,從而讓編程變得更容易。無疑,插件對你的工作效率和工作方式有著很大影響。
  • 剖析並利用Visual Studio Code在Mac上編譯、調試c#程序
    自定義配置文件OK,安裝完成之後,終於可以開始我們的visual studio code的初體驗了。由於匹夫比較常用的一個功能就是定義跳轉,所以對定義跳轉的快捷鍵十分敏感。而匹夫的Mac上F12默認給了音量調節,所對很多把F12作為定義跳轉的編輯器匹夫起初都是很排斥的(duang~~~)。
  • 30 個超實用的 Visual Studio Code插件
    1、Material ThemeVisual Studio Code 最悠久的主題!6、Prettier你絕對不能少了這個插件,你需要它來一鍵美化你的 JavaScript/TypeScript/CSS 代碼。
  • 2018 年最受歡迎的 Visual Studio Code 擴展插件合集
    #掃描上方二維碼報名成都源創會#原文:https://ricardodsanchez.com/2018/08/03/favorite-visual-studio-code-extensions-of在這篇文章中,作者分享了一些他最喜歡的 VS 代碼擴展,同時使用 VS Code 開發 Web 應用程式。
  • Visual Studio Code 1.13 發布,趕緊試試
    Editor - 可縮放的 Find 插件,新的 folding 控制設置。Languages - JSX / TSX 組件突出顯示,Markdown headers in symbol search。
  • 給宇宙最強Visual Studio Code配置編譯和運行C/C++
    來自:Linux迷  https://www.linuxmi.com/ubuntu-visual-studio-code-c.html
  • Visual Studio Code搭建C語言"集成"開發環境
    使用其內嵌的Windows power shell當作命令行終端來執行MinGW的便宜命令,這種方式雖然比較麻煩,但是其開發的過程和方法最大地逼近了Linux下C語言的開發,因此,我們在之前的C語言講述過程中,選擇使用了這種開發方式。但是,這種方式隨著你代碼的複雜度提升,如果使用gdb工具去做代碼的調試,其實是很不方便的,因為命令行為主的操作方式永遠都比不過圖形化界面來的方便。
  • 從零開始開發 VS Code 插件之 Translator Helper
    在此介紹一下該插件的開發過程,希望更多人能參與到本地化工作中,為其他開發者提供高質量的中文內容。求五星好評啊 開發概述開發一個 VS Code Extension 並不難,但開發一個好的Extension不容易。讓我們還是從Hello World開始吧。VS Code 官網提供了詳細的開發文檔:https://code.visualstudio.com/api。
  • 常用的Visual Studio Code 插件
    我們開發項目中,開發工具是必不可少的,接下來我來和大家講一講關於vs code常用的一些插件。
  • Visual Studio Code 最新版本發布
    如果你感興趣的話,歡迎在 github.com/Microsoft/vscode 中查看我們跟蹤的3775個問題。感覺至少近段時間內我們不會失去工作:-)。更新內容:Workbench theming ready for authors - 創建和分享您自己的自定義VS代碼主題。
  • 10 個好用的 Visual Studio Code 插件「神器」
    作者丨Daan譯者 | 夏夜策劃 | 萬佳無論你是經驗豐富的程式設計師,還是剛開始從事第一份工作的程式設計師「小白」,你都想讓程序開發變得更容易。使用正確的工具,你就能夠做到這點。如果你正在使用的 IDE 是 Visual Studio Code,那可以讓它變得更合你的「口味」。
  • 為什麼Visual Studio Code如此受歡迎?
    來自:Linux迷   連結:https://www.linuxmi.com/visual-studio-code-huanying.html
  • 終極指南:如何使用 Visual Studio Code 進行 Java 開發?
    您也可以完全跳過本指南,直接參考文檔《 用 VS Code 開發 Java 應用》。但是,建議對照下面的指南走查一遍重點部分,這將有助於您更好地利用 VS Code 進行 Java 開發。為了使 VS Code 支持核心 Java,作為最低要求,您必須安裝一組擴展。 讓我們逐一深入研究這些擴展。
  • Visual Studio Code快捷鍵[windows版]
    這份Visual  Studio Code windows版快捷鍵,根據官方文檔翻譯所得原文PDF下載地址: https://code.visualstudio.com
  • Visual Studio Code 最好的功能、插件和設置
    你在 VS Code 中找到的每個功能都完成一項出色的工作,構建了一些簡單的功能集,包括語法高亮、智能補全、集成 git 和編輯器內置調試工具等,將使你開發更高效。https://code.visualstudio.com/Docs/editor/debugging
  • 使用Visual Studio Code開發.NET Core看這篇就夠了
    我們可以期待更多很酷的擴展和功能來增強VS Code,這將使在這個輕量級,跨平臺編輯器中的開發.NET Core應用程式更加流暢和有趣。趕緊跟著博主一起開始今天的文章吧!為什麼要寫這篇文章?那麼有沒有一款媲美Visual Studio的開發工具可以讓我們能夠在Linux系統上進行高效的.NET Core開發呢?答案是肯定的,因為微軟已經開發了一個名為Visual Studio Code的跨平臺和開源的文本編輯器。Visual Studio Code是如此強大和令人驚嘆,因為它提供了內置的智能提醒,調試功能和Git支持。而且Visual Studio Code提供了強大的插件擴展功能。
  • Visual Studio Code 開發 .NET Core 看這篇就夠了
    畢竟從.net過度過來的我們已經習慣了使用Microsoft的Visual Studio進行開發。那麼有沒有一款媲美Visual Studio的開發工具可以讓我們能夠在Linux系統上進行高效的.NET Core開發呢?答案是肯定的,因為微軟已經開發了一個名為Visual Studio Code的跨平臺和開源的文本編輯器。
  • Visual Studio 支持 Java?謠言止於智者
    當時,韓老師看到這篇文章也是一臉懵逼。公司裡做 Java 的開發童鞋們就坐在韓老師附近(嗯,不超過五米的距離),大家都很熟。VS 支持 Java 了,我咋會不知道?那麼真相到底是什麼呢?首先,先說結論。這是謠言,是標題黨。我們在微軟 VS Code 的官網(2019 年 7 月 13 日)可以看到關於 VS Code 是否會支持 Java 的說明。
  • 10 個炒雞好用的 VS Code 插件 「神器」!
    無論你是經驗豐富的開發人員還是剛剛開始第一份工作的初級開發人員,你都會想讓自己的開發工作儘可能輕鬆一點。正確的工具使用則可以幫助你實現這個目標。如果你選擇使用 Visual Code 作為 IDE,你就可以使它符合你的偏好選擇。實現此目的的一種方法是安裝正確的插件。為了讓你的生活儘可能的簡單,你可以添加很多你想要的內容。你使用的插件將會對你的工作效率以及工作方式產生很大的影響。