VS Code For Web 深入淺出 -- 導讀篇

来源:https://www.cnblogs.com/zakum/archive/2022/10/17/16799035.html
-Advertisement-
Play Games

下一代 IDE 的形態究竟是什麼呢?VS Code For Web 試圖回答這個問題。 背景 眾所周知,VS Code 是當前工業界最優秀的代碼編輯器之一。它由《設計模式》的作者 Erich Gamma 領導開發,因此,它的設計架構在很多地方十分精妙,近些年已經成為了各家競相模仿學習的對象。 儘管 ...


下一代 IDE 的形態究竟是什麼呢?VS Code For Web 試圖回答這個問題。

背景

眾所周知,VS Code 是當前工業界最優秀的代碼編輯器之一。它由《設計模式》的作者 Erich Gamma 領導開發,因此,它的設計架構在很多地方十分精妙,近些年已經成為了各家競相模仿學習的對象。

儘管 VSCode 作為桌面端應用十分優秀,但由於它基於 Electron,相當於在 Chromium 外套了一層殼,使得它的打包體積非常大,且無法直接安裝在雲端環境中,這就導致了它的使用場景非常有限。

2019 年,微軟在 PyCon 2019 大會上發佈了 VSCode Remote 擴展,支持了遠程開發,這個擴展的出現,使得 VSCode 成為了一款真正的跨平臺 IDE,不再局限於本地開發,可以通過 SSH 連接到遠程伺服器,然後在遠程伺服器上開發。

2020 年,Github Codespaces 又將 Web IDE 的進展向前邁進了一步,它允許用戶訪問 Github 上托管的所有項目來直接進行編輯與提交,而無需自己搭建伺服器,實現了一個全托管的遠程開發解決方案。但微軟當時並未將其 Server 部分開源,由 Github 集中運營。

而在最近的 2022 年 7 月,微軟公開併發布了 private preview 版本的 VS Code Server。這是一個可私有化的,可以在遠程開發機器上運行的獨立服務端。與 Github Codespaces 相同,它允許用戶直接通過 URL,在瀏覽器中安全地鏈接到遠程開發機,且同時支持了 HTTPWeb Socket 協議。在此過程中不需要進行任何前期的 SSH 或 HTTPS 設置。

官方基於此製作了基於 VS Code ServerWeb IDE,可以直接通過瀏覽器訪問 https://vscode.dev/ 進行體驗。可以預見,這就是下一代 IDE 的形態,Serverless, and Run Anywhere

註:本文基於 VSCode v1.71 版本。

VS Code For Web 代碼架構

註意,在瞭解 VS Code For Web 的架構之前,我們最好對 VS Code 的組織架構有一定的瞭解。(詳細內容可自行參考 VSCode 的官方文檔。)

從設計上說,VS Code 是一個多進程架構的應用程式,它主要由客戶端與服務端 2 個應用程式組成。

其中,客戶端是一個 Electron 應用程式,它負責 UI 的渲染,以及與服務端的通信。而服務端則是一個 Node.js 應用程式,它負責處理客戶端的請求,以及提供一些基礎的功能。

而在 VS Code For Web 中,得益於使用TS語言,其客戶端可以幾乎無縫擴展到瀏覽器中。因此,主要的改動點在於 VS Code Server 的實現。

在 VSCode 的設計中, VS Code Server 是 VSCode 服務端的一個子集,它只實現了 VSCode 的本地服務端的一部分功能,它的主要目的是為了提供一個更輕量級的服務端,以便於在雲端環境中運行。

VS Code For Web 的架構分為了兩個部分:

  1. Web Workbench,即 VSCode 的 Web 客戶端,此處為瀏覽器各項服務配置的入口點,處理如何與後端建聯,解析資源,以及載入 WebView 等。
  2. Remote Server,為客戶端提供 Terminal,File system,Debugger 等服務的訪問能力。

接下來,我們可以對照著 VSCode 的主要源碼 src/vs,來直觀的理解代碼架構。

20221013134251

其中,base 文件夾提供通用的基礎依賴能力,如通用 UI 組件庫,woker通信能力,IPC 通信能力等。platform 文件夾更上一層,提供依賴註入能力、以及剪切板、文件處理等基礎能力Service。editor 文件夾即為代碼編輯器 monaco,處理核心編輯區相關的內容。最外層的 workbench 文件夾則負責view層除了編輯器之外的工作區的UI佈局與渲染。

而剩餘部分即為啟動客戶端的支持能力。其中,code 文件夾為客戶端啟動的入口,包括從web端啟動與桌面端啟動。而 server 文件夾則是 VS Code Server 的主要位置,負責運行服務端程式的 entrypoint

其代碼組織如下圖所示:

vscode code architecture

從架構設計上可以看出,VSCode 採用從 view 到 infrastructure 的分層思想,使得數據與事件流單向流動。

從這裡也可以看到,VSCode 的客戶端與服務端採用了同構的設計思路,使得客戶端與服務端提供服務形式的切換變得更加容易,從架構上就兼顧到了 Web IDE 的可行性。

VSCode For Web 職責分工

VSCode Server 與客戶端運行的 VSCode 的架構職責區分如下圖所示:

20221009135447

我們知道 VSCode 是一個多進程項目,從這張圖中我們可以看出,VSCode 將幾乎所有的運算進程都交給了服務端。由於機能的限制,實際上,屬於客戶端處理的除了主進程外,只有 UI 繪製相關的進程,以及與插件服務與本地服務間的通信進程(語言相關的service除外,為了在web端也能擁有不錯的開發體驗,language server 是使用了worker thread 旁路執行的)。

因此VSCode Server 除了負責啟動服務的 Running App 進程外,還需要處理如 Terminal,File system,Debugger、Search 等等進程。它們的生命周期都是由 VSCode Server 管理的。

結語

本篇文章為導讀篇,主要介紹了 VSCode For Web 的設計背景,並簡單介紹了 VSCode For Web 的架構設計,以及前後端的職責分工。在下一篇文章中,我們將會著重介紹 VSCode For Web 的前後端通信機制。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景 建立視圖, 方便查詢 create schema dba; create view dba.invalid_index as select indisvalid, indexrelid::regclass, indrelid::regclass, pg_get_indexdef(indexre ...
  • Redis 和 memcache 的區別,Redis 支持的數據類型應用場景 redis 支持的數據結構更豐富(string,hash,list,set,zset)。memcache 只支持 key-value 的存儲; redis 原生支持集群,memcache 沒有原生的集群模式。 ...
  • 過去,App里各種彈窗和貼片廣告不僅令用戶心煩,廣告主們也頭疼。一方面,廣撒網的廣告成本較高;另一方面,這些廣告不能精準觸達需要的用戶。直到個性化廣告的出現,才解決了這一痛點。 如今媒體廣告主們為了更精準地投放廣告,通常會收集用戶個人數據來判斷他們的特征定位、興趣愛好或近期需求等,然後在App里進行 ...
  • 簡單說下:offsetTop offsetTop: 為只讀屬性。 返回的是一個數字。 它返回當前元素相對於其 offsetParent 元素的頂部內邊距的距離。 它等價於offsetTop==>元素到offsetParent頂部內邊距的距離 offsetTop並不是指距離瀏覽器視窗最左邊的位置。 我 ...
  • propmt是一個輸入語句它的返回結果是你輸入的內容,無論輸入什麼內容返回結果的數據類型都是字元串類型。 alert是一個彈框輸出 console是控制台輸出 下麵代碼的意思是輸入一些內容然後保存到content變數裡面 然後alert輸出content變數也就是你從prompt輸入的內容 cons ...
  • 在前端頁面中,有些事件可能會由於用戶不必要的操作而頻繁觸發,這在無形之中就增加了伺服器的IO併發量. 為瞭解決這個問題,我們通常會通過防抖或節流的方式來限制事件函數的執行次數. ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 最近部門分享,有同學提到了 Vue 響應式原理,大家在討論時,發現一些同學對這一知識理解還不夠深入,不能形成一個閉環,為了幫助大家理解這個問題,我重新過了一下 Vue 源碼,並整理了多張流程圖,便於大家理解。 Vue 初始化 模板渲染 組 ...
  • 1. JS 中使用 SCSS 變數。如在 scss 中定義了一個顏色,*el-menu* 組件使用該顏色作為背景色,此時需要獲取 scss 變數,通過 *background-color* 屬性將該變數值傳遞給 *el-menu* 組件(當然你也可以在 JS 中重新定義一個變數存儲該顏色)。 >2... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...