Bun 加入 bun check:TypeScript 團隊應如何放進 CI 與部署前流程
Tech News

Bun 加入 bun check:TypeScript 團隊應如何放進 CI 與部署前流程

圖片:TechLab 自製資訊圖
TechLab 編輯部(譯)·

Bun 1.4.3 加入內建 TypeScript 型別檢查指令 bun check。對以 TypeScript 維持大型程式碼庫、並將合併請求、測試及部署串入自動化流程的團隊而言,這代表可在原有 Bun 工作流程中多設一道型別閘門:一旦發現錯誤,便停止後續執行。iThome 報道指出,這項功能可配合既有專案設定,毋須另行安裝 TypeScript 套件;不過,它現時只處理型別檢查,並不具備 tsc 的完整職能。

最重要的限制也因此很清楚。Bun 雖然原本能直接執行 TypeScript,卻不會先驗證型別是否合理;例如函式預期數字卻收到字串,問題可能留待執行時才浮現。bun check 將這一步前移,但它不能輸出 JavaScript,也不會產生型別宣告檔,亦未提供供編輯器使用的語言服務。對依賴這些產物或開發工具整合的專案,將它視為額外檢查器會較穩妥,而非即時移走現有 TypeScript 工具鏈。

從「可執行」補上「先驗證」

在 TypeScript 專案中,能跑起來與能否及早攔截型別問題是兩回事。Bun 原本已可直接執行 TypeScript 程式,但快速執行不等於已完成靜態驗證。iThome 指出,新增檢查器會列出出錯檔案、位置及原因,令團隊可在程式啟動前定位問題。這種安排尤其適合本機開發的短迴圈:修改程式、檢查、再啟動,而不用等到較後段的測試或部署才發現基本型別不符。

指令層面上,團隊可用 bun check 掃描整個專案,也可在執行、測試或建置指令加入 --check。兩種方式服務不同情境:前者適合在開發者提交前或 CI 的獨立 job 取得清晰結果;後者則把檢查綁進既有命令,確保未通過型別驗證便不會繼續跑測試、建置或啟動 app。分析而言,後者能減少流程被遺漏的機會,但亦會令每次指令的失敗原因多一層,團隊應保留易讀的日誌與清楚的 job 名稱。

Bun 也提供監看模式,程式碼變更後會重新檢查,通過才重啟程式。這項設計把型別檢查放入日常 feedback loop,而不只是 CI 的最後關卡。對多人協作的服務端或全端專案,開發者可較早發現修改介面後牽連到的呼叫端;對香港初創或小型軟件團隊來說,若已使用 Bun,這可減少另開終端機手動執行檢查的步驟。不過,這是工作流程上的潛在便利,實際節省時間仍取決於專案規模與本身的測試安排。

如何把這道閘門放入 CI 與部署前流程

較審慎的導入方法,是先把 bun check 加入不會直接影響發布的 CI 檢查項,並保留現有 tsc 流程作對照。原因不是只看速度,而是要確認兩者在團隊常用的設定、第三方型別及邊界案例下,是否產生一致的結果。當一段時間內結果穩定,才考慮讓 bun check 成為合併前的必要條件;至於會生成 JavaScript 或宣告檔的工作,仍須由原有工具處理。

部署前則可將它放在測試及建置之前。其價值在於讓明確的型別問題較早失敗,避免耗用後續建置或部署資源;若專案的部署流程本來便由 Bun 執行,加入 --check 可令規則更集中。相反,若團隊以另一套建置系統產生產物,應避免誤把 bun check 當作編譯步驟。它驗證的是型別,並沒有替代產生部署檔案所需的工作,流程責任要分清楚。

一個可行的分工,是在開發階段以監看模式取得即時回饋,在 pull request 以獨立 bun check job 提供快速訊號,並在發布管線保留真正的建置與產物驗證。這樣即使日後發現相容性差異,也較易找出問題出於型別檢查、編譯產物還是部署配置。對有多個 package 的 repository,則應先確認它能否按現有設定正確掃描各個專案範圍,避免一次把工具換入所有流程。

效能數字可作方向,不能當成通用承諾

iThome 報道引述 Bun 的官方測試:在配備 16 核 Apple 晶片的 Mac 上,檢查多個開源專案時,新檢查器的速度為 TypeScript 7.0.2 編譯器的 3 至 6.4 倍,RAM 用量少約 55% 至 80%。官方以 Next.js 部分程式碼作例子,涉及 2,881 個檔案的檢查耗時 0.28 秒,對照工具為 1.82 秒。這些數字顯示大型專案的回饋時間可能有改善空間,特別是反覆執行檢查的 CI 工作。

然而,這是 Bun 官方在特定硬件、指定開源專案及比較版本下得出的數據,不能直接推展至每個公司的 repository。型別設計的複雜度、檔案結構、機器核心數、快取狀態和 CI 執行環境,都可能令結果不同。打算以效能為主要導入理由的團隊,較合理的做法是在自己的程式庫,以相同設定和固定環境同時量度耗時、RAM 用量及失敗訊息,再判斷是否值得調整管線資源。

官方的技術取向亦解釋了其速度主張的來源。據 iThome 指出,這個檢查器移植自微軟以 Go 開發的 TypeScript 型別檢查程式,並利用多核心處理器加快工作。多核心處理對大型檢查帶來的好處,在開發機與共享 CI runner 的表現未必相同;例如 runner 的可用核心、資源配額及同時執行的 job 均會影響結果。因此,速度資料適合作為測試導入的理由,並不足以單獨支持替換決定。

相容性才是能否擴大的關鍵

Bun 表示其檢查器已通過 TypeScript 7.0.2 的全部 51,210 項標準符合性測試,但 iThome 同時指出,在其他測試中仍存在少數與原版編譯器結果不同的情況。這兩項資訊應一併看待:高覆蓋率代表它已具備相當實用的基礎,但少數差異足以影響使用複雜泛型、特殊設定或型別層技巧的專案。尤其在 CI 中,任何假陽性或漏報都可能改變團隊對檢查結果的信任。

因此,採用策略應隨風險分級。一般 app、內部工具或主要需要快速捕捉日常型別錯誤的專案,可先把 bun check 作為輔助檢查,觀察其速度和診斷品質;對需要輸出宣告檔、依賴編輯器語言服務,或對型別相容性有較嚴格要求的函式庫與平台團隊,現階段更適合保留 tsc 作最終依據。現階段較合適的做法,是按其現有能力安排在流程中的角色。

Bun 1.4.3 同時改善 server 閒置時的資源使用,官方測試稱 CPU 使用量減少 67% 至 89%,並新增可分別設定代理 server、加密連線及連線池的網絡連線管理功能。不過,對 TypeScript 開發流程來說,下一步最值得觀察的仍是 bun check 在真實專案中的相容性回報,以及它能否逐步補足編譯產物和編輯器整合以外的缺口。短期內,受影響最大的會是已把 Bun 放進開發與 CI 流程、希望縮短型別回饋時間的團隊。

延伸閱讀

AI 輔助說明: 本文由 AI 協助整理,並經兩輪獨立自動品質審核;資料及連結仍以原始來源為準。


參考來源

本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。

分享:WhatsAppThreadsTelegramFacebook