繁體中文

開發者工具 · JSON 格式化程式和驗證程序

為什麼一致的 JSON 縮排可以讓你的 git diff 可讀

· 為什麼它很重要

json 開發人員工作流程 驗證

為什麼一致的 JSON 縮排可以讓你的 git diff 可讀,並用 JSON 標記和精確的驗證邊界來說明
原始 ToolAcre 向量圖

當兩個工具對縮排不一致時,儲存庫中的每個 JSON 檔案都會顯示為已變更。這篇文章解釋了為什麼縮排一致性對於審查很重要,如何選擇縮排一致性,以及如何安全地重新格式化。

更改了四百行,編輯了一個值

更改了 400 行,編輯了一個值 - 由於編輯器重新格式化了檔案,因此沒人可以審查該拉取請求。基於行的差異將縮排更改視為替換,因此預期的版本凹凸會在機械更改的行中消失。審閱者要么花時間過濾噪音,要么在沒有自信地檢查語義編輯的情況下批准。

ToolAcre 可以匹配兩個、四個或八個空格或製表符,並可以在有意選擇時對鍵進行排序。它不保留原始行結尾,因為 JSON.stringify 會發出新文字。如果團隊希望審核差異保持清晰易懂,則應將儲存庫範圍的標準化與語意編輯分開。應在廣泛重寫之前選擇格式化策略。

空格對於 JSON 來說無關緊要,但對 diff 來說非常重要

空格對於 JSON 來說無關緊要,而對於 diff 來說非常重要 - 為什麼縮排的變更會重寫每一行。解析器忽略字串外部的空格、製表符和換行符,但版本控制比較從文字行開始。將兩個前導空格更改為四個會改變幾乎每個巢狀行,即使產生的資料結構是相同的。

這種噪音的影響超越了美觀。歸咎歷史轉移到標準化提交,使用先前佈局的分支上的合併衝突增加,並代碼審查失去了正常的信噪比。穩定的格式使單值編輯保持為一行變更。應用標準化一次,進行傳達並避免將其與功能配置變更混合。儲存庫範圍內的一致性還可以讓審查者立即識別意外的格式化程式輸出,並保持自動變更摘要專注於實際配置行為變更。

兩個空格、四個空格或製表符

兩個空格、四個空格或製表符——常見生態系統的預設設置,以及為什麼選擇比堅持它更重要。兩個空格可以使深度嵌套的檔案變得更窄;四創造更強的視覺分離;分頁允許顯示寬度首選項,但與對齊方式和靜默轉換它們的工具交互效果不佳。

選擇儲存庫中已占主導地位的約定,並將其編碼在 Prettier、EditorConfig 或產生工具中,而不是依賴記憶體。確保貢獻者和 CI 使用相容的版本。 JSON 語法接受每個選項,因此有關通用正確性的爭論錯過了操作點:確定性輸出阻止編輯器、產生器和格式化程式輪流重寫相同檔案。固定格式化程式版本可以避免升級後的策略漂移。

行結尾與尾隨換行符

行結尾和尾隨換行符 — CRLF 與 LF 以及丟失的最終換行符作為整個檔案差異的其他來源。當格式化程式發出 LF 時,為 CRLF 配置的簽出可能會取代每一行。已解析的 JSON 未更改,但 Git 和審核介面可能會顯示儲存庫範圍內的文字重寫。

透過儲存庫屬性和格式化程式配置有意設定行結束策略,然後在貢獻者使用的平台上進行驗證。保留習慣的最後換行符,這樣命令列工具和差異就不會笨拙地報告最後一行。由於解析和重新序列化工具會產生新文字,因此在將產生的位元組級約定應用於許多檔案之前,請先對其進行比較。十六進位檢查可以區分行結束改動和值變更。

工作範例:規範化儲存庫的 JSON

工作範例:規範化儲存庫的 JSON — 庫存嚴格 JSON 檔案,選擇現有的兩個空格約定並在專用變更中重新格式化它們。排除其生產者擁有序列化和嚴格格式化程序無法解析的 JSON 類方言的產生工件。前後執行測試以驗證消費者是否仍讀取相同的值。

在規範化視窗周圍合併或變基活動功能分支以減少衝突,然後在 CI 中強制執行所選的格式化程序。規範化審查不應包含鍵排序或值編輯,從而更容易建立結構等效性。後續拉取請求可以在其發生的精確行上顯示依賴項版本更新或標誌變更。

好好審查 JSON 變更

很好地審查 JSON 更改 - 在比較之前對兩個版本進行相同的格式化,因此只有語義更改脫穎而出。檢查數組是否改變了順序、數字是否變成了字串以及鍵是否消失而不是移動。引號和文字類型所具有的意義是僅靠縮排無法計算的。

避免對鍵進行排序,除非儲存庫明確將順序視為不相關並期望規範排序。儘管物件成員順序通常缺乏應用程式意義,但重新排序會擴大差異並可能影響保留插入順序的工具。對於安全敏感的策略或清單,請將文字審查與模式驗證和特定於消費者的檢查結合起來,而不是僅僅因為格式化的差異很小而批准。

這不包括什麼

這不包括鍵排序和語意差異,這需要理解結構而不是線條的工具。兩個檔案在產生等效物件時可以進行不同的序列化,並兩個外觀相同的值在應用程式模式下可能會產生不同的結果。格式使表示標準化,但不定義語意等效性。

它也不保證位元組保存。重新序列化可以規範轉義和數字拼字、更改行結尾以及捨入不安全的 JavaScript 整數。產生的檔案可能需要精確的生產者版本,且簽署的檔案不得隨意重寫。在套用儲存庫範圍的格式化之前,確定工件是來源資料、產生的輸出或規格的簽章資料。

重點:一處縮排,儘早執行

重點:一次縮進,儘早強制執行 - 使用格式化程序的縮排設定來匹配項目,而不是強加個人偏好。同時對齊行尾和最終換行策略,然後自動化這些選擇,以便每個編輯器和 CI 執行都能產生穩定的文字。一致性比任何特定寬度更能保護審閱品質。

如果需要規範化,請將其與語意工作隔離並將其通告給活動分支。在提交之前檢查重新序列化的輸出是否存在大整數、轉義變更和不需要的鍵排序。一旦基線穩定,普通的 JSON 更改就會保持狹窄,指責仍然有用,審閱者可以專注於價值觀和結構,而不是從格式化噪音中重建意圖。