擁有高品質且由社群推動的函式庫定義(「libdef」)對於在 Flow 中獲得絕佳體驗非常重要。今天,我們要介紹 flow-typed:一個 儲存庫 和 CLI 工具,代表建立、分享和散布 Flow libdef 的新工作流程的第一部分。
這個專案的目標是建立一個 libdef 生態系統,讓 Flow 的型別推論大放異彩,並與 Flow 的任務保持一致:從真實世界的 JavaScript 中萃取精確且準確的型別。我們從類似於 TypeScript 的 DefinitelyTyped 努力中學到很多,我們希望將學到的部分經驗帶到 Flow 生態系統。
以下是這個專案的一些目標
- Libdef 應該有版本 — 針對它們所描述的函式庫和與之相容的 Flow 版本。
- Libdef 應該達到高品質標準,包括libdef 測試,以確保其品質能持續維持。
- 必須有直接的方式來隨著時間推移貢獻 libdef 改進,以及讓開發人員隨著時間推移受益於這些改進。
- 管理 Flow 專案的 libdefs 程序應為自動化、簡單且容易上手。
版本化和測試的 Libdefs
任何人都可以貢獻 libdef(或改善現有的 libdef),但在這樣做時,重要的是我們維持高品質標準,讓所有開發人員都能對他們使用的 libdefs 有信心。為了解決這個問題,flow-typed 要求所有 libdef 貢獻都必須針對它們所描述的程式庫版本和 libdef 相容的 Flow 版本明確版本化。
此外,所有 libdefs 都必須附帶測試,以執行 API 的重要部分並斷言它們產生正確的類型。透過在每個 libdef 中包含版本資訊和測試,我們可以在 Travis 中自動驗證測試是否如預期般針對 libdef 相容的所有 Flow 版本運作。測試也有助於確保 libdef 未來的變更不會隨著時間而退化其功能。
自動化 Libdef 安裝
我們建置了一個名為flow-typed的簡單 CLI 工具,有助於自動化在 Flow 專案中尋找、安裝和升級 libdefs 的程序。它使用與每個 libdef 相關聯的明確版本資訊,根據專案的 package.json 相依性尋找所有必要的 libdefs。這將您需要執行的作業減至最少,以便在專案中提取和更新 libdefs。
您可以使用 yarn(yarn global add flow-typed)或 npm(npm install -g flow-typed)取得 flow-typed CLI。
安裝 Libdefs
從 flow-typed 儲存庫安裝 libdefs 只需在安裝相依性後在專案上執行一個指令
> yarn install # Or `npm install` if you're old-school :)
> flow-typed install
flow-typed install 指令會讀取專案的 package.json 檔案,查詢 flow-typed 儲存庫以尋找與相依性相符的 libdefs,並將正確版本的 libdefs 安裝到 flow-typed/ 目錄中。預設情況下,Flow 會在 flow-typed/ 目錄中尋找 libdefs,因此不需要額外的設定。
請注意,有必要在執行 yarn 或 npm install之後執行此指令。這是因為如果相依性之一沒有類型,此指令也會為您產生 stub libdefs。
安裝 libdefs 之後,我們建議您將它們檢查到專案的儲存庫中。flow-typed 儲存庫中的 libdefs 可能會隨著時間而改善(修正錯誤、更精確的類型等)。如果發生在您依賴的 libdef,您會希望控制何時將該更新套用至您的專案。您可以定期執行 flow-typed update 來下載任何 libdef 更新,驗證您的專案是否仍進行類型檢查,並提交更新。
為何不直接使用 Npm 來散布 Libdefs?
隨著時間推移,flow-typed 儲存庫中的 libdefs 可能會更新以修正錯誤、提升準確性,或使用描述程式庫類型更佳的新 Flow 功能。因此,實際上適用於每個 libdef 的版本有 3 個:所描述程式庫的版本、flow-typed 儲存庫中 libdef 的目前版本,以及 libdef 相容的 Flow 版本。
如果您在安裝專案中使用的某個 libdef 之後對其進行更新,則該更新很有可能會在您的專案中找出先前未知的新類型錯誤。雖然找出先前遺漏的錯誤絕對是一件好事,但您會希望控制何時將這些變更拉進您的專案。
這就是我們建議您將已安裝的 libdefs 提交至版本控制,而不是依賴像 npm+semver 這樣的系統從 npm 下載並安裝非決定性 semver 範圍版本的原因。檢查您的 libdefs 可確保專案中的所有合作者在版本記錄中的任何特定提交中都有 Flow 的一致輸出。
建立社群
這首先是一個社群專案。它是由一位社群成員(嘿 @splodingsocks!)發起的,並已從許多其他人的工作時數中受益。此外,這將持續成為一項社群努力:任何人都可以為任何 npm 程式庫建立和/或協助維護 libdef。作者可以在發布時為其套件建立 libdef,和/或消費者可以在其他人尚未建立時建立 libdef。無論哪種方式,所有人都會受益!
我們要向 @marudor 致上最深的謝意,感謝他貢獻許多自己的 libdef,並花時間協助其他人撰寫和貢獻 libdef。此外,我們還要感謝 @ryyppy 協助設計和反覆運算 CLI 和安裝工作流程,以及管理 libdef 審查。
Flow 核心團隊打算繼續投資於開發和改進這個專案,但為了讓它真正成功,我們需要你的協助!如果你已經為你參與的 Flow 專案撰寫了一些 libdef,我們鼓勵你貢獻它們,讓其他人也能受益。透過在社群驅動的儲存庫中管理 libdef,整個社群可以共同努力,將 Flow 的功能擴充到不只是明確型別的 JS。
現在仍處於早期階段,還有很多事情要做,因此我們很期待聽到你的想法/回饋,並閱讀你的 pull request! :)
編寫愉快!