Lessons from rewriting the next major version of Vue.js
在过去的一年中,Vue团队一直在研究Vue.js的下一个主要版本,我们希望在2020年上半年发布该版本。(在撰写本文时,这项工作仍在进行中)。 Vue的主要版本于2018年底形成,当时Vue 2的代码库已有两年半的历史了。在通用软件的生命周期中听起来可能并不长,但在此期间,前端环境发生了巨大变化。
有两个主要的考虑因素使我们开发了Vue的新主要版本(并重写了它):首先,主流浏览器普遍提供了新的JavaScript语言功能。其次,随着时间的推移,当前代码库中的设计和体系结构问题已经暴露出来。
[为什么要改写]
利用新的语言功能
随着ES2015 的标准化,JavaScript (正式称为ECMAScript,缩写为ES )获得了重大改进,主流浏览器终于开始为这些新功能提供不错的支持。特别是一些为我们提供了极大提高Vue功能的机会。
其中最值得注意的是Proxy,它允许框架拦截对象上的操作。Vue的核心功能是能够侦听对用户定义状态所做的更改并以反应方式更新DOM的能力。Vue 2通过使用getter和setter替换状态对象上的属性来实现这种反应性。切换到Proxy将使我们消除Vue的现有限制,例如无法检测到新的属性添加并提供更好的性能。
但是,Proxy在IE浏览器或者旧版本的浏览器中存在兼容行问题。为了利用它,我们必须调整框架的浏览器支持范围,这是一个重大突破,只能在新的主要版本中发布。
解决架构问题
在维护Vue2的过程中,由于现有架构的局限性,我们积累了许多难以解决的问题。例如,模板编译器的编写方式使适当的源映射支持非常具有挑战性。同样,虽然Vue 2从技术上允许构建针对非DOM平台的更高级别的渲染器,但我们必须派生代码库并复制大量代码,才能实现这一点。要在当前的代码库中解决这些问题,将需要进行大量风险较大的重构,这几乎等同于rewrite 。
同时,我们以各种模块的内部与浮动代码之间隐式耦合的形式积累了技术债务,而浮动代码似乎并不属于任何地方。这使得孤立地理解代码库的一部分变得更加困难,并且我们注意到,贡献者很少会对进行重要的更改充满信心。重写将使我们有机会牢记这些注意事项来重新考虑代码组织。
要在当前的代码库中解决这些问题,将需要进行大量风险较大的重构,这几乎等同于rewrite 。