吊带公主裙|为什么我们放弃了Vue?Vue和React深度比较( 五 )


“虽然模板语法有那么多问题 , 但是Vue也支持JSX呀 。 ”
我猜到你会这么说 , 但就像上面所说的 , 既然我一定要用JSX / TSX , Redux了 , 那我为什么不用React?
“基于HTML的模板可以将现有的应用逐步迁移到Vue更加容易”
不会更容易 , 只会更麻烦 。 首先 , 下面会说到的模板中无法很好linting , type指示 , 代码迁移过去很多bug无法及时发现 。 其次代码迁移很大一部分都是js逻辑的迁移(这个更重要) , 迁移到vue中 , 你需要填鸭式细分原始代码 , 放到计算 , 心态中 , 工作量不小且代码和Vue强绑定 。 最后 , 原代码类 , @ click这些东西 , 有现代化的编辑器 , 批量替换成className , onClick不是很简单的事情吗?
打字稿 , 棉绒支持这点更是致命 , Typescript已成为我们前端开发的必需品 。 前就能发现大量错误 。
而Vue的模板不支持typescript(官方还在增强) , 在模板上支持要很多“ hack”操作 , 原始框架更为复杂 。 Vue.extend对象中编写代码很难有比较好的ts , 从而更好的支持Typescript , 我们以前都是使用Vue的类写法(参考上文) 。 前端配合后台放置接口 , 而很多未提前检查出的错误都出现在模板代码中 。
可测试性 , 重构Vue需要新建一个.vue文件
{{hello}}React操作都在jsx环境下执行 , 放的位置随意 , 写法比模板更容易测试 , 继承:
function Test(props: { hello: string }) {console.log(props);return {props.hello}}Vue与React测试成本的差异明显 。 React手起刀落 , 一个函数就搞定了 , 要测试什么内容清晰可见 。 类型 , 属性修正就行了 , 编辑器自动化 。
复杂状态 , 动作管理总体状态管理方案选型是很重要的 , 毕竟95%以上的API对接代码都在这里 , 这部分代码占位代码很大一部分 , 可以互换 , 替代 , 测试成为选择的关键 。
Vue推荐的方案只有将转换的Vuex(Redux迁移到Vue等不算内部)React周边方案有Redux , Mobx等 。 这些库不会与React有太强的替换(可以独立存在) 。 两个框架的状态管理思想差不多 , 都是单向数据流 , 单例模式(Vuex&Redux) 。
威克斯
吊带公主裙|为什么我们放弃了Vue?Vue和React深度比较Vuex的源码不多 , 可以看这里 。 可以看到代码中有很多和Vue强绑定的东东 , 脱离了Vue , 这东西就没法用了 。 你可能会说我就用Vue , 什么React不去用不就完了?考虑以下场景:

  • 项目经理要把Vue的代码迁移支持小程序 , 突然!有的框架不支持Vuex , 脑袋嗡嗡嗡叫
  • 项目经理说要设配APP端 , 突然!一堆臭虫!脑袋嗡嗡叫
  • 项目经理脑抽 , 要把React项目迁移到Vue , 突然!redux!用的还是saga!脑袋嗡嗡叫
  • 状态管理出现静态问题!要写一堆烂码去解决 。 新人看了脑袋嗡嗡叫
这部分的代码比Vuex源码都多?这些问题都是状态管理库和框架强绑定导致的 , 框架上的问题也会影响到周边库 。
if (version >= 2) {Vue.mixin({ beforeCreate: vuexInit })} else {// override init and inject vuex init procedure// for 1.x backwards compatibility.const _init = Vue.prototype._initVue.prototype._init = function (options = {}) {options.init = options.init? [vuexInit].concat(options.init): vuexInit_init.call(this, options)}}可以看到 , Vue核心升级 , 这些伴随的库也得升级 , 测试 。 在非浏览器环境下运行时 , 由于Vue(或类Vue框架)的初始化等机制需要体积 , 会导致相关库 , 如Vuex不可用 , 多了一个代码分支 , 相关代码无法替换 , 测试 , 重构负担重 。


推荐阅读