腾讯Now直播前端工程化的实践之路前端
受访嘉宾 | 程柳锋
编辑 | Yonie
在百花齐放的前端圈,层出不穷的组件框架已让前端开发者目不暇接,另外,再加上业务和开发团队的不断发展,前端开发人员面临的问题愈来愈多。日渐突出问题主要为:如何高效的与团队成员进行合做开发?项目愈来愈多,不一样技术栈的项目如何统一维护?如何制定和践行统一的开发规范?如何高效的部署和发布产品?
这个时候 前端工程化 概念的出现,解决了上面让开发者头痛的问题。它旨在制订规范化的前端工做流,并规范统一项目的模块化开发和前端资源,让代码的维护和互相协做更加容易更加方便。同时,让你们可以释放生产力,提升开发效率,更好更快地完成团队开发以及项目后期维护和扩展。
可是前端工程化具体是如何实践的呢?带着这样的问题,咱们采访了参加本次 ArchSummit 全球架构师峰会的腾讯 Now 直播产品 IVWEB 团队社区、工程化的负责人——程柳锋,程老师与咱们分享了腾讯 Now 直播在前端工程化上的具体实践方案。如下是本次的采访内容:
InfoQ:请您先作下自我介绍吧。
程柳锋:我是程柳锋,来自腾讯,前后参与腾讯 NOW 直播、NOW 语音交友、手 Q 群视频、群送礼等与直播相关的的泛娱乐产品的开发。另外我仍是整个腾讯 IVWEB 团队社区、工程化的负责人。现阶段主要关注团队的工程化建设,包括新技术的预研和落地,另外也积极探索行业前沿技术好比:WebAssembly、PWA 等。
InfoQ:一线开发人员参与前端项目过程当中须要关注哪些因素?
程柳锋:在产品迭代过程当中,前端的定位每每是处于应用层,负责 UI 开发和用户交互体验的工做。你们平常开发时接触的 To C 的产品居多,好比 BAT、美团、滴滴等大厂的产品。这类产品的量级比较大,基本上日均 DAU 能达到几百、几千万,甚至过亿。所以,这类产品对用户体验要求很是高,一个微小的 JS 脚本错误很容易引起血案。
以咱们团队为例,对于每一位开发者都有较高的专业能力要求,一般概括为三个要素。按照重要性顺序以下:小程序
最后是研发效率,就是如何在较短的时间内,快速地进行业务需求的开发和上线。
InfoQ:如今腾讯上线前端项目,或者说升级项目版本,大概须要多长时间呢?
程柳锋:上线时间会根据具体的项目类型地变化而变化。咱们内部总体采用敏捷开发模式,一般一个项目从启动到上线在 2~3 周,其中一周为开发时间,一周为测试上线的时间。
另外,对于重点攻坚项目咱们以前也有大胆的尝试。举个例子,在 2018 年年初时,直播领域里的答题玩法特别火爆。各家直播平台好比:花椒、映客、熊猫直播,包括腾讯、高德地图、支付宝等都在作直播答题的应用。咱们当时作这种攻坚项目,第一个版本从产品方案设计到最后上线发布仅仅花费两周时间。相对来讲时间仍是很是紧凑的,对一线开发人员做战能力有着较高的要求。
InfoQ:前端工程化是您负责的重要工做之一,它都包括哪些内容呢?
程柳锋:前端工程化是一个团队的基础设施之一,它更加偏向工程架构、研发流程相关的内容,主要有这样几个目的:前端工程化
随着业务的快速发展,产品需求爆炸式增加,团队成员不断扩充,前端工程化的首要目的就是知足快速发展的业务须要。前端工程化须要标准化研发方式、研发流程(开发、测试、发布、线上监控),让你们从建立项目到最终项目上线、监控使用相同的开发习惯。这个是前端工程化的主要目的。浏览器
第二个目的,把团队的经验(好比作项目时踩的坑、通过试验得以验证的新特性等)沉淀到脚手架和开发套件中,使其余同窗在开发新项目时能够复用这些经验。前端框架
1.业务场景的不断的复杂,不少事情须要前端去承载。像 H五、跨端应用,以及如今 WebAssembly、PWA 等新技术,他们的出现都让浏览器端能够承载的事情更多了,不少业务逻辑由服务端、客户端迁移到了前端。网络
2.2009 年 Node.js 的兴起给前端工程化提供了工具层面的支持,如今你们写的构建工具、脚手架工具、代码规范检查,以及咱们作的 Pre Render,都是在 Node.js 的基础之上作的。前端工程化的概念还须要经过工具来加以践行和佐证,咱们经过 Node.js 编写 CLI 或基于 nw.js/Electron 的 GUI 工具,在项目的建立阶段,你们可使用统一的命令来建立项目、页面或组件;在项目的开发阶段,针对不一样技术栈的项目可使用不一样的开发套件进行本地开发、调试、和规范检查。
InfoQ:从 2009 年到如今也有 10 年的时间了,你以为如今前端工程化大概发展到什么阶段了?
程柳锋:前端工程化的价和团队规模成正相关的关系,团队规模越大,工程化的价值就更高。能够分为几个阶段:架构
2.另外,Webpack 能够作的事情有不少。整个社区的 Loader、插件十分丰富。好比 HappyPack,其多进程多实例打包方案能够实现快速打包,相对 Fis3 来讲,其打包效率是很是高的。包括如今 Webpack 官方也原生提供了 thread-loader,也能够经过它进行多进程多实例的快速打包,从而让打包时间获得极大的优化。app
3.Webpack 和其余构建工具的差异在于 Webpack 打包理念是革命性的。Webpack 把全部的资源都当作模块(好比 JS、CSS 图片、字体,或富媒体的文件等)。与其余构建工具相比,Webpack 最显著的特征是它经过各类 loader 去处理模块,这也是你们为何一直叫 Webpack 模块打包器的缘由。Grunt 和 Gulp 的构建过程都是以 Task Runner 的方式去作的。Gulp 是流式的构建,而 Grunt 每次的构建产物会存储到本地的 tmp 目录中,Gulp 是直接放到内存里,构建的时候相对 Grunt 更快一点。
InfoQ:腾讯把构建工具从 Fis3 迁移到了 Webpack4?在切换的过程当中有没有遇到什么困难呢?又是怎么解决的?
程柳锋:咱们当时切换的时候确实遇到了不少困难。第一个困难是 Fis3 里面支持了一些比较好的特性,而在 Webpack 却没有。这里面也能够举一些咱们在实际迁移过程当中遇到的例子,好比说 Fis3 支持 inline 语法,能够将 HTML 片断引用到另一个 HTML 中,也能够将一个图片 inline 过来自动 Base64,还能够合成雪碧图,总的来讲它能够精细化的控制资源。但在 Webpack 中是不支持 inline 语法、雪碧图的合成。咱们解决的方案是实现相关的 Loader,好比 inline Loader。对于雪碧图的 sprites-loader,在项目迁移的过程当中咱们把 Fis3 的资源内联语法 (?_inline) 和合成雪碧图语法 (?_sprite) 作了下兼容,新旧项目中都支持了。
其次,Fis3 中支持资源引入时的绝对路径写法,在迁移至 Webpack4 的过程当中也须要对它作兼容支持。
还有一个比较大的差异就是打包方式的不一样。用 Fis3 打包时是以 HTML 为入口,但在 Webpack4 中是以 JS 为入口,打包的入口发生了很大的变化。这时候,咱们也须要对以前的逻辑作些适配。
InfoQ:各个项目中使用的技术栈大不相同,这对项目组件化带来了什么样的影响?
程柳锋:这其实会带来的一个最大的影响是,不一样技术栈项目的组件没法复用到另外一个项目。因此针对于组件化的复用,咱们也作了一些适配,固然,不是全部的组件都适配,咱们只是对基础的组件作同构。上层的业务组件能够复用同构好的基础组件。同构相对来说比较难,但为了以后维护的便利性也是值得的。最好仍是根据各自的技术栈实现不一样的业务组件,并统一维护。
InfoQ:腾讯 NOW 直播产品在团队工具链、规范等开发配套设施的建设过程当中遇到了哪些问题?
程柳锋:这里面咱们也是遇到了很多问题。我先从规范提及吧。咱们团队成立之初,是从腾讯的 IMWEB 团队孵化出来的,这时咱们的工具链大多延用他们的工具链。随着这业务的快速发展,暴露出不少业务自身的痛点,原来的工具链没法知足现有需求。为了解决这个问题,咱们创建了新的工具链和规范。咱们首先创建了 Git 提交规范、Git 工做流规范、分支规范、README 规范、监控规范等。可是规范创建以后又面临另外一个巨大挑战:如何将这些规范落地实施呢?咱们在这方面作了不少尝试:框架
另外在工具建设的落地方面,咱们会作不少工具平台,好比监控平台、移动测试代理、组件平台等,但这些平台怎么落地?咱们也作了一些操做。以监控平台为例,咱们会把每一个业务对应的 JS 错误 ID、JS 报错率统计出来,并作一下排名。对于排名靠后的项目,会把相关人员、业务的名单展现出来,并通知相关的技术负责人、业务老板等。这个作法仍是比较好的,有利于你们及时发现问题和解决问题,同时也帮助整个团队改进工具平台。
InfoQ:在前端工程化的发展过程当中,腾讯 Now 直播产品经历了怎样的技术架构变化?
程柳锋:一开始腾讯前端工程化的建设与其余公司仍是有必定的差距,甚至说是落后的。最开始咱们团队的前端工程化局限于 Fis 构建的工程化。Fis 能够很好支持本地开发,但不支持建立项目、单元测试、端对端测试、代码检查的工程化。因此咱们第一阶段作的事情就是换掉 Fis,使用 Webpack 做为咱们的构建工具。
以前,整个腾讯 CI 这块的建设比较落后,CI 作得事情也比较有限。在作了脚手架和构建工具切换后,咱们团队搭建了 Jenkins,以便于代码的可持续集成。
搭建了 Jenkins 以后,接下来慢慢的迁移到整个公司,并接入了橘子 CI(Orange CI),借助 Orange CI 把不少 CD 的事情也一块儿作了。由于以前接入的 CI 还不完全,咱们 CI 完成以后,开发者仍然须要在平台上面手动的点击发布,预上线发布仍是有不少的人工操做。但咱们 CI 完成以后,每次 CI 完成以后它会自动构建出一个包。less
若是是正常的 push,默认状况下,构建出来的包会自动的部署到测试环境,完成测试环境的部署任务。
1.前端工程化能够作不少事情,前面提到了有三个阶段,那么第四个阶段就是中台化,咱们能够联合多个部门共建前端工程化,让它的生态和体系更加完善,从而有效的避免重复造轮子的事情,这是每一个公司将来都要重点实践的事情。
2.前端技术发展异常活跃,新的技术和框架不断的出现。对于新的技术方案,咱们要及时的把它们整合进来,并探索它们的工程化,好比说像小程序、Flutter、Serverless 等这些新技术的工程化方案。
3.咱们认为前端工程化将来的定位将更加超前。新技术的预研有很大一部分是放在前端工程化中来作的。举个例子,以前咱们的项目是 React 16.2.0 版本,这个版本咱们用了一年多,但随着 React 框架不断的发布,当 React 发布到 16.8.0 的时候,React 会带来不少新特性,若是再用以前的 16.2.0 版本,开发者将没法感知 React 的新特性。这时候,经过前端工程化的方式,能够帮助你们快速的体验新特性。另外,还包括一些技术方案的尝试,好比像 WebAssembly、PWA 等,经过前端工程化的方式,可以更好的赋能咱们业务。