iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0

NX 可以同步執行多個 target ,並且會依據這些 target 的 dependency 依序執行,這個行為也被稱作 task pipeline,圖解會像底下的圖這樣。

app1 跟 app2 都依賴著 lib ,所以為了建這兩個 app 會先執行 lib 的建置,然後就能平行建置 app1 跟 app2 ,順便跑一次 lib 的測試。

圖片來源:NX 官方文件

圖片來源: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 ,就能直接用雲端上的資料來跳過步驟。


上一篇
NX Dependencies
下一篇
部署 Vercel
系列文
組裝前端開發工具箱,從 NX 入手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言