同样做前端,为何差距越来越大?

阿里妹导读:前端应用越来越复杂,技术框架不断变化,如何成为一位优秀的前端工程师,应对更大的挑战?今天,阿里前端技术专家会影结合实际工作经验,沉淀了五项重要方法,希望能对你的职业发展、团队协作有所启发。

过去一年,阿里巴巴新零售事业群支撑的数据相关业务突飞猛进,其中两个核心平台级产品代码量急速增长,协同开发人员增加到数十人。

由于历史原因,开发框架同时基于 React 和 Angular,考虑到产品的复杂性、人员的短缺和技术背景各异,我们尝试了各种方法打磨工具体系来提升开发效率,以下分享五点。

一、基于 Redux 的状态管理

从2013年React发布至今已近6个年头,前端框架逐渐形成 React/Vue/Angular 三足鼎立之势。几年前还在争论单向绑定和双向绑定孰优孰劣,现在三大框架已经不约而同选择单向绑定,双向绑定沦为单纯的语法糖。框架间的差异越来越小,加上 Ant-Design/Fusion-Design/NG-ZORRO/ElementUI 组件库的成熟,选择任一你熟悉的框架都能高效完成业务。

那接下来核心问题是什么?我们认为是状态管理。简单应用使用组件内 State 方便快捷,但随着应用复杂度上升,会发现数据散落在不同的组件,组件通信会变得异常复杂。我们先后尝试过原生 Redux、分形 Fractal 的思路、自研类 Mobx 框架、Angular Service,最终认为 Redux 依旧是复杂应用数据流处理最佳选项之一。

庆幸的是除了 React 社区,Vue 社区有类似的 Vuex,Angular 社区有 NgRx 也提供了几乎同样的能力,甚至 NgRx 还可以无缝使用 redux-devtools 来调试状态变化。

无论如何优化,始终要遵循 Redux 三原则:

这三个问题我们是通过自研 iron-redux 库【1】来解决,以下是背后的思考:

如何组织 Action?

  1. action type 需要全局惟一,因此我们给 action type 添加了 prefix,其实就是 namespace 的概念;
  2. 为了追求体验,请求(Fetch)场景需要处理 3 种状态,对应 LOADING/SUCCESS/ERROR 这 3 个action,我们通过 FetchTypes 类型来自动生成对应到 3 个 action。

如何组织 Store/Reducer?

  1. reducer 和 view 不必一一对应,应用中同时存在组件树和状态树,按照各自需要去组织,通过 connect 来绑定状态树的一个或多个分支到组件树;
  2. 通过构造一些预设数据类型来减少样板代码。对于 Fetch 返回的数据我们定义了 AsyncTuple 这种类型,减少了样板代码;
  3. 明确的组织结构,第1层是 ROOT,第2层是各个页面,第3层是页面内的卡片,第4层是卡片的数据,这样划分最深处基本不会超过5层。

最终我们得到如下扁平的状态树。虽庞大但有序,你可以快速而明确的访问任何数据。

Redux 状态树

如何减少样板代码?

使用原生 Redux,一个常见的请求处理如下。非常冗余,这是 Redux 被很多人诟病的原因:

使用 iron-redux 后:

代码量减少三分之二!!

主要做了这2点:

  1. 引入了预设的 AsyncTuple 类型,就是 {data: [], loading: boolean, error: boolean} 这样的数据结构;
  2. 使用 AsyncTuple.handleAll 处理 LOADING/SUCCESS/ERROR 这 3 种 action,handleAll 的代码很简单,使用 if 判断 action.type 的后缀即可,源码【2】。

曾经 React 和 Angular 是两个很难调和的框架,开发中浪费了我们大量的人力。通过使用轻量级的 iron-redux,完全遵循 Redux 核心原则下,我们内部实现了除组件层以外几乎所有代码的复用。开发规范、工具库达成一致,开发人员能够无缝切换,框架差异带来的额外成本降到很低。

二、全面拥抱 TypeScript

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 实现的效果有:

  1. 根据方法名自动匹配 url、method,并且对应到 prams、response 类型完美,并能自动提示;
  2. 后端 API 接口变更后,前端相关联的请求会自动报错,再也不担心后端悄悄改接口前端不知晓;
  3. 再也不需要前后端接口约定文档,使用代码保证前端取数和后端接口定义完全一致。

另外 iron-redux 能接收到 Pont 接口响应数据格式,并推导出整个 Redux 状态树的静态类型定义,Store 中的数据完美的类型提示。效果如下:

最终 TS 让代码更加健壮,尤其是对于大型项目,编译通过几乎就代表运行正常,也给重构增加了很多信心。

三、回归 Sass/Less

2015 年我们就开始实践 CSS Modules,包括后来的 styled-components 等,到 2019 年 css-in-js 方案依旧争论不休,虽然它确实解决了一些 CSS 语言天生的问题,但同时增加了不少成本,新手不够友好、全局样式覆盖成本高涨、伪类处理复杂、与AntD等组件库结合有坑。与此同时 Sass/Less 社区也在飞速发展,尤其是 Stylelint 【6】的成熟,可以通过技术约束的手段来避免 CSS 的 Bad Parts。

  1. 全局污染:约定每个样式文件只能有一个顶级类,如 .home-page{ .top-nav {//}, .main-content{ // } }。如果有多个顶级类,可以使用 Stylelint rule 检测并给出警告。
  2. 依赖管理不彻底。借助 webpack 的 css-loader,已够用。
  3. JS 和 CSS 变量共享。关于 JS 和 Sass/Less 变量共享,我们摸索出了自己的解法:

在 scss 文件中,可以直接引用变量:

四、开发工具覆盖全链路

2019 年,你几乎不可能再开发出 React/Angular/Vue 级别的框架,也没必要再造 Ant-Design/Fusion-Design/Ng-Zorro 这样的轮子。难道就没有机会了吗?

当然有,结合你自身的产品开发流程,依旧有很多机会。下面是常规项目的开发流程图,任何一个环节只要深挖,都有提升空间。如果你能通过工具减少一个或多个环节,带来的价值更大。

单拿其中的【开发】环节展开,就有很多可扩展的场景:

一个有代表性的例子是,我们开发了国际化工具 kiwi【7】。它同样具有 TS 的类型完美,非常强大的文案提示,另外还有:

  1. VS Code 插件 kiwi linter【8】,自动对中文文案标红,如果已有翻译文案能自动完成替换;
  2. Shell 命令全量检查出没有翻译的文案,批量提交给翻译人员;
  3. Codemod 脚本自动实现旧的国际化方案向 Kiwi 迁移,成本极低。

除了以上三点,未来还计划开发浏览器插件来检查漏翻文案,利用 Husky 在 git 提交前对漏翻文案自动做机器翻译等等。

未来如果你只提供一个代码库,那它的价值会非常局限。你可以参照上面的图表,开发相应的扩展来丰富生态。如果你是新手,推荐学习下编译原理和对应的扩展开发规范。

五、严格彻底的 Code Review

过去的一年,我们一共进行了 1200+ 多次 Code Review(CR),很多同事从刚开始不好意思提 MR(GitLab Merge Request,Code Review 的一种方式) 到后来追着别人 Review,CR 成为每个人的习惯。通过 CR 让项目中任何一行代码都至少被两人触达过,减少了绝大多数的低级错误,提升了代码质量,这也是帮助新人成长最快的方式之一。

[其中一个项目MR截图]

Code Review 的几个技巧:

  • No magic;
  • Explicit not implicit;
  • 覆盖度比深度重要,覆盖度追求100%;
  • 频率比仪式感重要,坐公交蹲厕所打开手机都可以 Review 别人代码,不需要专门组织会议;
  • 粒度要尽可能小,一个组件一个方法均可,可以结合 Git Flow;
  • 24h 小时内处理,无问题直接 merge,有问题一定要留 comment,并且提供 action;
  • 对于亟待上线来不及 Review 的代码,可以先合并上线,上线后再补充 Review;
  • 需要自上而下的推动,具有完善的规范,同时定期总结 Review 经验来丰富开发规范;
  • CR 并不只是为了找错,看到好的代码,不要吝啬你的赞美;
  • 本质是鼓励开发者间更多的沟通,互相学习,营造技术文化氛围。

总结

以上5点当然不是我们技术的全部。除此之外我们还实践了移动端开发、可视化图表/WebGL、Web Worker、GraphQL、性能优化等等,但这些还停留在术的层面,未来到一定程度会拿出来分享。

如果你也准备或正在开发复杂的前端应用,同时团队人员多样技术背景各异,可以参考以上5点,使用 Redux 实现规范清晰可预测的状态管理,深耕 TypeScript 来提升代码健壮性和可维护性,借助各种 Lint 工具回归简单方便的 CSS,不断打磨自己的开发工具来保证开发规范高效,并严格彻底实行 Code Review 促进人的交流和提升。

作者:会影
原文链接

本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云+X案例展 | 民生类:必创科技助力打造智慧城市

本案例由必创科技投递并参与评选,CSDN云计算独家全网首发;更多关于【云X 案例征集】的相关信息,点击了解详情丨挖掘展现更多优秀案例,为不同行业领域带来启迪,进而推动整个“云行业”的健康发展。每当夜幕降临&#xf…

刚刚,阿里宣布开源Flutter应用框架Fish Redux!

3月5日,闲鱼宣布在GitHub上开源Fish Redux,Fish Redux是一个基于 Redux 数据管理的组装式 flutter 应用框架, 特别适用于构建中大型的复杂应用,它最显著的特征是 函数式的编程模型、可预测的状态管理、可插拔的组件体系、最佳的性…

谈谈结构体部分成员排序(重载的利用/sort)

涉及知识点: 1.重载运算符的知识 2.sort函数的使用 3.高精度排序 sort函数的用法? 通过面向百度GOOGLE编程的我,得知,sort的用法 sort函数详解(史上最完整QAQ) - AlvinZH - 博客园 对于数组而言&…

qt最大化和还原实现_研究进展 | 水生所关于细菌异化型硝酸盐还原成铵与反硝化脱氮两种途径抉择的分子调控机制研究取得进展...

在无氧和缺氧条件下,许多细菌可利用硝酸根和亚硝酸根作为电子受体进行无氧呼吸,包括异化型硝酸盐还原成铵(dissimilatory nitrate reduction (DNR) to ammonia,DNRA)和反硝化脱氮(denitrification)两种相互竞争的DNR途径,在氮元素…

中国科学院院士徐宗本:人工智能的基石是数学

来源:科学网 “人工智能的基石是数学,没有数学基础科学的支持,人工智能很难行稳致远。” 近日,由联合国教科文组织和中国工程院联合主办的联合国教科文组织国际工程科技知识中心2019国际高端研讨会上,中国科学院院士、…

MySQL运维实战 之 PHP访问MySQL你使用对了吗

大家都知道,slow query系统做的好不好,直接决定了解决slow query的效率问题 一个数据库管理平台,拥有一个好的slow query系统,基本上就拥有了解锁性能问题的钥匙 但是今天主要分享的并不是平台,而是在平台中看到的奇…

通过阿里云K8S Ingress Controller实现路由配置的动态更新

简介 在Kubernetes集群中,Ingress作为集群内服务对外暴露的访问接入点,其几乎承载着集群内服务访问的所有流量。我们知道,Nginx Ingress Controller是Kubernetes社区很重要的一个子项目,其内部主要依托于高性能的负载均衡软件Ngi…

工作流实战_14_flowable_已办任务列表查询

项目地址:https://gitee.com/lwj/flowable.git 分支flowable-base 视频讲解地址 https://space.bilibili.com/485524575/channel/detail?cid94579 1、演示 2、代码 这里也是通过sql来查询的 SELECT DISTINCTt1.ID_ AS taskId,t1.NAME_ AS taskName,t2.FIRST_ AS…

SpringBoot使用prometheus监控

本文介绍SpringBoot如何使用Prometheus配合Grafana监控。 1.关于Prometheus Prometheus是一个根据应用的metrics来进行监控的开源工具。相信很多工程都在使用它来进行监控,有关详细介绍可以查看官网:https://prometheus.io/docs/introduction/overview/…

详解异构计算FPGA基础知识

戳蓝字“CSDN云计算”关注我们哦!作者 | 浩仔责编 | 阿秃随着云计算,大数据和人工智能技术应用,单靠CPU已经无法满足各行各业的算力需求。海量数据分析、机器学习和边缘计算等场景需要计算架构多样化,需要不同的处理器架构和GPU&a…

开发函数计算的正确姿势——使用 brotli 压缩大文件

大文件问题 函数计算对上传的 zip 代码包尺寸限制为 50M。某些场景中代码包中会超过这一限制,比如二进制 serverless-chrome 经过一番裁剪以后 ZIP 压缩包的体积为 43.4M,类似的还有 liboffice ,此外常见的还有机器学习训练的模型文件。 目…

流程变量的分组_01

项目地址:https://gitee.com/lwj/flowable.git 分支flowable-base 视频地址:https://www.bilibili.com/video/av79774697/ 业务场景: 实际场景中,有可能我们的流程变量会比较多,如果一个变量就作为一条记录存储的话&a…

amd显卡风扇调节_中端游戏显卡新晋黑马,华硕ROG STRIX RX5600XT O6G GAMING拆解评测...

在年初的CES2020上,AMD发布了面向中端市场的Radeon RX 5500 XT,进一步完善了自己的游戏显卡产品线。在本月21日,RX 5600 XT正式解禁发布。各大AIB厂商也在第一时间推出了自己的相关产品。我们也在第一时间收到了来自华硕的ROG STRIX RX5600XT…

集成源码深度剖析:Fescar x Spring Cloud

Fescar 简介 常见的分布式事务方式有基于 2PC 的 XA (e.g. atomikos),从业务层入手的 TCC( e.g. byteTCC)、事务消息 ( e.g. RocketMQ Half Message) 等等。XA 是需要本地数据库支持的分布式事务的协议,资源锁在数据库层面导致性能较差,而支…

CPU 到底是怎么认识代码的?涨姿势了!

戳蓝字“CSDN云计算”关注我们哦!作者 | brightwang责编 | 阿秃最近读到这样一篇好文章,从底层硬件角度出发剖析了一下CPU对代码的识别和读取,内容非常精彩,读完感觉大学里学到的很多东西瞬间联系起来了,这里分享给大家…

Dubbo Mesh 在闲鱼生产环境中的落地实践

本文作者至简曾在 2018 QCon 上海站以《Service Mesh 的本质、价值和应用探索》为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源、反哺开源”,也讲到了 Service Mesh 在阿里巴巴的发路径将经历以下三大阶段: 撬动做透价…

github private链接访问_将github配置为图床+PicGo配置

将github配置为图床PicGo配置快乐的红领巾:​zhuanlan.zhihu.com1、建一个git仓库 2、获取授权token 3、配置PicGo 4、picgo快捷键1、建一个git仓库用于存需要上传的图片。这个仓库最好是public的,因为private的仓库,图片链接会带token&#…

RocketMQ 在平安银行的实践和应用

随着互联网金融业务和相关技术的不断发展,传统金融行业为满足业务快速发展需求,正在积极引入各类开源技术,以快速抢占市场。那么,以金融和科技作为双驱动的平安银行在开源技术的引入方面是如何评估,运用到哪些业务场景…

flowable节点的自定义属性扩展_03

文章目录新增一个节点属性新增一个package;把我们新增的这个package添加节点属性中编写angularJS脚本在properties.js 配置模板;编写js控制器配置引用后台配置解析我们的节点属性编写一个自定义的解析器bean的初始化spring定义bean项目地址:h…

终于有人把超融合和边缘计算说清楚了

戳蓝字“CSDN云计算”关注我们哦!作者 | 采葑责编 | 阿秃近年来超融合在国内迎来快速增长,根据IDC最新发布的报告,2019上半年中国超融合市场增长率达56.7%,大幅超越去年同期。Gartner发布的最新报告,到2023年我国超融合…