阿里 前端 规范_技术方案多、复用难?且看阿里文娱的前端工程管理实践

近两年,前端复杂度持续攀升,从框架到开发模式都衍生出了无数的技术方案。单点的小规模尝试,导致团队内部技术栈以及实现方案出现分化,间接造成了知识库之间的隔离、项目之间模块复用率下降,人员在不同项目中的学习成本大大增加,技术管理成本被大量转嫁到人员管理上。

例如,同一种平台因为技术方案管控问题,导致执行路径产生偏差,细节复用艰难。

5e3eacb80feeefffb3cf1cf69f426f9e.png

那么,如何实现人与工程的规模化管理,并优雅的驱动项目?本文将详解阿里文娱的实践及思考,尤其是整合各业务方向、技术实现拉齐、能力复用方面。

我们该怎么做?

经过详细的技术及收益评估,我们决定在阿里基础前端工程服务的基础上,搭建文娱自己的前端工程研发系统,用以高效承接及处理在前端工程领域上所遭遇的挑战。

1. 收敛 & 聚焦

大部分问题的诱因是缺乏统一的工具入口,而工具作为工程开发模式的重要指导急需统一的工具开发规范。

在此之上以“收敛 & 聚焦”为目标,我们开启了“终端 + 服务”的执行思路,落地了两个工具:

1) 工具集成工具 Hub Cli:集成其他二次开发工具,提供统一的工具接入接口;

2) 工具服务平台 Hub Service:提供工具依赖的基础服务。

f9a1bcc3dda7a21383dac98391c3d95f.png

2. 强化 & 赋能

通过工具服务平台对一些能力型问题进行针对性增强,如用户身份校验,从而将通用型能力赋能到各业务开发场景。

1) 自动接入云构建

基于 Hub Cli 开发的工具默认支持开启云构建,采用阿里集团云构建方案,进行统一的数据采集。

ccf064fa5c301ef7319dc190cf82cffd.png

2) 用户识别

基于 Hub Cli 开发的工具自带用户识别接口,用以快速识别用户针对性下发配置。

3) 工具灰度控制

传统工具版本控制基于 Npm 管理,无法快速的进行回退或者废弃版本;基于 Hub Cli 开发的工具,则可以通过工具服平台,快速实现对人 / 系统 / 特定环境的快速灰度 (对云构建同样生效)。

4) 日志采集

基于 Hub Cli 开发的工具自动识别工具上报错误信息,帮助工具开发者快速定位工具问题。

81864a9a55a786037561d31995e2af6c.png

为什么不使用集团前端工程工具

我们通过比较后决定下沉集团前端工程工具相关服务能力,以期在文娱层面达到更深的管理能力、灵活的方案定制能力。同时通过入口的收敛,降低各子团队对于集团基础前端工程服务的直接诉求,降低集团基础前端工程服务团队直接对接诸多一线业务团队的压力。

a2ca422004b18dd213fd3f2ee6ae2292.png

1) 大部分工程诉求不再依赖集团基础前端工程服务团队支持,方案制定更加灵活;

2) 对文娱前端工程状态首次有了可观测的可能;

3) 系统化的工具研发方案,大大加强工具能使用的能力,比如用户信息的获取,比如更新控制;

4) 自上而下的流程管控,便于随时增加工程卡口。

工程抽象

为了更好的实现一个工具集成平台,则需要对整个工程流程进行定义与抽象。

1. 工程生命周期

在工具入口层面定义了五个基础的工程生命周期,覆盖整个开发流程,降低工具间的学习成本,解决开发流程的规范问题。

f65f3daba7f6992fd52a02ddf07a8182.png

1) 初始化项目:hub init

2) 将代码部署至日常:hub daily

3) 将代码部署至线上:hub publish

4) 构建项目:hub build

5) 启动开发服务:hub server

6) 启动代码测试:hub test

2. 可编排流程

对于发布流程的抽象,可帮助工具开发者更好的定义工具用户的发布行为,下图展示了对与 Assets 发布流程中的流程定义,实现了对分支的自动维护;工具开发者可自行定义流程从而降低使用者的操作成本。

35c732c18dd7208a1e67fcff79c67910.png

3. 流程钩子

从生产到完成发布,整条流程线上分为三部分,分别提供流程钩子,用于做中间状态的校验。钩子校验采取阻断式。

47f3a3efa9863658c7ac8f97d5f4ad42.png

4. 质量卡口

通过增加生产发布前的强制卡口。

流程管控

1. 工程方案下放

Hub Cli 会在执行命令时启动,启动会经过一轮 Check 流程,包含两部分内容更新:

1) 主程序更新检测

2) 工具更新检测

当发现存在新版本时,会通过 Hub Cli 内置更新模块进行自动更新,确保所有模块的运行版本为最新版本。

更新流程为强制更新,不可手动关闭是出于对工程方案覆盖率的考虑。及时覆盖就意味着版本断层的问题会被削弱,集中更新,集中处理。

2. 自动化发布流程

以改动提交场景为例,传统流程操作下,至少需要三步操作:

$ git add .$ git commit -m '提交信息'$ git push origin daily/0.0.1

步骤越多,出错的可能性越高。我们通过流程编排,将操作完全自动化:

$ hub daily -q

3. Commit 规范化

通过内置的 commit 管理模块,简化的同时取规范化 commit 提交数据,实现开发数据的有效沉淀,培养技术同学的优质编码习惯。

2a16ab18aea7ce920d2305b956e1f407.png

4. 平台联动

基于钩子的多平台联动,通过 hook 设置的方式,实现发布后对其他平台的调用通知。

2e4e71c3ce61867f9cf4229acff2b1c8.png

5. 代码质量检测 &Code Review

使用 Hub 自动接入发布系统的项目将默认开启以下门神检测插件:

  • HTTPS 协议检查
  • 文件元信息检查
  • 内部域名检查
  • 代码注释检查
  • NPM 模块 License 检查

发布的代码需要经过自动校验通过后才可发布至生产环境。除开自动检测外,还可以选择打开 Code Review 流程,只有经过 Code Review 流程后才可进行发布至生产的操作。

be9b467044ef28f054e59a02302f6148.png

特定场景

1. 自动化更新

01cb41c941e2e85b0696c4786d33b8be.png

工具多是全局安装,因为全局环境权限问题,导致全局工具不能自更新,所以目前主流终端方案是只进行版本检查提示更新。

这种方案虽然解决了新版本通知的问题,但是弊端是依旧要人主动更新。

为此我们设计了一套基于全局环境的更新流程。主程序启动过程中会进入一个预先检查环节,预检查过程中会先检测存在的程序副本,若副本存在则启动子进程执行副本,而副本中会先进行自生版本检查,如果存在版本更新则通知主进程进行副本版本更新,当自身版本检查通过后,才会进入程序正式执行阶段。

通过对副本储存目录的控制,绕过了全局的权限校验,实现了任意环境下的自更新操作。

2. 模板引擎

对于模板引擎,我们简化了相关设计,基于 Gitlab 托管,结合 Ejs 模板引擎,实现了一套轻量化的模板引擎系统。

3. 终端用户识别

基于阿里基础前端工程服务的终端授权模式,实现了 hub 的终端用户授权能力,并实现了与阿里基础前端工程服务登录状态的完全拉通。

c25a97e59cf34e8d071b78a89809de86.png

4. 千项(目)千面

通过对项目内配置文件.hubrc 的识别,自动挂载对应的工具;根据工具的不同改变 Hub Cli 的能力。

bb74ea553ed065d3d8e0dd5b3a34dd8a.png

垂线领域沉淀

通过基础工程平台的沉淀赋能特定领域工程方案,加速特定领域研发效率,让工具开发者更专注于工程需求本身以及领域内的工程诉求。

1. 中后台场景

基础平台完善后,中后台技术方案开始聚焦,开始系统化设计 / 解决中后台场景下的提效问题。

  • 物料平台(用于沉淀通用型物料)
  • 中后台研发中心(用于沉淀开发 / 设计规范)
  • API 网关服务(用于前后端解耦,接口快速编排)
  • 应用托管平台(用于联动发布链路自动化部署)
c552cfaaa61a4464f5549a90ac96690e.png

2. 搭建平台场景

文娱活动运营搭建平台的工程诉求基于 Hub 孵化出的工程体系。

  • 物料平台(用于沉淀通用型物料)
  • 依赖分析服务(用于在线搭建动态渲染)
  • 构建服务(用于平台特殊场景部署下的动态构建)
8824e4433029cedd181bfc030753b5eb.png

经验复用

  1. 采集:将在日常开发中产生的错误收集起来,并统一解答归类存档。即可自动归类生成一个错误的知识库。
  2. 消费:在错误发生时即可从错误的知识库中查找出对应结果处理。
ddfbe09bf75dfaf85d3e8837ace77ce6.png

工程数据化 (图形化示例)

通过流程收敛,使得整个团队的工程状态可以被监控,让数据的沉淀产生价值,优化 / 指导工程迭代,让每个技术人的努力可以被量化。

833ff6f54154a8ee2478d8356186840b.png
1596bc69a8c2713f68ccf989c46833d9.png

小结

上面是我们对前端工程如何规模化管理的思考与实践,整体来说就是工程入口的收敛 & 管控,加上领域方案的优胜劣汰,通过领域内经验的横向复用实现整体前端工程能力的提效。

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

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

相关文章

Codeforces 671C Ultimate Weirdness of an Array 线段树 (看题解)

Ultimate Weirdness of an Array 写不出来&#xff0c; 日常好菜啊。。 考虑枚举GCD&#xff0c; 算出一共有多少个对 f(l, r) < GCD&#xff0c; 我们用fuc[ i ] 表示的是在 l i 这个位置开始, 最小的合法的 R&#xff0c; 可以发现这个函数随 i 单调不下降&#xff0c; …

安卓开发环境_我的安卓开发环境

大家好&#xff0c;今天想跟大家分享一下我的安卓开发环境&#xff0c;分别是硬件环境和软件环境。那么在开始之前先交代下我的背景&#xff0c;我从事安卓开发1年8个月&#xff0c;安卓教学9个月&#xff0c;大项目1个&#xff0c;小项目100。先说说硬件环境吧&#xff0c;直接…

构造函数,拷贝构造函数,赋值函数

C中一般创建对象&#xff0c;拷贝或赋值的方式有构造函数&#xff0c;拷贝构造函数&#xff0c;赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数&#xff0c;是当创建一个类的对象时&#xff0c;它被调用来…

性能优化系列

常见性能优化策略的总结&#xff08;转&#xff09; https://www.cnblogs.com/ajianbeyourself/p/6132546.html 网站前端和后台性能优化的34条宝贵经验和方法 https://www.imooc.com/article/41237 一次性能优化实战经历 https://www.cnblogs.com/SameZhao/p/6238997.html …

qotd服务_QOTD:Java线程与Java堆空间

qotd服务以下问题很常见&#xff0c;并且与OutOfMemoryError有关&#xff1a;在JVM线程创建过程和JVM线程容量期间无法创建新的本机线程问题。 这也是我向新技术候选人&#xff08;高级职位&#xff09;提出的典型面试问题。 我建议您在查看答案之前尝试提供自己的答复。 题&a…

ecs服务器数据迁移_某国际物流集团的云迁移解决方案

新钛云服已为您服务905天云计算流行当下&#xff0c;使用新技术较早的互联网企业&#xff0c;已基本实现云计算实施。传统企业也开始接触云计算并进行使用&#xff0c;但由于与互联网轻实体资产的模式不同&#xff0c;其往往面临着业务迁移上云的难题。云迁移过程非常复杂&…

红黑树的红黑标志有什么用

红黑树使用红黑二色进行“着色”&#xff0c;目的是利用颜色值作为二叉树的平衡对称性的检查&#xff0c;只要插入的节点“着色”满足红黑二色的规定&#xff0c;最短路径与最长路径不会相差的太远&#xff0c;红黑树的节点分布就能大体上达至均衡。 演示动画网站&#xff1a;h…

内存泄露与内存溢出

内存泄露是指你的应用使用资源之后没有及时释放&#xff0c;导致应用内存中持有了不需要的资源&#xff0c;这是一种状态描述。 内存溢出是指你的应用的内存已经不能满足正常使用了&#xff0c;堆栈已经达到系统设置的最大值&#xff0c;进而导致崩溃&#xff0c;这事一种结果描…

琥珀项目:较小的,面向生产力的Java语言功能

Brian Goetz最近的消息欢迎来到琥珀&#xff01; 介绍Project Amber &#xff08; OpenJDK的一部分&#xff0c; 最初于1月提出 &#xff09;。 Goetz通过介绍“欢迎使用Amber项目&#xff0c;这是我们面向特定生产力的Java语言JEP的孵化场”的介绍打开了这一消息。 Goetz重申&…

python个人收支管理系统相关题目_练手题:计算人均付费(SQLPython)

ARPU&#xff1a;人均付费总收入/总人数ARPPU&#xff1a;付费用户人均付费总收入/付费人数业务要求&#xff1a;1.各地市用户数、总费用(ARPU之和)是多少&#xff1f;2.表一中各地市ARPU(0,30),[30,50),[50-80),[80以上)用户数分别是多少&#xff1f;3.表二中用户有重复的记录…

Web 框架

1、Web框架 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式&#xff0c;也为web行为提供了一套通用的方法。web框架已经实现了很多功能&#xff0c;开…

“引用作为函数参数”与 “引用作为函数返回值”

一、引用作为函数参数 作为函数参数时引用有两种原因&#xff1a;1、在函数内部会对此参数进行修改&#xff1b;2、提高函数调用和运行效率。 关于第一点&#xff0c;都知道C里提到函数就会提到形参和实参。如果函数的参数实质就是形参&#xff0c;不过这个形参的作用域只是在…

vue删除数组中的一条数据_删除排序数组中的重复项 II

删除排序数组中的重复项 II题目给定一个增序排列数组 nums &#xff0c;你需要在 原地 删除重复出现的元素&#xff0c;使得每个元素最多出现两次&#xff0c;返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…

使用Docker堆栈部署的微服务-WildFly,Java EE和Couchbase

关于微服务的资料很多&#xff0c;只是用谷歌搜索就可以了 &#xff01; 几年前&#xff0c;我在比利时的Devoxx上发表了有关将单片重构为微服务的演讲&#xff0c;它得到了很好的评价&#xff1a; 该博客将展示Docker如何简化微服务的创建和关闭。 该博客中使用的所有代码都…

基于图像灰度的模板匹配

基于图像灰度的模板匹配 设模板图像T&#xff08;m*n&#xff09;&#xff0c;待匹配图像I&#xff08;M*N&#xff09;&#xff0c;两幅图像的原点都在左上角&#xff0c;这里有&#xff08;m<M&#xff0c;n<N&#xff09;。模板匹配的基本原理很简单&#xff1a;模板图…

学习activemq,在spring中activemq的配置信息

提供者&#xff1a; <?xml version"1.0" encoding"UTF-8"?><beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:jms"http://www.springframewor…

pca各个向量之间的相关度_PCA主成分分析

降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征&#xff0c;去除噪声和不重要的特征&#xff0c;从而实现提升数据处理速度的目的。降维的算法有很多&#xff0c;比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA…

matlab 图像坐标系

matlab 图像中图像坐标系与plot、 imrotate坐标系的区别 图像坐标系是以图像左上角为原点&#xff0c;访问图像像素点img&#xff08;m&#xff0c;n&#xff09;&#xff0c;如下图所示&#xff1a; plot的坐标系&#xff0c;以图像左上角为原点&#xff0c;在图像中划线时&am…

matlab impyramid图像金字塔

B impyramid&#xff08;I, direction&#xff09; direction 可取‘reduce’或‘expand’&#xff0c;表示图像的宽度与高度缩小为原来的1/2与变大为原来的2倍

python你会吗_Python这些问题你会吗?

Python这些问题你会吗&#xff1f;final作用域的代码一定会被执行吗&#xff1f;正常的情况下&#xff0c;finally作用域的代码一定会被执行的&#xff0c;不管是否发生异常。哪怕是调用了sys.exit函数&#xff0c;finally也是会被执行的&#xff0c;那怎么样才能让finally代码…