不知怎么,突然失眠了,脑子想法天马行空的,那就来总结一下复盘一下这段时间的前端改版。
为什么
反省:这其实是篇很久之前就该完成的文章,但是由于自己拖延症严重,就一直搁置了,这真的很不好。
被很多人问到,有做技术的,也有非技术的,你们改版的目的是什么?你们在做什么,好像并没有什么新功能啊?改版真的是件费力不讨好的事情哇
这就先从技术角度回答一下,为什么我们会从 Angular 转 React 呢?
- Angular 垃圾(哈哈,偏激了)
- React 的国内生态大大优于 Angular
- 原有项目维护不动了
那原有项目项目维护不动了?是 Angular 的锅吗?当然不是,我特别喜欢 LOL 里面的一句话,看完这句话,你也就明白我的意思了
没有垃圾的英雄,只有垃圾的召唤师
应用在这里是同样的道理,原有项目为什么会维护不动呢,我想主要有如下原因
- 非技术层面:UI 设计无法满足更长远的发展
- 技术层面:代码确实写的够烂
非技术层面的问题,就交给专业的产品和设计团队了。技术层面的话,就算我们转 React,还是大概率走回老路上,所以我们要怎么做呢?这是一个值得思考的问题。
对了再次提一下为什么我会说 Angular 垃圾,除了国内生态的话,我觉得还有个主要原因:它太强了
- 强大的脏检测的模板更新机制,你可以随意定义变量,随意更改,模板就会自动更新,导致代码过于灵活以及难以理解的更新机制
- 强大的 Service 机制,数据传递与更改太灵活,这会导致程序员在维护数据的一致性、查找数据更新原因等情况下苦苦挣扎
- 当然了,归根结底还是召唤师垃圾
怎么做
上面说到代码确实写的够烂的问题,那么要如何才能避免走老路呢。这其实是一个很难的问题,是一个需要持续探索的问题。
使用设计原则和设计规范来改善代码,非常依赖个人经验,用不好会适得其反。而编码规范正好相反,大部分都简单明了,在代码细节方面,能立竿见影的改善质量
因此首先从编码规范入手
- 命名风格
- 类型定义
- 尝试引入 DO/BO/VO
- OOP 规约
- 注释规约
同时有效利用工具配合 pre-commit 强制统一代码风格
- prettier 统一代码风格
- eslint、stylelint 保证代码质量
当然,其实这还远远不够,保证代码质量真的很难(尤其在一个团队里),我们只有尽可能的做的多一点
- 严格 Code Review 机制:自动工具无法解决逻辑问题,代码审核真的是把握代码质量的底线
- 定期的常见错误总结与经验分享,提升团队成员的总体认知(团队认知达成一致真的很重要)
交互
经过团队的努力,大约 9 个月,核心代码基本都完成改版,然后交互却被人吐槽的要死,不是优化交互吗?怎么会越来越难用了呢?(哎,扎心了)
我想这里面不是某一个角色的问题,而是一个整个链路都存在问题,比如
- 决策层
- 产品 + 设计
- 前端工程师
不知道为啥,我想在这里增加一个角色,那就用户,用户也是有责任的,哈哈
谈谈过渡成本:我想这里面一定是存在过渡成本的,用户在一个熟悉 -> 陌生的转变,第一反应是吐槽,满脑子都是你什么要改,干嘛改成这样,这完全是情有可原,但我相信当用户从陌生 -> 熟悉时,真香理论就可以用上了。当然,我们还是需要想办法减少过渡成本的。
可以前端领域就可以很好的进行类比,比如在 15 年之前,市面上都是使用 jQuery 的程序员,觉得很香,当三大框架出来掀翻市场时,也有这种声音,你干嘛要换框架,前期甚至会吐槽,这玩意一点都不好用。时间走到这里,答案也已经很明显了。
虽强行解释,但实际产品设计环节,确实不够严谨
代码组织
之前的项目中,主要是面向过程的代码风格,加上 Angular 本身就有分层的思想,Service + Component + View,就是典型的 MVC 分层,应对简单的项目是完全没有问题的。但如果项目复杂的话,这显得有点不够了。
于是乎,我小心翼翼的引入 OOP 编程思想。旨在分层的基础上,抽象出更多有意义的小类,主要有如下优势
- 减少超大文件的可能性
- 提高复用性
- 提高可测试性
- 提高可维护性
顺带提一下,为什么我们的前端会比较复杂,这里简单提下声明式和指令式
- 在三大框架的强大助力下,DOM 级别的渲染,都是声明式,我们只需要维护数据即可
- 在 Canvas 渲染的背景下,我们不得已写很多的指令式代码,这样复杂度一下就上来了
React 官方定义只是一个视图框架,可以理解成它只解决 View 层的事情。因此首先需要面对问题就是,我们需要分层吗?如果需要的话,需要的是完整的分层思想吗,比如 Service 层需要吗?
在来看看程序员的难题
- 变量如何命名
- 文件如何命名
- 文件放在哪里
这个问题如果放到整个前端领域,相信是没有最优解的,但我相信,放到具体某个团队中,我们需要一个最合适的解。(这里是真的难达成一致哇)