這個(gè)問題聊好多年了闷营,雙方觀點(diǎn)旗幟鮮明,各有各的道理知市,搞場辯論賽一定很精彩傻盟。最近由于 antd 的一個(gè) bug 版本被重新談起,然而一直沒有最優(yōu)解嫂丙。
假如不鎖版本娘赴,可能睡一晚產(chǎn)品發(fā)布就掛了,怪誰跟啤,自己人的開源項(xiàng)目還可以找找诽表,react 的鍋總不能飛美國去 Meta 公司找 Dan 吧。假如鎖了版本隅肥,1 不能跟進(jìn)安全修復(fù)類 bug竿奏,2 時(shí)間久了升不動(dòng)也不愿升,筑起技術(shù)債腥放,給后人留屎山泛啸。
除了穩(wěn)定性,這里還有人性的問題秃症,就是誰該對此負(fù)責(zé)候址。因?yàn)槿絾栴}背個(gè)故障,誰都會(huì)覺得冤枉种柑。相反如果有人說別鎖了岗仑,我對故障負(fù)責(zé),那大部分人也就都不會(huì)有意見了聚请,愛鎖不鎖荠雕。
聊這個(gè)話題,還有兩個(gè)點(diǎn)需要提前對齊知識(shí)儲(chǔ)備的。1舞虱、依賴分 node 和 browser欢际,兩者的解法不同,后者需要考慮 tree-shaking矾兜、補(bǔ)丁损趋、產(chǎn)物尺寸等 2、依賴分直接依賴和間接依賴椅寺,鎖直接依賴只能解部分問題浑槽。
問題的根源是 semver。理想的 semver 是 break.feat.bugfix返帕,現(xiàn)實(shí)的 semver 是 break.break.break桐玻。發(fā) break 的 bugfix 版本是社區(qū)的常規(guī)操作。但是在責(zé)怪庫作者之前荆萤,有些場景要除外镊靴,比如使用了私有 API、通過 HACK 的方式關(guān)閉某些功能链韭,依賴組件庫內(nèi)部的 DOM 結(jié)構(gòu)和 CSS 類名偏竟,更新后掛了,這就只能怪自己了敞峭。
是問題就有解踊谋,社區(qū)已有不少。臨時(shí)的比如 cnpm 提供的 bug-versions旋讹,npm 提供的 resolutions殖蚕,侵入式改代碼的 patch-package 等;長期的比如 npm沉迹、yarn 和 pnpm 具備的 lock 能力睦疫,tnpm/cnpm 目前暫不支持,但可以用 yarn mode鞭呕。
內(nèi)部解還有 DEVOPTS 平臺(tái)的迭代鎖笼痛,作為鎖與不鎖之間的端水大師,在整體不鎖的策略下琅拌,確保迭代內(nèi)是穩(wěn)定的缨伊。能解部分問題,但鎖支持者應(yīng)該是不會(huì)滿意的进宝,因?yàn)榭缌说筒环€(wěn)定了刻坊,而建迭代又是高頻操作。
那有沒有兩全的辦法党晋?既要穩(wěn)定谭胚,又要更新徐块,還有有人負(fù)責(zé)。有灾而!一個(gè)思路是「中間商鎖依賴胡控,定期更新,并對此負(fù)責(zé)」旁趟≈缂ぃ框架是開發(fā)者的倒數(shù)第二道防線,自然而然就應(yīng)該是這個(gè)中間商锡搜。
前面說依賴分 node 和 browser橙困。node 部分已經(jīng)這么做了,umi 鎖依賴耕餐,定期更新凡傅,出問題了 umi 負(fù)責(zé)。大家用 umi 3 或者 bigfish 3 應(yīng)該很少再有遇到因三方 node 庫比如 babel肠缔、webpack 更新導(dǎo)致的問題夏跷。比如之前的 coa 掛馬事件,就完全傷不到我們明未。
背后主要是 umi 層對依賴做了徹底鎖槽华,包含間接依賴,通過預(yù)打包依賴的方式亚隅,就算再過 10 年硼莽,也不會(huì)出現(xiàn)因 node 依賴更新導(dǎo)致 umi 掛的情況庶溶。此外還有些細(xì)節(jié)煮纵,比如 babel runtime 和 polyfill 等 browser 依賴的鎖定等。
能套用到 browser 依賴嗎偏螺?有點(diǎn)困難行疏。1、徹底鎖的問題套像,browser 要考慮尺寸酿联,預(yù)打包會(huì)讓 tree-shaking 失效 2、回歸的成本問題夺巩,比如 antd 庫的回歸贞让,除了人肉回歸大量項(xiàng)目,沒想到萬全的方法 3柳譬、不像 node 庫大部分問題在流程中就能發(fā)現(xiàn)喳张,browser 庫直接影響線上,所以風(fēng)險(xiǎn)更高美澳。
問題 1 是工程問題销部,大概率是有解的摸航,現(xiàn)在沒有解再過幾年來看看可能就有了,我想到的是 importmaps 鎖舅桩,借助 esmi 服務(wù)酱虎,可解尺寸問題;問題 2 需要人擂涛,群里得知 LOWCODE 平臺(tái)維護(hù)的 xxx-antd 每次迭代 N 人日保障读串,雖不能完全確保沒問題,但相比盲升應(yīng)該是更是靠譜的歼指;群里還有聊到灰度的方案爹土,解法是加延遲,讓一個(gè)群體或不重要的業(yè)務(wù)先踩坑踩身,避免對重要業(yè)務(wù)的影響胀茵。
所以 importmaps 鎖 + 有人擔(dān)保的類 xxx-antd 中間依賴 + 灰度可能是 browser 依賴的完美解。至于 procode 為啥直接用 xxx-antd 不夠完美挟阻?因?yàn)殚g接依賴沒鎖琼娘。