Vue2.0 升级 Vue3.0 成本评估报告.pdf (801.0 KB)
2021-4-28
前言
KOCA 前端技术体系使用 Vue 版本 V2.6.11
Vue3.x 正式发版时间 2020.09.18
Vue3.0 正式发版已有一段时间了,有一些团队已经开始启用 vue3.0 开展新的项目,但大部分朋友还是守着 vue2.0 老项目过日子,那么对于 KOCA 前端框架来说,做一次框架升级到底会带来哪些成本和收益?
关注要点
- vue3.x 新特性及这些新特性给开发者和产品带来的好处
- 升级 3.x 所面临问题
- 是否有必要升级?升级的计划安排
- 现有 koca 前端支持分布式部署方案?那么这个方案是否支持微应用使用 vue3.0 框架
针对以上关注要点,我们做了一些调研
Vue3.x 新特性
一、性能比 Vue2.x 快近 2 倍
二、按需编译,体积比 vue2.x 更小
三、提供组合 API, composition api
四、更好的 ts 支持
五、新增 3 个组件:Frament, Teleport, Suspense
六、暴露了自定义渲染 api, Custom Renderer API
性能比 Vue2.x 块近 2 倍
Vue2.x | Vue3.x | |
---|---|---|
重写了虚拟 DOM 的实现,diff 算法的优化 | Vue2.x 中的 dom 是进行全量对比渲染(对应的所有dom 都对比一遍,增加了对比次数和渲染速度)添加了静态标记(与上次dom 节点对比的时候,只对比有静态)hoistStast 静态提升 vue2.x 无论元素是否参与更新,每次都要重新创建,然后渲染 | vue3.0 中对于不参与更新的元素,会做静态提升,只会被创建一次,在渲染时直接复用即可 |
cacheHandlers 事件侦听器缓存 | vue2.x 默 认 情 况 下onClick 会被视为动态绑定,所以每次都会去追踪它的变化; | Vue3.0 因为是同一个函数,所以没有追踪变化,直接缓存起来复用即可; |
ssr 渲染 | vue2.x 当有大量静态的内容时,这些内容会被当做纯字符串推进一个 buffer 里面,即使存在动态的绑定,会通过模板 插值嵌入进去,这样会比通过虚拟 dom 来渲染的快很多 | vue3.0 当静态文件大到一定 量 的 时 候 , 会 用_ceratStaticVNode 方 法在 客 户 端 去 生 成 一 个static node, 这 些 静 态node,会被直接innerHtml,就不需要创建对象,然后根据对象渲染 |
表 1Vue2.x 与 Vue3.x 对比
按需编译,体积比 vue2.x 更小
vue3 中的核心 api 都支持了 tree-shaking,这些 api 都是通过包引入的式而不是直接在实例化时就注入,只会对使用到的功能或特性进行打包(按需打包),这意味着更多的功能和更小的体积。
提供组合 API, composition api
vue2 中,我们一般会采用 mixin 来复用逻辑代码,用倒是挺好用的,不过也存在一些问题:例如代码来源不清晰、方法属性等冲突。基于此在 vue3 中引入了 Composition AP(I 组合 API),使用纯函数分隔复用代码。和 React 中的 hooks的概念很相似。
- 更好的逻辑复用和代码组织
- 更好的类型推导
新增 3 个组件:Frament, Teleport, Suspense
①Fragment:模板可以有多个根元素
②Teleport: 提供一种将子节点渲染到存在于父组件以外的 DOM 节点的优
秀的方案。
③Suspense 让你的组件在渲染之前进行“等待”。
暴露了自定义渲染 API, Custom Renderer API
这个 api 定义了虚拟 DOM 的渲染规则,这意味着使用自定义 API 可以达到跨平台的目的。自定义渲染器 api,vue 2 也可以做,之前 weex、nativescript vue 都是通过vue 2 的一个非暴露的 api,去实现这个功能。但是 vue 2 引入了一些依赖上同步的问题。vue 3 就是一个内置的 api。
以上 3,4 为比较明显的特性,但这两个特性解决的问题目前也不是很致命组 合 API. 新 的 API兼容Vue2.x, 只需要在项目中,单独引入*@vue/composition-api这*个包对 typescript 的友好支持,针对喜欢写 ts 的人,在 vue2.x 的基础上,额外引入一些包,加一些装饰器,基本也能用二、升级 vue3.x, 可能面临的问题
vue3.0 非兼容的改变与建议
-
vue3.0升级参考表
v-for 中的 Ref 数组 | Vue.js -
当前项目生态中的几个库都面临巨大升级,以及升级后要填的一些坑,比如:
vue-router(vue-router@4)
Vuex (vuex@4)
ElementUI(Element plus, 不兼容列表
这些生态在 2.x 上都已经很成熟, 在 3 上可能还有很长的路要走
-
Vue3.x没有默认对象export default, 当前项目中所有直接使用 Vue.xxx 的语法全部得重写
-
放弃对 IE11 的支持(原有的兼容版本,因为微软推进 Edge 浏览器,并打算放弃 IE11 所以兼容版本不会出)
Vue 2 的反应系统基于 ES5 getter / setter。Vue 3 利用 ES2015 代理获得了性能更高且更完整的反应系统,该系统无法在 IE11 中进行多填充。这是主要障碍,因为这意味着 Vue 3 要支持 IE11,它实际上需要发布两个具有不同行为的不同版本-一个使用基于 Proxy 的反应系统,另一个使用类似于 Vue 2 的基于ES5-getter / setter 的系统。。
Vue 3 的基于代理的反应性系统提供了几乎完整的语言功能覆盖。它能够检测许多在 ES5 中不可能或不可行的操作,例如属性添加/删除,数组索引和length突变以及 in 操作员检查。为 Vue 3 的代理版本编写的相同代码在 IE11 版本中不起用。这不仅给我们带来了技术上的复杂性,也给开发人员带来了持续的精神负担。
尤玉溪在知乎上关于 vue3 的 IE11 支持三、Vue3.x 为什么有必要用
-
兼容 Vue2.x 95%以上特性,所以其优点全部得到集成,上手快,门槛低
-
对 Ts 支持更加友好,更加迎合行业趋势,技术潮流
-
Composition API 的添加,会让一部分 React 用户转投过来,以后群体会更大,生态更丰富
Vue3.x 与微前端的结合
KOCA 的微前端支持方案基于 vue2.x, 即主应用是基于 vue2.x, 问,微应用是否可以基于 Vue3.0 开发?
可以,但是微应用只能以 iframe 的形式嵌入。因为当一个微前端中同时存在两个 vue 版本时,vue 原型会被覆盖。
结论:
研发中心作为一个研发性质的部门,有必要去使用 Vue3.x, 但基于 KOC目前一个正在使用的前端平台,可以尝试 Vue2.x + @vue/composition-ap渡,不建议断崖式升级
前端团队计划安排(引用):
-
Vue2.7 + @vue/composition-api,支持Vue3.x 的新语法,同时制定严格的 Composition API 使用规范
-
基于 Vue3.x 搭建新的基础框架(全面 Ts)!不会基于老的框架升级!同时制定详细的 Vue3.x 模板开发规范
-
从此以后,老的项目依然使用 Vue2.7+ @vue/composition-api 维护直至退役,或者完全被新的 Vue3.x 框架替代成全新的工程
目前使用 KOCA 前端的产品
证券软件总部 7
金证财富 16
金证前海 3
智慧城市 3
睿服科技 2
创新合作部 2