“當(dāng)你發(fā)布新版本時,你希望用戶知道并查看變更。”在 VS Code 擴展開發(fā)者 FreHu 看來,這幾乎是一種本能反應(yīng)。他在維護自己的文件管理器擴展 Fresh File Explorer 時發(fā)現(xiàn),多數(shù)插件處理更新通知的方式,像是一頭闖進用戶的安靜房間:新安裝彈出提示、每次窗口重載再彈一遍,用戶不堪其擾,最終選擇卸載。于是他公開了一套自用的更新通知模式,代碼只有幾十行,卻把吵鬧的提醒變成了幾乎無感的版本推送。
這套模式的起點很簡單:不要依賴啟動時“隨手彈”的通知。隨手彈帶來兩個致命問題。一是對于剛剛安裝的用戶,他們面對的是一個對軟件還完全陌生的時刻,突然彈出的“已更新”提示毫無意義。二是 VS Code 的窗口重載機制,會讓這條通知反復(fù)出現(xiàn),用戶在工作流中被反復(fù)打斷,耐心迅速耗盡。FreHu 的結(jié)論是,必須建立一套規(guī)則,讓通知只在真正需要的時候出現(xiàn)——也就是用戶從一個舊版本跳轉(zhuǎn)到新版本的那一刻。
![]()
規(guī)則的核心是持久化存放一個“上一次已通知的版本號”。在 VS Code 的擴展 API 里,globalState 是一個跨窗口且重啟后依然保留的存儲空間。擴展激活時,從 globalState 取出這個已通知版本,與當(dāng)前正在運行的擴展版本做比較。得到的四種狀態(tài),就是整個邏輯的骨架:如果存的是空值,說明這是全新安裝,此時只把當(dāng)前版本號靜默存入,永遠不通知;如果存儲的版本等于當(dāng)前版本,說明只是重載或重啟,也保持沉默;如果當(dāng)前版本大于存儲版本,說明是升級,存儲新版本并根據(jù)用戶偏好決定是否彈出通知;如果當(dāng)前版本小于存儲版本,說明是降級,同樣存儲新版本但不通知。只比較版本號的大小,不糾結(jié)具體的版本語義,整個狀態(tài)機就清晰利落。
FreHu 還加入了一層用戶的控制權(quán):用戶可以在設(shè)置里指定想要接收通知的版本層次——主版本、次版本還是補丁版本。例如,如果你的擴展從 1.2.3 升級到 1.3.0,且用戶只勾選了“主版本”,那么這次升級就不會彈窗。這讓通知不再是一刀切的粗暴推送,而是成為用戶可配置的溫和提醒。四次狀態(tài)的判斷加上一層偏好過濾,使得一個原本容易引發(fā)卸載沖動的設(shè)計缺陷,被改造成了幾乎覺察不到的輕量流程。
另一個值得注意的地方是變更日志的處理。許多擴展會為此構(gòu)建復(fù)雜的網(wǎng)頁視圖,甚至引入額外的渲染依賴。FreHu 的做法是極致簡化:在擴展包里扔一個 CHANGELOG.md 文件,然后在通知里放一個“查看新功能”的按鈕,點擊后直接調(diào)用 VS Code 內(nèi)置的 Markdown 預(yù)覽命令打開這個文件。一行代碼就完成了展示:用 vscode.Uri.joinPath 拼接出文件路徑,再調(diào)用 markdown.showPreview。用戶看到的是輕量、可滾動的純文本預(yù)覽,既沒有加載延遲,也不需要開發(fā)者在界面開發(fā)上浪費精力。他說,變更日志應(yīng)該死板、簡單,不需要花哨的視覺包裝。
當(dāng)這條邏輯跑通之后,F(xiàn)reHu 還不忘開一個黑色幽默的玩笑:如果將來你的擴展不幸被黑客接管,他們上傳了惡意新版本,至少你的用戶還會收到一條漂亮的彈出消息,而黑客大概率懶得去往變更日志里填任何東西。這種半調(diào)侃式的提法,反倒提示了一個嚴肅的設(shè)計原則:通知系統(tǒng)不應(yīng)該與惡意行為做抵抗,但一個穩(wěn)固的通知狀態(tài)機,確實能讓用戶有最后一道意識上的防護——盡管它原本只是為了改善體驗而存在。
他把整個方案打包成一個獨立的樣例擴展,放在 GitHub 上。代碼自包含、無冗余依賴,可以單獨拆出來復(fù)用到任何 VS Code 擴展項目中。FreHu 還透露,他計劃把這個模式擴展成一個系列,用更多這樣的小型范例來解決擴展開發(fā)中常見的微小痛點。對幾十萬 VS Code 擴展的開發(fā)者來說,這種輕量模式比起復(fù)雜的最佳實踐文檔更有即插即用的參考價值,因為它只聚焦一個問題,只用幾十行代碼給出一個足以上生產(chǎn)的答案。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.