![]()
去年某大廠前端團隊復盤,一個Button組件被改出47個版本,維護成本吃掉2個全職人力。這不是技術債,是設計債。
組件復用聽著像基礎課,但多數(shù)團隊卡在兩個極端:要么復制粘貼到代碼發(fā)臭,要么過度抽象到?jīng)]人敢動。本文用一套可落地的判斷標準,幫你避開這個經(jīng)典陷阱。
一、先定義:什么叫"真·復用"
能復制粘貼的不叫復用,那叫搬運。真正可復用的組件要過三關:隨處能跑、行為一致、職責單一。
隨處能跑意味著跨項目移植時不用重寫核心邏輯。行為一致意味著同樣的props進去,同樣的UI和交互出來,不玩驚喜。職責單一意味著解決一個具體問題,不捆綁無關功能。
給團隊做個快速測試:新人能否在10分鐘內把你的組件插進新頁面,改幾個props就上線?通不過,說明抽象層級有問題。
看這個反面教材:
function Button() { return Submit; }
硬編碼寫死一切。業(yè)務說按鈕文字要改?復制一份。設計說顏色要變?再復制一份。三個月后,Button_v1到Button_v12散落在十幾個目錄里,改個圓角要全局搜索替換。
二、第一步:把值變成入口
復用的起點是停止硬編碼。把變化點抽成props,讓組件變成"配置驅動"而非"代碼驅動"。
![]()
function Button({ children, onClick }) { return ( {children} ); }
現(xiàn)在同一組件支撐多種場景:
Save Delete
props是靈活性的血管。命名要自解釋,別用v或flag這種黑話。默認值兜底,避免undefined引發(fā)的連鎖反應。TypeScript或PropTypes做類型校驗,把錯誤攔在編譯期。
但別急著把所有東西塞成props。我見過一個Input組件有83個props,文檔比組件代碼還長。這叫配置地獄,是過度抽象的另一種死法。
三、第二步:用變體替代復制
設計系統(tǒng)里的按鈕通常有固定幾種形態(tài):主按鈕、次級按鈕、危險操作。與其建三個文件,不如用variant模式收斂。
function Button({ children, variant = "primary", onClick }) { const styles = { primary: "bg-blue-500 text-white", secondary: "bg-gray-200 text-black", danger: "bg-red-500 text-white", }; return ( {children} ); }
關鍵洞察:variant不是隨意擴展的垃圾桶。每新增一個變體,都要過設計評審——它是否代表一個獨立的語義場景?還是只是某個頁面的臨時樣式?后者不該進組件庫。
某電商團隊曾把"大促紅""新品綠""會員金"全做成variant,結果大促結束,代碼里留著永遠不會再用的樣式分支。variant的保質期,比代碼更長。
四、第三步:開放與封閉的邊界
![]()
組件設計有個經(jīng)典張力:封太死,業(yè)務方繞過你寫hack;開太寬,維護成本爆炸。解法叫"開放-封閉原則"——對擴展開放,對修改封閉。
具體做法:暴露有限的、語義化的props作為"官方接口",同時留一個escape hatch。常見模式是接受className或style作為覆蓋入口,但文檔里標注"非必要不使用"。
更進階的做法是用組合模式。把組件拆成多個子部件,讓業(yè)務方像搭積木一樣拼裝。Radix UI、Headless UI這類庫是典型:它們提供無樣式的行為邏輯,外觀完全交給消費者。
但組合模式有學習成本。團隊規(guī)模小、業(yè)務變化快時,一套約定良好的props API可能更務實。沒有銀彈,只有權衡。
五、第四步:測試即文檔
可復用組件的隱形門檻是測試覆蓋率。不是追求數(shù)字,而是覆蓋真實使用場景:不同props組合、邊界值、異常狀態(tài)。
Storybook這類工具的價值在這里顯現(xiàn)。每個story是一個活文檔,展示組件在特定狀態(tài)下的表現(xiàn)。新成員不用讀源碼,瀏覽一遍story就能上手。
更關鍵的是視覺回歸測試。設計系統(tǒng)迭代時,自動化工具能捕捉 unintended changes——那個"微調"的間距,是否意外破壞了12個頁面的布局?
某金融科技團隊把組件測試納入CI卡點:PR若降低story覆蓋率,自動阻斷合并。三個月后,組件bug率下降62%,設計-前端協(xié)作的返工次數(shù)減半。
六、最后:復用的成本賬
不是每個組件都值得復用。抽象有成本:設計通用接口、編寫文檔、維護向后兼容、處理跨項目同步。如果某個組件只在兩處使用,且變化頻率低,復制粘貼可能是更經(jīng)濟的選擇。
判斷標準是"變化頻率×使用場景數(shù)"。高頻變化+多場景=必須抽象。低頻變化+少場景=延遲抽象。過早優(yōu)化是復用陷阱的另一種形式。
那位改出47個Button版本的團隊,最終收斂到1個核心組件+3個業(yè)務包裝層。重構花了2周,但后續(xù)半年節(jié)省的維護時間,相當于2個全職人力。他們的技術負責人后來復盤:「最昂貴的不是重寫,是每次改需求時的心理負擔——我不知道動這里會不會炸掉別處。」
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.