組件改動(dòng)會(huì)影響哪里?我用這 7 層給 Codex 劃清影響范圍)
上一篇完成了組件調(diào)用鏈檢查先列公開(kāi)面再找直接、間接和條件性調(diào)用方最后補(bǔ)查狀態(tài)、副作用、生命周期、樣式和測(cè)試。但找到依賴并不等于所有依賴都需要修改。例如一個(gè)組件被 12 個(gè)頁(yè)面使用改內(nèi)部變量名12 個(gè)頁(yè)面可能都不受影響改 Prop 默認(rèn)值只有沒(méi)有顯式傳值的頁(yè)面受影響改事件負(fù)載監(jiān)聽(tīng)該事件的調(diào)用方需要檢查改根節(jié)點(diǎn)結(jié)構(gòu)業(yè)務(wù)邏輯不變但外部樣式和測(cè)試可能受影響改保存后的關(guān)閉時(shí)機(jī)所有調(diào)用方都可能出現(xiàn)用戶行為變化。所以影響范圍不能直接用“引用數(shù)量”代替。我會(huì)繼續(xù)追問(wèn)當(dāng)前改動(dòng)改變了哪一層可觀察結(jié)果哪些位置必須同步修改哪些只需要回歸哪些可以明確排除為了讓 Codex 的分析不止停在文件列表我把影響范圍拆成 7 層。評(píng)估開(kāi)始前先寫一條“變化聲明”影響評(píng)估必須圍繞具體變化展開(kāi)。“優(yōu)化彈窗組件”無(wú)法判斷范圍“把保存成功后的關(guān)閉責(zé)任從組件內(nèi)部交給父頁(yè)面”才有清楚的傳播方向。我會(huì)先寫四項(xiàng)# 變化聲明 - 當(dāng)前行為 - 目標(biāo)行為 - 明確保持不變 - 尚未確定其中“明確保持不變”非常重要。例如目標(biāo)只改變事件負(fù)載就應(yīng)明確事件觸發(fā)時(shí)機(jī)、失敗行為、關(guān)閉規(guī)則和 Loading 歸屬是否保持不變。否則 Codex 可能為了讓新接口更順手同時(shí)調(diào)整一整段流程。如果目標(biāo)行為仍有多種解釋影響評(píng)估應(yīng)該先暴露差異不急著給出修改范圍。第一層用戶行為影響我先看用戶能觀察到什么變化。包括入口是否仍然可見(jiàn)點(diǎn)擊、輸入、提交和取消結(jié)果是否變化Loading、禁用、錯(cuò)誤和空狀態(tài)是否變化成功后頁(yè)面是否刷新、跳轉(zhuǎn)或關(guān)閉連續(xù)操作和返回重入是否變化鍵盤、焦點(diǎn)和可訪問(wèn)行為是否變化。用戶行為層決定驗(yàn)收主線。一個(gè)內(nèi)部契約變化如果最終行為完全不變重點(diǎn)是兼容和回歸如果用戶行為本身改變就必須回到需求和驗(yàn)收標(biāo)準(zhǔn)不能把它偽裝成內(nèi)部重構(gòu)。我會(huì)要求 Codex 用前后對(duì)照寫清場(chǎng)景修改前修改后是否為需求目標(biāo)正常操作當(dāng)前結(jié)果目標(biāo)結(jié)果是 / 否請(qǐng)求失敗當(dāng)前恢復(fù)方式目標(biāo)恢復(fù)方式是 / 否關(guān)閉重開(kāi)當(dāng)前狀態(tài)目標(biāo)狀態(tài)是 / 否連續(xù)操作當(dāng)前順序目標(biāo)順序是 / 否任何“不是需求目標(biāo)但會(huì)發(fā)生變化”的行都是范圍擴(kuò)張信號(hào)。第二層公開(kāi)契約影響這一層檢查組件對(duì)外暴露的接口是否變化Props 名稱、類型、必填和默認(rèn)值Emits 名稱、時(shí)機(jī)和負(fù)載v-model的值與更新規(guī)則插槽名稱、作用域和默認(rèn)內(nèi)容暴露方法的簽名與返回值屬性和事件透?jìng)鞴_(kāi)類型和統(tǒng)一導(dǎo)出。我會(huì)把契約變化分成三類。兼容變化舊調(diào)用方式仍然成立新能力只是可選增加。即便如此也要驗(yàn)證默認(rèn)行為沒(méi)有改變。需要遷移的變化調(diào)用方必須調(diào)整才能繼續(xù)工作例如事件改名、必填 Prop 增加、負(fù)載結(jié)構(gòu)變化。隱性破壞變化類型可能仍然通過(guò)但運(yùn)行行為變了例如默認(rèn)值、事件時(shí)機(jī)、透?jìng)魑恢没虿宀郯Y(jié)構(gòu)改變。隱性破壞最值得警惕因?yàn)樽詣?dòng)檢查未必會(huì)報(bào)錯(cuò)。第三層調(diào)用入口影響調(diào)用入口層回答變化會(huì)傳播到哪些消費(fèi)者。這里使用上一篇得到的調(diào)用鏈把消費(fèi)者分為直接調(diào)用統(tǒng)一導(dǎo)出或組件庫(kù)入口包裝組件全局注冊(cè)動(dòng)態(tài)映射路由和自動(dòng)掃描其他應(yīng)用或本地包。我不會(huì)把所有消費(fèi)者都列為“待修改”。我會(huì)進(jìn)一步標(biāo)注消費(fèi)者是否使用變化契約是否依賴變化行為處理方式直接頁(yè)面 A是是修改并驗(yàn)證頁(yè)面 B否可能依賴默認(rèn)值重點(diǎn)回歸包裝組件 C是會(huì)向上透?jìng)餍薷牟⒗^續(xù)查上層示例 D是不進(jìn)入生產(chǎn)路徑同步示例或記錄舊版 E否已明確不在范圍排除并說(shuō)明依據(jù)這種分類能避免兩個(gè)極端漏掉真正受影響的調(diào)用方或者因?yàn)橐枚嗑桶阉形募黄鸶牡簟5谒膶訑?shù)據(jù)與狀態(tài)影響組件行為通常依賴數(shù)據(jù)來(lái)源和狀態(tài)歸屬。我會(huì)沿下面幾個(gè)問(wèn)題檢查輸入數(shù)據(jù)來(lái)自父級(jí)、路由、狀態(tài)模塊還是請(qǐng)求組件內(nèi)部是否保存副本是否存在計(jì)算值、緩存值或映射值修改是否改變狀態(tài)唯一來(lái)源數(shù)據(jù)轉(zhuǎn)換發(fā)生在哪一層成功和失敗會(huì)寫回哪些狀態(tài)其他頁(yè)面是否共享同一狀態(tài)。例如事件負(fù)載從“無(wú)參數(shù)通知”變成“返回更新后的記錄”看起來(lái)只是契約增強(qiáng)卻可能讓父頁(yè)面從“重新請(qǐng)求列表”改成“直接替換當(dāng)前行”。這時(shí)影響不只是事件類型還包括列表數(shù)據(jù)是否完整排序和篩選是否仍然成立服務(wù)端計(jì)算字段是否已經(jīng)返回當(dāng)前頁(yè)總數(shù)是否變化其他共享狀態(tài)是否同步。如果這些條件沒(méi)有證據(jù)就不能把減少一次請(qǐng)求當(dāng)成順手優(yōu)化。第五層副作用影響副作用包括所有會(huì)越過(guò)組件內(nèi)部邊界的動(dòng)作網(wǎng)絡(luò)請(qǐng)求路由變化全局狀態(tài)寫入緩存與本地存儲(chǔ)全局事件定時(shí)器和訂閱下載、打印或剪貼板日志、埋點(diǎn)和監(jiān)控。評(píng)估副作用時(shí)我不會(huì)只問(wèn)“是否調(diào)用”還會(huì)問(wèn)調(diào)用次數(shù)是否變化調(diào)用時(shí)機(jī)是否變化參數(shù)和返回處理是否變化失敗和取消路徑是否變化誰(shuí)依賴副作用產(chǎn)生的結(jié)果。把請(qǐng)求從父頁(yè)面移進(jìn)組件或者從組件移回父頁(yè)面可能都能實(shí)現(xiàn)功能但責(zé)任邊界、測(cè)試方式和復(fù)用條件會(huì)完全改變。副作用位置發(fā)生變化時(shí)我通常會(huì)提高風(fēng)險(xiǎn)等級(jí)并要求單獨(dú)驗(yàn)證。第六層生命周期與時(shí)序影響前端很多問(wèn)題不是“做沒(méi)做”而是“什么時(shí)候做”。我會(huì)標(biāo)出關(guān)鍵時(shí)序首次掛載打開(kāi)前后輸入或 Prop 變化提交開(kāi)始和結(jié)束請(qǐng)求成功、失敗和取消關(guān)閉路由離開(kāi)緩存激活與失活卸載多次請(qǐng)求返回順序。一項(xiàng)看似兼容的修改如果改變了事件觸發(fā)時(shí)機(jī)仍然可能破壞調(diào)用方。例如父頁(yè)面原本在saved事件中立即讀取組件狀態(tài)如果事件改到清理之后觸發(fā)事件名稱和類型都沒(méi)變讀取結(jié)果卻變了。時(shí)序影響通常要靠場(chǎng)景驗(yàn)證而不能只依賴靜態(tài)檢查。第七層DOM、樣式與驗(yàn)證影響我把這三項(xiàng)放在同一層是因?yàn)樗鼈兘?jīng)常不在業(yè)務(wù)調(diào)用鏈中卻直接影響交付。DOM 與樣式根節(jié)點(diǎn)是否變化類名和層級(jí)是否變化外部選擇器或深層樣式是否依賴內(nèi)部結(jié)構(gòu)屬性透?jìng)髀湓谀膫€(gè)元素響應(yīng)式、溢出和定位是否變化語(yǔ)義標(biāo)簽、焦點(diǎn)順序和可訪問(wèn)名稱是否變化。測(cè)試與驗(yàn)證單元測(cè)試是否依賴舊契約頁(yè)面測(cè)試是否依賴文本、選擇器和觸發(fā)順序截圖基線是否會(huì)變化類型檢查覆蓋哪些調(diào)用方哪些條件路徑必須人工驗(yàn)證回退時(shí)能否恢復(fù)原行為。一個(gè)影響評(píng)估如果沒(méi)有驗(yàn)證出口就仍然只是猜測(cè)。我怎樣給影響分級(jí)我不喜歡給組件改動(dòng)算一個(gè)看似精確的風(fēng)險(xiǎn)分?jǐn)?shù)。真實(shí)項(xiàng)目中的權(quán)重很難統(tǒng)一。我會(huì)用兩組標(biāo)簽。傳播方式直接影響明確使用變化契約或行為間接影響通過(guò)包裝、狀態(tài)、類型或副作用傳播條件性影響只在特定配置、權(quán)限、數(shù)據(jù)或操作順序出現(xiàn)。處理級(jí)別必須修改不調(diào)整就會(huì)類型失敗、運(yùn)行失敗或行為錯(cuò)誤必須回歸代碼可能不用改但依賴默認(rèn)值、時(shí)序、DOM 或共享狀態(tài)觀察記錄與變化有關(guān)但當(dāng)前證據(jù)表明不進(jìn)入交付路徑明確排除有依據(jù)證明不在當(dāng)前應(yīng)用、版本或任務(wù)范圍。每個(gè)影響點(diǎn)都要同時(shí)有傳播方式和處理級(jí)別。例如“包裝組件 C間接影響必須修改”“頁(yè)面 B條件性影響必須回歸”“舊版示例直接引用但明確排除”。這樣比高、中、低三個(gè)詞更容易落實(shí)到計(jì)劃。一個(gè)方法演示修改編輯彈窗的成功事件負(fù)載下面只用于說(shuō)明評(píng)估方法不代表真實(shí)項(xiàng)目案例。假設(shè)當(dāng)前彈窗保存成功后只觸發(fā)通知saved()現(xiàn)在計(jì)劃改為返回更新后的記錄saved(updatedRecord)表面看是一次契約擴(kuò)展7 層影響可能包括用戶行為按目標(biāo)應(yīng)保持不變?nèi)匀槐4娉晒Α㈥P(guān)閉彈窗并刷新正確數(shù)據(jù)。公開(kāi)契約事件負(fù)載類型變化原來(lái)不接收參數(shù)的監(jiān)聽(tīng)是否仍然兼容需要結(jié)合項(xiàng)目類型和寫法確認(rèn)。調(diào)用入口所有監(jiān)聽(tīng)saved的直接頁(yè)面要查包裝彈窗如果透?jìng)魇录€要繼續(xù)查它的上層調(diào)用方。數(shù)據(jù)與狀態(tài)調(diào)用方是否會(huì)用返回記錄直接替換列表項(xiàng)記錄是否包含完整展示字段是否會(huì)破壞排序和篩選。副作用原本的列表刷新請(qǐng)求是否保留如果刪除接口調(diào)用次數(shù)和服務(wù)端最新?tīng)顟B(tài)的獲取方式會(huì)改變。生命周期事件在關(guān)閉和狀態(tài)清理之前還是之后觸發(fā)父級(jí)能否讀取所需上下文。DOM 與驗(yàn)證模板可能不變但事件測(cè)試、頁(yè)面刷新測(cè)試和失敗路徑需要回歸。這時(shí)更穩(wěn)妥的結(jié)論可能不是“順便刪除刷新請(qǐng)求”而是先只增加事件負(fù)載保持刷新行為不變。等證據(jù)證明返回記錄足以替代重新請(qǐng)求再把優(yōu)化拆成獨(dú)立任務(wù)。影響評(píng)估的價(jià)值就是阻止一個(gè)小契約變化悄悄夾帶第二個(gè)行為變化。一份可以交給 Codex 的影響范圍模板# 組件改動(dòng)影響范圍 ? ## 0. 變化聲明 - 當(dāng)前行為 - 目標(biāo)行為 - 保持不變 - 尚未確定 ? ## 1. 用戶行為 | 場(chǎng)景 | 修改前 | 修改后 | 是否為目標(biāo)變化 | 驗(yàn)證方式 | | --- | --- | --- | --- | --- | ? ## 2. 公開(kāi)契約 | 契約 | 當(dāng)前定義 | 計(jì)劃變化 | 兼容性 | 證據(jù) | | --- | --- | --- | --- | --- | ? ## 3. 調(diào)用入口 | 消費(fèi)者 | 傳播方式 | 依賴內(nèi)容 | 處理級(jí)別 | 驗(yàn)證方式 | | --- | --- | --- | --- | --- | ? ## 4. 數(shù)據(jù)與狀態(tài) - 輸入來(lái)源 - 唯一狀態(tài)來(lái)源 - 數(shù)據(jù)轉(zhuǎn)換 - 共享消費(fèi)者 - 成功與失敗寫回 ? ## 5. 副作用 - 請(qǐng)求 - 路由 - 全局狀態(tài) - 緩存、事件和訂閱 ? ## 6. 生命周期與時(shí)序 - 關(guān)鍵時(shí)間點(diǎn) - 連續(xù)操作 - 關(guān)閉、重入與卸載 - 異步競(jìng)態(tài) ? ## 7. DOM、樣式與驗(yàn)證 - DOM 與屬性透?jìng)?- 外部樣式 - 自動(dòng)檢查 - 頁(yè)面回歸 - 條件性路徑 ? ## 8. 執(zhí)行結(jié)論 - 必須修改 - 只需回歸 - 觀察記錄 - 明確排除 - 暫停條件影響范圍怎樣反過(guò)來(lái)控制執(zhí)行計(jì)劃影響評(píng)估完成后我會(huì)據(jù)此調(diào)整 Codex 的修改批次。先固定契約再改調(diào)用方契約尚未確定時(shí)不讓多個(gè)調(diào)用方同時(shí)遷移。直接影響先處理間接影響逐層展開(kāi)包裝組件或共享狀態(tài)會(huì)繼續(xù)傳播影響不能把它們和最終頁(yè)面混成一個(gè)大批次。條件性影響單獨(dú)設(shè)計(jì)驗(yàn)證權(quán)限、環(huán)境、舊數(shù)據(jù)和連續(xù)操作不能用正常路徑順便帶過(guò)。“只需回歸”不等于可以忽略沒(méi)有代碼差異的調(diào)用方同樣可能因?yàn)槟J(rèn)值、時(shí)序和 DOM 變化而出問(wèn)題。明確排除要留下依據(jù)例如舊版應(yīng)用未進(jìn)入當(dāng)前構(gòu)建、示例不參與生產(chǎn)、某調(diào)用方顯式覆蓋了變化默認(rèn)值。沒(méi)有依據(jù)的排除只是遺漏。哪些信號(hào)說(shuō)明影響范圍還沒(méi)有劃清只列文件沒(méi)有說(shuō)明依賴行為所有引用都被標(biāo)成“可能受影響”只看類型錯(cuò)誤沒(méi)有檢查默認(rèn)值和事件時(shí)機(jī)修改范圍與回歸范圍完全相同條件性調(diào)用沒(méi)有觸發(fā)條件公共狀態(tài)和副作用沒(méi)有繼續(xù)向下追蹤DOM 變化被簡(jiǎn)單寫成“不影響功能”驗(yàn)證項(xiàng)只有“運(yùn)行測(cè)試”沒(méi)有說(shuō)明測(cè)試覆蓋什么計(jì)劃改變了用戶行為卻仍把任務(wù)描述成內(nèi)部重構(gòu)。出現(xiàn)這些信號(hào)時(shí)我不會(huì)讓 Codex直接進(jìn)入多文件修改。寫在最后調(diào)用鏈解決“誰(shuí)與組件有關(guān)”影響范圍解決“誰(shuí)會(huì)因?yàn)楫?dāng)前變化而發(fā)生什么”。我會(huì)從 7 層判斷一個(gè)組件改動(dòng)用戶行為公開(kāi)契約調(diào)用入口數(shù)據(jù)與狀態(tài)副作用生命周期與時(shí)序DOM、樣式與驗(yàn)證。然后給每個(gè)影響點(diǎn)標(biāo)注直接、間接或條件性傳播再判斷它屬于必須修改、必須回歸、觀察記錄還是明確排除。這樣得到的不是一張夸大的文件清單而是一份可以直接控制修改批次和驗(yàn)收路徑的工程依據(jù)。下一篇會(huì)進(jìn)入第 2 周 Day 4Codex 完成修改以后我怎樣審查代碼差異。我會(huì)從正確性、修改范圍和副作用三個(gè)層面檢查并重點(diǎn)說(shuō)明為什么“代碼看起來(lái)合理”仍然可能偏離任務(wù)目標(biāo)。本系列持續(xù)更新。接下來(lái)會(huì)把今天劃定的影響范圍作為差異審查基線檢查 AI 實(shí)際改動(dòng)是否既沒(méi)有漏也沒(méi)有越界。參考資料OpenAI Codex 用例理解代碼庫(kù)時(shí)應(yīng)追蹤請(qǐng)求流、模塊職責(zé)、狀態(tài)轉(zhuǎn)換、隱藏依賴和修改后的檢查OpenAI Codex 用例復(fù)雜問(wèn)題應(yīng)建立評(píng)估方式聚焦修改并在有意義的變化后重新驗(yàn)證每日好工具推薦在這里推薦一款超好用的圖片壓縮工具——“圖壓”在線圖片壓縮免費(fèi)壓縮 JPG、PNG、WebP - 圖壓工具。同事安利給我的用過(guò)后真的覺(jué)得太香了支持批量壓縮、調(diào)整壓縮百分比最關(guān)鍵的是它是離線程序下載到本地就能反復(fù)用。我平時(shí)做自媒體和寫前端時(shí)經(jīng)常用到再也不用去網(wǎng)上找在線壓縮工具了。它也帶在線壓縮功能很方便。