28 - 《依赖版本锁不锁》
发布于 2022年1月3日
敏感词或可能引起不适的词已用 xx 替换。
这个问题聊好多年了,双方观点旗帜鲜明,各有各的道理,搞场辩论赛一定很精彩。最近由于 antd 的一个 bug 版本被重新谈起,然而一直没有最优解。
假如不锁版本,可能睡一晚产品发布就挂了,怪谁,自己人的开源项目还可以找找,react 的锅总不能飞美国去 Meta 公司找 Dan 吧。假如锁了版本,1 不能跟进安全修复类 bug,2 时间久了升不动也不愿升,筑起技术债,给后人留屎山。
除了稳定性,这里还有人性的问题,就是谁该对此负责。因为三方问题背个故障,谁都会觉得冤枉。相反如果有人说别锁了,我对故障负责,那大部分人也就都不会有意见了,爱锁不锁。
聊这个话题,还有两个点需要提前对齐知识储备的。1、依赖分 node 和 browser,两者的解法不同,后者需要考虑 tree-shaking、补丁、产物尺寸等 2、依赖分直接依赖和间接依赖,锁直接依赖只能解部分问题。
问题的根源是 semver。理想的 semver 是 break.feat.bugfix,现实的 semver 是 break.break.break。发 break 的 bugfix 版本是社区的常规操作。但是在责怪库作者之前,有些场景要除外,比如使用了私有 API、通过 HACK 的方式关闭某些功能,依赖组件库内部的 DOM 结构和 CSS 类名,更新后挂了,这就只能怪自己了。
是问题就有解,社区已有不少。临时的比如 cnpm 提供的 bug-versions,npm 提供的 resolutions,侵入式改代码的 patch-package 等;长期的