技术选型 - 前端部分
MVVM: Avalon vs Vue.js
MVVM:相比JQuery可以大幅减轻前端开发人员的思维分裂,可以分别专注布局和业务逻辑,而且复杂界面的实现确实比JQuery的实现简单易读. 整体学习成本也较低,只需要半天左右就能上手实操.只是需要注意开发思路与JQuery较大,思维方式转变才是学习关键.
Avalon之前一直在项目中实际用,包含了v1.4, v1.5, v1.6, v2.x各个版本,学习和使用过程中一直都是各种惊喜和折磨交织着.
- UI部分,开源貌似只有一个可用的UI库Oni UI, 这个UI库组件确实比较齐全,但是默认样式实在太丑,对于我们这种没有美工的小团队来说就是一悲剧,所以最终放弃了,使用metronic和 adminLte+freemarker自己封装业务组件,结果因为团队开发人员的素质参差不齐,导致各种各样的组件出现,各种难以维护,费时费力.
- 代码风格较为灵活,怎么写都可以,而且可以随意增加model字段,所以导致面条式的代码出现,组件复用和重构难度增大,而且可读性较差;v2.x虽然也开始支持组件,但是版本差异太大,从v1.6迁移成本太高,而且各种诡异bug.
- 开源社区较为"冷淡". Avalon虽然是去哪网主推,一直也在频繁更新,而且也有各种社区网站和论坛. 但是总感觉是一个人在开发,更新发布相对较为随意,版本间兼容性也较差.而且现在的社区都是些新手在问一些基本问题,很难见到高手写的blog文章或者开源项目.
Vue.js是最近才开始使用,之前都是听各种演讲时听到,而且时常在微博刷屏中被提及,感觉作者是学营销出生,确实比较懂得营销自己,一直也没重视.这次是实在被Avalon2折磨的够呛,想换个组件库时看到awesome-vue中的UI组件库部分,彻底被吸引了,决定在新项目中尝试使用,结果近距离接触后才发现不是简单的Avalon like的MVVM框架,而是一个有着新思想新想法,并不断进步的集合,最最重要的就是整个生态非常健全,配套的工具也很多,社区非常活跃,大量相关的开源项目可以借鉴学习.
组件化: React vs Angular vs Vue.js vs Avalon vs 后端freemarker组件
组件化的重要性就不再重复说明了,这个对于企业级应用真的很重要! 我们在组件化的道路上也尝试了很多方案:
- React: facebook出品,质量有保障,社区也相当活跃,而且React Native也是期望着能一统web和app开发,但是学习成本实在太高,只有资深前端程序员才能掌握,虽然整体设计非常优秀,但是本土程序员水平就摆在那里,再NB的东西也要有人会用才好.
- Angular: Google出品,整体设计及社区支持都是没有问题的,还支持了个人比较看好的Typescript,所以还是比较看好的,但她的语法实在是有点怪,各种不适应,再加上版本更新太过频繁,担心后期跟进成本太高. 学习Dart时留下的阴影还没消散,总是担心哪天就被cancel了.
- Avalon: v2开始支持组件,实现的也比较全面, 但是感觉还是不是那么成熟, 相关例子太少, 社区支持也少,而且支持的实现方式太多,感觉有点混乱. 项目从v1.6迁移到v2时也遇到各种诡异的bug,试了好几个版本,坑太多实在是无心继续尝试. 最主要的原因还是支持方式太多,代码怎么写都好, 如果团队内部没有严格统一规范,那么很容易写出各种各样风格的代码,这对于低素质小团队来说就是噩梦.
- Vue.js: 第三方开源组件库实在是太多了,而且都很快更新到vue2了,社区相当给力.一开始使用的muse-ui组件,后来发现这个库的bug太多,就切换到element,结果只花了半天不到时间,全程bug很少.同时,vue.js把很多常用的细节设计得非常规范,大家都按照规范编写出来的代码很容易阅读和重构.
- 后端Freemarker组件编写: 这是之前项目一直使用的方式,也比较直观易懂,但是就是太依赖公用库开发人员的素质,只有资深的程序员才能编写重用程度较高的组件,初级程序员编写的就是各种噩梦. 而且自己封装UI组件实在是非常原始的工作,需要团队花大量时间打磨细节.在目前这种飞速变化的时代实在是件低效率,低成本的事情.
前端工程化
Grunt: 目前因为性能问题已经被社区嫌弃- Gulp: 非常好的设计思想和性能表现, 社区非常活跃,相关的插件最丰富. 可以非常方便地完成一些简单的代码转化,并且与webpack集成良好.
- Npm script: 过于底层,开发工作量较大, 目前只作为脚本程序统一入口
- Webpack: 模块化所有静态资源(js, ts, css, less, vue)加载,并集成本地开发服务器,自动编译代码并刷新浏览器
Bower: 暂时没有发现亮点功能,暂不使用.
ES2015 vs TypeScript
ES4: 恶心的语法+各种变态"仿真"实现+各种诡异Bug=程序猿的噩梦- ES2015: 增加了各种语法糖,代码好看太多,而且还有babel转化器实现,可以安心使用ES2015甚至是ES2016了,兼容各种浏览器和IDE
TypeScript: 静态类型+支持混合js编写(DefinitelyTyped)+大量语法糖+活跃的社区支持+VS code IDE支持. 确实很不错, 但是还有待观察和试验;
IDE支持
Github Atom: 非常不错的IDE,但是感觉实在是有点混乱,任何小功能都需要找插件完成,再加上国内蛋疼的访问速度- VS Code: 微软的底蕴确实不错,设计优秀,更新频繁,并且整合了很多ts相关的功能,灰常好用,社区支持也比较给力,Atom的插件差不多都有VS code版本的.
- IntelliJ: 灰常给力的java IDE,更新速度和社区支持也是杠杠的. 就是太重量级了,启动慢,编译慢(Gradle的问题). 所以一般只是在开发后端时使用. 前端nodejs和web相关部分有待尝试.
Eclipse: Eclipse这几年开始各种"不务正业"的折腾,以前很多好用的功能变得难用,再加上糟糕的插件更新方式.
桌面端组件库
- Element:饿了吗团队出品的桌面端组件库. 组件库丰富,比较简单易用,只是部分组件不好用,e.g. Layout
Muse-UI: 基于Vue2和Material Desigin的UI组件库,非常漂亮,优秀的动画效果.但是bug太多,还不成熟.期待新版本.
移动端组件库
其他
awesome-vue #component-collections
框架/类库选择 - 后端部分
Spring-MVC
- Java事实上的MVC标准, struts2各种安全问题,更新乏力
- 主流技术, 学习成本低
- 大部分Java现有系统使用Spring MVC开发,方便旧系统迁移
Spring-boot
- 通用型微服务应用,Spring全家桶中的一员,社区技术支持有保障
- 发布部署简化,不用重新造轮子
- 自动化配置,减少配置
Spring-cloud
- Spring全家桶中的一员,社区技术支持有保障
- 发布早, 产品非常成熟
- Netflix开源的组件通用性和实用性,适合各种运维场景部署
- 配置简单, 耦合度低, 可伸缩配置