阿里妹导读:前端应用愈来愈复杂,技术框架不断变化,如何成为一位优秀的前端工程师,应对更大的挑战?今天,阿里前端技术专家会影结合实际工做经验,沉淀了五项重要方法,但愿能对你的职业发展、团队协做有所启发。css
过去一年,阿里巴巴新零售事业群支撑的数据相关业务日新月异,其中两个核心平台级产品代码量急速增加,协同开发人员增长到数十人。前端
因为历史缘由,开发框架同时基于 React 和 Angular,考虑到产品的复杂性、人员的短缺和技术背景各异,咱们尝试了各类方法打磨工具体系来提高开发效率,如下分享五点。webpack
从2013年React发布至今已近6个年头,前端框架逐渐造成 React/Vue/Angular 三足鼎立之势。几年前还在争论单向绑定和双向绑定孰优孰劣,如今三大框架已经不约而同选择单向绑定,双向绑定沦为单纯的语法糖。框架间的差别愈来愈小,加上 Ant-Design/Fusion-Design/NG-ZORRO/ElementUI 组件库的成熟,选择任一你熟悉的框架都能高效完成业务。git
那接下来核心问题是什么?咱们认为是状态管理。简单应用使用组件内 State 方便快捷,但随着应用复杂度上升,会发现数据散落在不一样的组件,组件通讯会变得异常复杂。咱们前后尝试过原生 Redux、分形 Fractal 的思路、自研类 Mobx 框架、Angular Service,最终认为 Redux 依旧是复杂应用数据流处理最佳选项之一。web
庆幸的是除了 React 社区,Vue 社区有相似的 Vuex,Angular 社区有 NgRx 也提供了几乎一样的能力,甚至 NgRx 还能够无缝使用 redux-devtools 来调试状态变化。redux
不管如何优化,始终要遵循 Redux 三原则:后端
这三个问题咱们是经过自研 iron-redux 库【1】来解决,如下是背后的思考:浏览器
如何组织 Action?性能优化
如何组织 Store/Reducer?前端框架
最终咱们获得以下扁平的状态树。虽庞大但有序,你能够快速而明确的访问任何数据。
如何减小样板代码?
使用原生 Redux,一个常见的请求处理以下。很是冗余,这是 Redux 被不少人诟病的缘由:
使用 iron-redux 后:
代码量减小三分之二!!
主要作了这2点:
曾经 React 和 Angular 是两个很难调和的框架,开发中浪费了咱们大量的人力。经过使用轻量级的 iron-redux,彻底遵循 Redux 核心原则下,咱们内部实现了除组件层之外几乎全部代码的复用。开发规范、工具库达成一致,开发人员可以无缝切换,框架差别带来的额外成本降到很低。
TypeScript 目前可谓大红大紫,根据 2018 stateofjs【3】,超过 50% 的使用率以及 90% 的满意度,甚至连 Jest 也正在从 Flow 切换到 TS【4】。若是你尚未
使用,能够考虑切换,绝对能给项目带来很大提高。过去一年,咱们从部分使用 TS 变为全面切换到 TS,包括咱们本身开发的工具库等。
TS 最大的优点是它提供了强大的静态分析能力,结合 TSLint 能对代码作到更加严格的检查约束。传统的 EcmaScript 因为没有静态类型,即便有了 ESLint 也只能作到很基本的检查,一些 typo 问题可能线上出了 Bug 后才被发现。
下图是一个前端应用常见的4层架构。 代码和工具全面拥抱 TS 后,实现了从后端 API 接口到 View 组件的全链路静态分析,具备了完善的代码提示和校验能力。
除了上面讲的 iron-redux,咱们还引入 Pont 【5】实现前端取数,它能够自动把后端 API 映射到前端可调用的请求方法。
Pont 实现原理:(法语:桥) 是咱们研发的前端取数层框架。对接的后端 API 使用 Java Swagger,Swagger 能提供全部 API 的元信息,包括请求和响应的类型格式。Pont 解析 API 元信息生成 TS 的取数函数,这些取数函数类型完美,并挂载到 API 模块下。最终代码中取数效果是这样的:
Pont 实现的效果有:
另外 iron-redux 能接收到 Pont 接口响应数据格式,并推导出整个 Redux 状态树的静态类型定义,Store 中的数据完美的类型提示。效果以下:
最终 TS 让代码更加健壮,尤为是对于大型项目,编译经过几乎就表明运行正常,也给重构增长了不少信心。
2015 年咱们就开始实践 CSS Modules,包括后来的 styled-components 等,到 2019 年 css-in-js 方案依旧争论不休,虽然它确实解决了一些 CSS 语言天生的问题,但同时增长了很多成本,新手不够友好、全局样式覆盖成本高涨、伪类处理复杂、与AntD等组件库结合有坑。与此同时 Sass/Less 社区也在飞速发展,尤为是 Stylelint 【6】的成熟,能够经过技术约束的手段来避免 CSS 的 Bad Parts。
在 scss 文件中,能够直接引用变量:
2019 年,你几乎不可能再开发出 React/Angular/Vue 级别的框架,也不必再造 Ant-Design/Fusion-Design/Ng-Zorro 这样的轮子。难道就没有机会了吗?
固然有,结合你自身的产品开发流程,依旧有不少机会。下面是常规项目的开发流程图,任何一个环节只要深挖,都有提高空间。若是你能经过工具减小一个或多个环节,带来的价值更大。
单拿其中的【开发】环节展开,就有不少可扩展的场景:
一个有表明性的例子是,咱们开发了国际化工具 kiwi【7】。它一样具备 TS 的类型完美,很是强大的文案提示,另外还有:
除了以上三点,将来还计划开发浏览器插件来检查漏翻文案,利用 Husky 在 git 提交前对漏翻文案自动作机器翻译等等。
将来若是你只提供一个代码库,那它的价值会很是局限。你能够参照上面的图表,开发相应的扩展来丰富生态。若是你是新手,推荐学习下编译原理和对应的扩展开发规范。
过去的一年,咱们一共进行了 1200+ 屡次 Code Review(CR),不少同事从刚开始很差意思提 MR(GitLab Merge Request,Code Review 的一种方式) 到后来追着别人 Review,CR 成为每一个人的习惯。经过 CR 让项目中任何一行代码都至少被两人触达过,减小了绝大多数的低级错误,提高了代码质量,这也是帮助新人成长最快的方式之一。
![[其中一个项目MR截图]](https://upload-images.jianshu...
Code Review 的几个技巧:
以上5点固然不是咱们技术的所有。除此以外咱们还实践了移动端开发、可视化图表/WebGL、Web Worker、GraphQL、性能优化等等,但这些还停留在术的层面,将来到必定程度会拿出来分享。
若是你也准备或正在开发复杂的前端应用,同时团队人员多样技术背景各异,能够参考以上5点,使用 Redux 实现规范清晰可预测的状态管理,深耕 TypeScript 来提高代码健壮性和可维护性,借助各类 Lint 工具回归简单方便的 CSS,不断打磨本身的开发工具来保证开发规范高效,并严格完全实行 Code Review 促进人的交流和提高。
本文来自云栖社区合做伙伴“阿里技术”,如需转载请联系原做者。