徵求意見:新的嵌入式 協議
發佈於 2023 年 5 月 20 日,作者:Natalie Weizenbaum
如果您不是嵌入式 Sass 協議主機套件的作者,您可以跳過這篇部落格文章——儘管如果您夠書呆子的話,您可能會覺得它很有 趣!
我們計劃對嵌入式 Sass 協議進行一些重大變更,在我們確定新的做法之前,我們希望獲得您的意見回饋。我們打算一次性進行多項重大變更,以盡可能減少中斷 次數。
我們計劃兩個主要的重大 變更
-
Dart Sass 嵌入式主機將不再作為單獨的可執行檔發佈。它現在將捆綁到主要的 Dart Sass 可執行檔中,透過執行
sass --embedded來 存取。 -
嵌入式協議中的每個封包現在都包含一個編譯 ID 作為封包結構的一部分,而不是在協議緩衝區定義中聲明 它。
我們也藉此機會引入三個較小的重大 變更
-
嵌入式協議的規範和協議緩衝區定義已移至Sass 語言儲存庫,以便它們可以與語言和 JS API 的變更同步 更新。
-
嵌入式協議現在使用協議緩衝區語言功能明確聲明可選欄位。這表示各種欄位的「預設值」不再被視為未 設定。
-
CompilationSuccess.loaded_urls欄位已移至CompilationResult.loaded_urls,以便即使編譯失敗也能使用。這允許 watcher 實作知道要監視哪些檔案以重新進行失敗的 編譯。
儲存庫組織的變更已經完成,但協議本身的變更已在語言儲存庫的提案中完整 記錄。
合併可執行檔合併可執行檔的永久連結
將嵌入式 Dart Sass 合併到主要的 Dart Sass 可執行檔的主要好處是為嵌入式主機提供一種簡單的方法,將標準 Dart Sass 命令列 API 暴露給使用者。現在,安裝任何嵌入式主機的每個使用者都可以使用完整的 Dart Sass 可執行檔,並以原生 Dart VM 速度運行。
這也有助於簡化 Sass 團隊的組織,減少我們需要管理的獨立儲存庫和發佈流程的 數量。
線路層級編譯 ID線路層級編譯 ID 的永久連結
我們將編譯 ID 提取到協議層級,是為了提供更好的並行性,尤其是在嵌入式編譯器方面。由嵌入式編譯器完成的 Sass 編譯不會彼此共享任何狀態,這意味著理論上它們可以在完全獨立的工作執行緒中運行。然而,使用目前的嵌入式協議,將每個訊息導向正確的工作執行緒需要在主執行緒上解析整個訊息以確定它屬於哪個編譯,然後在工作執行緒中*再次*解析它以實際處理 它。
將編譯 ID 納入協議本身可以解決這個問題。每個端點都可以讀取 ID,查找正在處理編譯的工作線程,並將訊息傳遞給該線程,而無需解析訊息的其餘部分。這使得並行處理更容易且更有效率,有助於確保大型編譯盡可能快速地完成。