入門:Monorepo 任務(wù)緩存與按需執(zhí)行是怎么省時間的)
Nx 實戰(zhàn)入門Monorepo 任務(wù)緩存與按需執(zhí)行是怎么省時間的【免費下載鏈接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.項目地址: https://gitcode.com/GitHub_Trending/nx/nx在包含幾十個應(yīng)用的倉庫里每次提交都跑全量構(gòu)建和測試CI 越跑越慢、越來越貴是不少團(tuán)隊遇到過的真實問題。Nx 是一套面向 Monorepo 的任務(wù)執(zhí)行與緩存平臺它能識別哪些代碼真的變了、哪些任務(wù)的結(jié)果可以直接復(fù)用從而只執(zhí)行受影響的范圍。讀完本文讀者會知道如何在一分鐘內(nèi)讓 Nx 接管現(xiàn)有 npm 工作區(qū)、如何通過緩存判斷一次任務(wù)是否真的被執(zhí)行、又該如何只測試被本次改動波及的模塊并能判斷自己的倉庫適合從哪里入手。一個具體的痛點為什么全量跑一遍越來越撐不住設(shè)想一個倉庫里有 3 個前端應(yīng)用、20 個共享庫。某天只改了某個庫里的一處工具函數(shù)提交后 CI 卻把所有應(yīng)用的構(gòu)建、測試、lint 從頭到尾再跑一次耗時十幾分鐘。這十幾分鐘里絕大部分任務(wù)的結(jié)果和上一次完全相同——輸入沒變輸出就不會變。Nx 的思路是先回答兩個問題這次改動波及了哪些項目哪些任務(wù)的結(jié)果可以直接拿來用它通過項目之間的依賴關(guān)系圖來回答第一個問題通過給任務(wù)輸入做指紋哈希來回答第二個問題。這樣 CI 里真正需要重跑的任務(wù)會明顯減少省下的不只是時間還有機(jī)器成本和排隊時間。最小上手如何讓 Nx 接管一個現(xiàn)有項目不需要重寫倉庫結(jié)構(gòu)。如果項目已經(jīng)是一個 npm、pnpm 或 yarn 工作區(qū)直接在根目錄運(yùn)行npx nx init這一步之后Nx 會讀取現(xiàn)有的package.jsonscripts把它們識別為可執(zhí)行的任務(wù)并開始為這些任務(wù)的輸出建立緩存。也就是說倉庫里原本就存在的build、test腳本不需要任何改造就可以被 Nx 調(diào)度并緩存。如果是全新開始則用官方腳手架npx create-nx-workspacelatest它會引導(dǎo)選擇模板React、Vue、Next.js、NestJS 等并生成帶 Nx 配置的工作區(qū)。驗證是否生效可以運(yùn)行nx show projects看 Nx 識別到了哪些項目再運(yùn)行nx run-many -t build --all跑一次全量構(gòu)建。第二次運(yùn)行同一命令時如果項目沒有改動任務(wù)會直接命中緩存并秒級完成——這就是判斷緩存工作是否正常的最直觀信號。?緩存機(jī)制怎么運(yùn)轉(zhuǎn)任務(wù)輸入如何變成指紋Nx 在執(zhí)行一個可緩存任務(wù)之前會先計算它的哈希值。哈希的輸入通常包括項目自身的源文件、它所依賴項目的文件、相關(guān)的工作區(qū)配置、外部依賴的版本號以及命令行參數(shù)。兩次運(yùn)行只要哈希一致Nx 就認(rèn)為是同一個計算直接恢復(fù)上次保存的終端輸出和產(chǎn)物文件比如 dist 目錄而不是重新執(zhí)行。開啟方式很輕。在nx.json的targetDefaults里聲明哪些目標(biāo)類型參與緩存{ targetDefaults: { build: { cache: true }, test: { cache: true } } }這里有一個重要前提可緩存的任務(wù)必須是無副作用的即同樣輸入一定得到同樣輸出。比如依賴外部后端狀態(tài)的 e2e 測試就不適合緩存因為后端數(shù)據(jù)會變緩存結(jié)果可能給出誤導(dǎo)。判斷方法很簡單——問自己如果這次不改任何代碼任務(wù)結(jié)果會不會不一樣答案可能是的任務(wù)就別開緩存。遠(yuǎn)程緩存則讓團(tuán)隊和 CI 共享同一份結(jié)果。本地執(zhí)行npx nx connect關(guān)聯(lián)遠(yuǎn)端之后某臺機(jī)器算過的任務(wù)其他機(jī)器和 CI 節(jié)點可以直接復(fù)用新同學(xué)的 CI 首跑速度會明顯好于之前。只跑受影響的模塊affected 命令怎么用第二個核心能力是按變更范圍執(zhí)行。Nx 會對比兩個 Git 提交之間的文件差異沿著項目依賴圖找出所有被波及的項目只對這些項目執(zhí)行任務(wù)nx affected -t test --baseorigin/main --headHEAD含義是找出相對 main 分支產(chǎn)生變更的項目只對它們運(yùn)行 test 目標(biāo)。日常提交前可以用它快速驗證改動是否破壞了自己負(fù)責(zé)的模塊而不必等待全量結(jié)果。批量執(zhí)行用nx run-many。它按項目集合 目標(biāo)類型兩個維度調(diào)度例如給所有匹配libs/*的項目跑 lint多個任務(wù)之間會自動按依賴排序并行執(zhí)行。理解它的兩個參數(shù)就夠了-t指定要跑的目標(biāo)build、test、lint--all或-p指定項目范圍。看懂依賴圖graph 命令與實際工作流nx graph會在瀏覽器里打開一張交互式的項目依賴圖每個節(jié)點是一個項目箭頭表示依賴方向。它有兩個實際用途排查為什么這個任務(wù)跑了/沒跑在圖里選中某個項目可以看到它的直接依賴和下游對照 affected 的輸出驗證 Nx 的判斷是否符合直覺。識別耦合熱點如果一個庫被幾乎所有應(yīng)用依賴任何對它的改動都會觸發(fā)大面積重跑這是拆分或抽象邊界時的第一手信號。一個可落地的日常工作流是這樣的本地用nx affected -t lint,test做提交前檢查CI 里用同樣的 affected 命令替代全量任務(wù)需要全量時比如改了全局配置再用run-many --all。如果懷疑緩存結(jié)果不對先別急著懷疑 Nx檢查該任務(wù)是否真的滿足無副作用條件或者用nx reset清除本地緩存與編譯產(chǎn)物后重跑對比兩次結(jié)果。?常見誤區(qū)與延伸入口幾個容易踩的坑提前對照檢查改了代碼卻沒重跑多半是輸入配置漏了某個共享文件。Nx 的哈希只覆蓋它認(rèn)識到的輸入全局配置文件如根目錄的 babel 或 jest preset如果被任務(wù)引用卻不在輸入里就要手動補(bǔ)進(jìn)配置。把有外部依賴的任務(wù)開緩存見上文緩存的是相同輸入→相同輸出前提不成立時緩存反而是坑。只用全量命令run-many --all適合發(fā)布前驗證日常提交用 affected 才能保持反饋速度。任務(wù)定義來源混亂任務(wù)可以來自package.jsonscripts、project.json也可以由 Nx 插件從工具鏈配置推斷。排查任務(wù)從哪來時用nx show project name查看完整定義最快。接下來可以做倉庫內(nèi)置文檔位于 astro-docs/src/content/docs/其中緩存原理見 how-caching-works.mdoc任務(wù)執(zhí)行見 run-tasks.mdoc依賴圖探索見 explore-graph.mdoc。如果需要 clone 完整倉庫繼續(xù)研究倉庫地址為 https://gitcode.com/GitHub_Trending/nx/nx 。【免費下載鏈接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.項目地址: https://gitcode.com/GitHub_Trending/nx/nx創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考