框架概述
虽然我不是以Vue入门MVVM的,Angular和React的经验让我初次接触Vue的时候有很多不屑。这种情绪很不好,尤其是在我更换title之后,站在产品的角度看问题,Vue是非常非常伟大的。
Unix设计哲学之一便是,数据结构往往比算法重要得多,不论你多么精妙的算法,多么精妙的实现,一旦出发点是错误的,数据结构有问题,往往就会一错再错。
这时候再来看Vue,就会发现它的设计是多么的精妙。
笔者先来细数一下Vue在应用上的优点,相信会引起大家的共鸣:
相较于Angular的zone和Rxjs,Vue的抽象程度和灵活性确实低了非常多,但是从另外一个角度上说 ,Vue更加简洁明了,聪明人都知道代码简洁易懂意味着什么。
Vue没有采用Typescript,不过也是因此代码效率大大提高,对V8类型足够了解的程序员能够更有效率地进行工作。并且由于是Js,依赖注入只需要使用闭包,而不需要像Angular那样实现依赖声明和依赖查找。
足够简单,意味着在有限的生命尺度类一个正常人可以很清晰地了解框架的全部内容(有些夸张了),视图层在应用中起的作用十分有限,没有必要加重它的地位,这不是产业发展的主流(精力应该放在集群计算和人工智能上)。这方面Angular是极其不好的反面教材,增大api面积和抽象程度的确能增加“前端”程序员的能力,但是抱歉,技术都是为商业服务的。
超大型项目适配上Vue确实是短板,但是想象一下,如果你不是银行,国有大型企业,你的业务需要超大型应用来解决,是不是你产品设计有问题?即便设计没有问题,类似Angular,Ember等框架也只会把你变成一颗螺丝钉。Vue这一点就很好,扪心自问一下,市场上99.9999%的应用都是小型应用。
Vue大部分代码是由一个人完成的,这就保证了其代码核心的稳定性,不会出现与设计初衷相违背的破坏性升级。Angular这里就做得非常不好,聪明人宁可与一位天才合作,也绝不与一群天才合作,没有闲工夫等你们推诿扯皮。
若是真正功能密集的产品,你会发现采用静态页面,摒弃状态管理是最好的方式。这时候,Vue足够小的优势就体现出来了,还能代替jQuery做增强交互。
当然,事务不可能只有优点没有缺点,Vue最大的缺点就是很容易出现舒适区,作为一个前端开发者,你可以不用Typescript,可以不用Rx,但是你不能连类型和响应式的概念都没有。Vue只是一个生产工具,并不是核心竞争力,停留在Vue的舒适区危害是非常大的。
尤其是接下来笔者要讨论的主题,只有Vue的编程经验,只是一个框架使用者的话是非常难以理解的。
框架关键功能点
模板渲染
提供了大部分模板引擎都有的功能,实际上就是把后端模板功能在前端用JS重新实现了一遍,这也是mvvm的精髓,将cv在前端实现为vm。
不过Vue专门针对VM提供响应式API,默认data中的变量对V提供get代理,对M提供set代理。
自定义响应式的话通过computed对M提供监听,通过watch对V提供监听。
简单明了,很容易理解其实现。
组件化
没有React那种model系统,至于Angular那种对于小型应用来说过度设计的服务Model,更不会被Vue采纳。
没有过多概念,组件就是组件。
生命周期
因为没有Angular zone那样的完全事件代理,所以完全的响应式生命周期是不可能的。不过大多数应用场景下,即便是用Angular,还是会手动设置onPush。简单即使最好的,何况真需要的话事件监听器更加实用。(zone非常天才,但是大多数应用都是给凡人用的)
混入
混入就是组合(动态语言),实际上go语言是没有继承的,组合更加高效,采用了最新的编程理念。
指令
指令就是V层代理,虽然整个VM都是V的代理,但是指令更多地是动态添加指示,热插拔地进行V的操作,更加灵活。
这是一个来之ng的功能点,被Vue采用。
插件
全局自定义,实际上就是依赖注入。
状态管理
凡是单页面应用都是需要管理状态的,不要拿Redux刚发布的那时候说事,大学的数据库课程都教过你事务的特性,每一个阶段都必须有单独的状态。
静态页面每一次操作都会重新获取,不存在状态管理的过程,但是SPA就必须管理状态。
Vue采用Vuex进行状态管理,较为合适,但是Angular在状态管理上更胜一筹,有条件的可以尝试BehaviorSubject,别人连响应式都顺手做了。
服务端渲染
都用了SPA还服务端渲染的都是脱了裤子放屁。
这个功能非常鸡肋。
vue-loader
单文件组件在进行小组件编写的时候非常实用,还是建议能将测试文件也写进去,稳得一皮。