这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
跨职能研发流程汇总
- 整体上遵循:需求分析 => 方案设计 => 开发 => 测试 => 验收 => 发布流程
- 这只是主流程,并不适用于所有场景(例如: Hotfix、npm 发包),重在理解各职能分工
- 产品:决定做什么、验收方案、验证方案有效性;
- 研发:开发、自测、承担部分运维职能等;
- 测试:质量检测把关;
- 实际场景中可能出现无数状况(风险管理):
- 需求变更;
- 上下游依赖发生问题(比如需求延期);
- 疫情、天灾、人祸等不可抗力因素...
前端工程化
初始化项目
假如是新项目,那么你需要做很多技术选型:
- 代码仓库组织形式
- monorepo 指包含多个不同项目的单一代码仓库,并且内部子项目具有明确定义的关系
- polyrepo 指每个应用或库分别拥有各自的代码仓库,不会和其他代码仓库合并
- 决定采用设计技术栈(React or Vue? Node or Java? AntD or ArcoDesign? CSR or SSR?),要做许多技术决策;
- 搭建工程化环境: 构建工具、Lint 工作流(ESLint/StyleLint/Prettier/Lint-Staged/huscky)、UT 工具(单元测试)、CI/CD等(整个过程是在开发过程中不断优化的)
- CI、CD 其实是三个概念,包含了一个 CI 和两个 CD 。
- CI(Continuous Integration)持续集成
- 持续频繁的(每天多次)将本地代码“集成”到主干分支,并保证主干分支可用
- 目的:快速反馈问题让产品可以快速迭代,同时还能保持高质量;通过自动化手段提高集成速度,将问题前置;防止本地代码大幅偏离主干
- 工具:Jenkins、GitlabCI、CircleCI、GithubActions
- CD(Continuous Delivery)持续交付
- 持续集成的下一步,持续频繁地将软件的新版本交付到类生产环境(类似于预发),交付给测试、产品验收。
- 相比持续集成,持续交付除了交付到类生产环境之外,还会执行一些集成测试、API测试等等,确保交付的产物可以直接交付部署。
- CD(Continuous Deployment)持续部署
- 持续交付的下一步,“自动”将代码部署到生产环境
- 目的:代码在任何时刻都是可部署的,可以进入生产阶段。持续部署和持续交付触发方式的区别是,持续部署是自动完成的,持续交付是手动完成的
- 资源部署: 物理服务器、云服务器、faas、CDN(托管静态资源)等
工欲善其事,必先利其器!这些逻辑,通常会被沉淀为脚手架工具(vue-cIi/CRA 等),下次更迅速创建项目。
功能开发
分支模型(规范):
- feature based development基于特性(更常用)
- 从master主分支拉出最新的develop开发分支
- 成员再根据功能从develop拉出自己的分支,做完测试后合并到develop开发分支
- 开发分支做测试也没问题后,再推到release发布分支,
- 发布的部分在release分支测试没问题之后才推到master主分支,发版结束
- Trunk based development基于主干(被monorepo带火)
所有人围绕主干开发,要开发直接从主干拉分支,做完迅速合并回主干,主干有完善的测试和CI/CD,马上就能完成集成,要发布的时候从主干拉出一个新分支来发布,有变更就再从主干拉新分支发布
开发:
- 工具效率
- IDE 效率: 设计适当的配置 & 插件环境,有助于减少手动操作次数,提升团队研发效率
- 单测效率: 按需单测? 单测覆盖率?
- 构建效率: 按需构建?构建逻辑优化?构建缓存?
- 确保不犯错
- 接入 Typescript,ESLint、StyleLint、CommitLint、lint-staged、pretier等,解决代码风格和类型安全问题,
- UT(jest/vitest 等) 确保代码运行效果
- 这两类工具都有一定上手成本,但能做到吹毛求疵,确保不会发生小错误,保证长期可维护!
- 安全性:
- 如何避免混入有问题的 npm 模块?
- 如何确保产物不出现敏感信息(如 github token)?
集成&测试
- Code Review,重在准入规则: 经过谁、多少人的 approve 后,可以合入代码;
- 配合 CR,通常还可以设置许多自动检测的准入条件(所谓的 CI):
- 构建命令必须成功;
- Lint 必须通过;
- 单测必须通过,单测覆盖率不能降低,且整体覆盖率必须大于阈值(或增量代码的覆盖率大于阈值)
- E2E 测试必须通过;
- 性能 diff 检查;(变化过多如超过1M就有问题)
- 各类代码安全检查;
- 班车式发版不可行,到某一刻再集成容易出现问题,比如代码冲突,造成上线来不及
上线发布
- 小流量部署:设置一个单独的发布环境,请求流量命中某些规则(例如带有特定 header) 时,转发流量到此环境;用于开发预览、功能测试(for 测试同学)等,本质上是一个集成联调环境:
- 灰度部署:同样是设置单独的发布环境,请求流量命中某些规则(例如特定的用户组、特定的地理区域等,或者按机房部署)时,转发流量到灰度环境,主要用于上线前的功能验证、实验(分组映射到不同环境)
- 秒级回滚:即使上线,也应该提供一套稳定的方法,能秒级瞬间回滚到上一个版本
线上监控
监控目标:性能、异常、业务指标
结论
那么,什么是前端工程化呢?它不是一堆工具无意义的堆叠,而是围绕团队技术栈、项目复杂度、开发流程等要素所设计 & 搭建出来的,旨在提升整体开发效率 & 质量的方法论与工具的结合。至少应该涵盖:
- 需求准入准出: 定义什么事情能做,做到什么程度算完工,开发完成上线后,持续观测需求情况(技术层面+业务层面)——对结果负责:
- 从左到右的研发规范、规则:定义一件事情怎么做,且应该尽可能自动化,用工具来确保规则被严格执行——对过程负责,
前端主要工作:
- 参与需求评审,理解要做什么事情,做出技术评估
- 技术方案设计
- 需求开发
- 自测联调
- 发布上线
- 持续观测数据