NX 可以同步執行多個 target ,並且會依據這些 target 的 dependency 依序執行,這個行為也被稱作 task pipeline,圖解會像底下的圖這樣。
app1 跟 app2 都依賴著 lib ,所以為了建這兩個 app 會先執行 lib 的建置,然後就能平行建置 app1 跟 app2 ,順便跑一次 lib 的測試。
圖片來源:NX 官方文件
執行緒的上限預設是 3 ,可以通過選項調整
pnpm exec nx run-many --target=build --parallel=5
不過雖說可以平行運行,但當依賴樹越來越深的時候,難免因為瀑布式的建置讓建置時間越來越長,
所以首先要注意架構上的設計好讓依賴層數降低。
再來就是靠 NX 的 Cache 機制降低建置時間。
每當執行一個 target 的時候,NX 會根據這個 target 的 dependency 跟 input 去計算出一個雜湊值,並且在執行之後將結果記錄在這個雜湊值底下,也就是 cache 起來。
而當下次執行相同的 target 時,如果 NX 計算出的雜湊值已經有對應的 cache ,就會直接將 cache 的內容回饋,省掉重新執行一次的時間。
反之當 input 的檔案內容,或是 dependency 的 cache 有變化,造成雜湊值不同,就會正常執行,重新產生 cache。
這在 task pipeline 的時候幫助很大,假設 target dependency 的對象,已經有對應的暫存結果,就能跳過該步驟的直接用暫存的結果進到下一步,或是一開始暫存的結果是執行失敗,就能提早終止整個 pipline。
要指定哪些 target 會被 cache ,是在 nx.json
中的 cacheableOperations
定義。
# nx.json
{
"tasksRunnerOptions": {
"default": {
"runner": "nx/tasks-runners/default",
"options": {
"cacheableOperations": [
"build",
"lint",
"test",
"e2e",
"build-storybook"
]
}
}
},
// ...
}
一般執行 generate 類的指令時就會自動來更新這邊的清單,所以平常是不用太注意,除非手動增加了 target。
另外 cache 除了存在本地端外,如果有註冊 NX Cloud 並連動,就能將 cache 結果存到雲端上,在團隊間共用,例如 A 工程師已經執行過 build 指令產生了 cache ,當 B 工程師也要執行時發現雲端上有對應的 cache ,就能直接用雲端上的資料來跳過步驟。