當前位置:
首頁 > 最新 > 插件機制詳述_VSCode插件開發筆記1

插件機制詳述_VSCode插件開發筆記1

一.擴展能力

VS Code插件不適合做UI定製,比如Atom的tool-bar 在VS Code很難實現:

提供了豐富的擴展能力模型,但不允許插件直接訪問底層UI DOM(也就是說插件難以改變IDE外觀,UI定製受限),這是出於方便底層持續優化考慮:

With VS Code, we』re continually trying to optimize use of the underlying web technologies to deliver an always available, highly responsive editor and we will continue to tune our use of the DOM as these technologies and our product evolve.

UI DOM這一層可能會隨著優化頻繁變動,VS Code不希望這些優化項受限於插件依賴,所以乾脆把UI定製能力限制起來

除UI定製之外的,IDE相關的功能型特性都是支持擴展的,如基礎的語法高亮/API提示、引用跳轉(轉到定義)/文件搜索、主題定製,高級的debug協議等等

P.S.實際上,非要擴展UI,也是有辦法的(逃出插件運行環境,但要費不少力氣),具體見access electron API from vscode extension,後續筆記會詳細介紹

二.運行環境

為了性能與兼容性,插件在獨立的進程(稱為extension host process)中運行,並且不允許直接訪問DOM,所以提供了一套內置的UI組件,比如智能提示(IntelliSense)

所以插件崩潰或無響應不影響IDE正常運行,例如:

一個插件的死循環並不影響IDE的正常使用和其它插件的載入/激活,但在進程列表能夠看到Code Helper的CPU佔用接近100%,進程級沙箱保證了插件機制的穩定性

三.核心理念穩定性:插件隔離

插件可能會影響啟動性能和IDE自身的穩定性,所以通過進程隔離來解決這個問題,插件運行在獨立的進程中,不影響IDE及其啟動時間

這樣做是從用戶角度考慮的,希望用戶對IDE擁有完全的控制力,無論插件在做什麼,都不影響IDE基本功能的正常使用

P.S.extension host process是個特殊的Node進程,能夠訪問VS Code擴展API,VS Code也對這種進程提供了debug支持

性能:插件激活

插件都是懶載入的(as late as possible),只在特定場景才載入/激活,所有在此之前也不耗費內存等資源

實現上是插件註冊特定激活事件(activation events),由IDE來觸發執行,比如markdown插件只在用戶代開md文件時才需要激活

激活方式

插件有6種激活方式:

除外都是條件激活,只在特定場景或滿足特定條件時才載入/激活插件

插件清單文件

清單文件用來描述插件的meta信息,直接把作為清單文件,並增加了一些特有欄位,比如觸發插件載入的激活事件()、插件想要增強的擴展點()

IDE在啟動過程中掃一遍插件清單文件,UI相關的就擴展UI,UI無關的就把擴展點與插件功能關聯起來

另外,由於插件的執行環境是Node進程,所以npm package都是可用的,依賴模塊同樣聲明在里。注意,用戶安裝插件時不會自動,所以需要在發布插件前把依賴模塊打包進去,具體見Installation and Packaging

P.S.擴展點類似於AOP里的Join point(連接點),即「允許在這裡擴展/增強」,比如新增一個自定義命令,就是對擴展點的增強

manifest

P.S.完整的見Extension Manifest File – package.json

只觸發一次,根據聲明的來觸發,觸發條件可以是打開特定語言的文件,或者執行特定命令。激活之後,直到IDE被關閉/崩潰才會觸發,所以一般用法是:

注意,語言擴展VS Code支持標準Text Mate Grammar(格式),比如Monaco Editor的非主流Monarch-style友好很多,具體見Colorization Clarification

編程型擴展

簡單配置搞不定的,都通過擴展API(寫插件)來實現,有2種方式:

使用上,第一種麻煩但更強大靈活,第二種方便直接但沒那麼靈活。支持的擴展能力如下:

聯繫ayqy


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 ayqy 的精彩文章:

TAG:ayqy |