用了一陣子 NX 後瞭解了些這組工具的基本功能與一些限制,這邊做個整理。
NX 提供的 executor 與 generator 等工具對於在單一資源庫中管理複數專案跟套件幫助很大,可以很方便的用 NX 指令操作個別專案,生成預設格式的元件,或是自動套用模組並做好初始設定。
nx generate @nx/next:application
NX 藉由將一些開發上必經的操作編寫成 executor 或 generator ,節省開發者反覆操作這些步驟所需的時間,另外也能藉此一貫化開發架構跟格式。
NX 適合用於管理 monorepo 的另一個功能,是能夠自動偵測專案間的依賴關係,形成一目瞭然的依賴地圖,並且根據這些依賴關係制定任務執行的步驟,不用人工一一執行像是“要先測試好 A 再測試 B 才能確認 B的測試有效”的任務。
不過不是所有檔案類型的關聯都有辦法被自動偵測到,像是 .vue 或 .astro 這類框架自訂的檔案類型,就要做額外的設定才有辦法形成正確的關聯地圖。
目前找到的幾個設定方法:
NX 指令能夠同時處理複數個任務,可以同時跑多個專案的測試或建置,節省時間。
nx run-many --target=test --parallel=5
並行處理的同時還是會根據任務間的依賴關係排定先後順序,所以如果依賴層數太多的話,依序執行下可能還是會花很多時間。
不過 NX 的任務結果暫存機制可以幫助改善這個問題。
對於每個任務,NX 會根據任務輸入的檔案內容生成雜湊值,並在跑完測試的時候將結果存為該雜湊值的快取。
而當下次執行任務時,若程式碼或資源沒有變化,計算出的任務雜湊值相同的話,就會省略重新測試的步驟直接提供之前快取的結果。
這樣就算依賴層數很多,也能夠藉由快取前幾階段的結果快速進展到要測試的範圍。
NX 的某些功能在單一專案下也有很大的幫助,像是生成元件跟測試結果快取,就算沒有要做 monorepo ,也能考量需不需要為了這些方便的功能而引入 NX 工具。