当前位置: 首页 > news >正文

前端宝典十一:前端工程化稳定性方案

一、工程化体系介绍

1、什么是前端工程化

  • 前端工程化 = 前端 + 软件工程;
  • 前端工程化 = 将工程方法系统化地应用到前端开发中;
  • 前端工程化 = 系统、严谨、可量化的方法开发、运营和维护前端应用程序;
  • 前端工程化 = 基于业务诉求,梳理出最符合当前需要的架构设计;
    软件工程:将工程方法系统化地软件工程应用到软件开发中;
    工程方法:以系统、严谨、可量化的方法开发、运营和维护软件;

2、前端工程化发展

  1. 前后端分离:B/S架构兴起,有了前后端之分;
  2. 模块化:随着前端复杂度上升,模块复用、实践规范重要性提升;
  3. 自动化:管理&简化前端开发过程,前端框架、自动化、构建系统应运而生;
  4. 最佳实践:基于行业内最佳实践,开箱即用的框架(dva)、工具体系逐渐建立起来;
  5. 好、快、稳:依赖vite、esm、wasm、低代码等能力;

二、项目开发全流程

项目全流程包含5个阶段:
评审阶段、准备阶段、开发阶段、发布交付阶段、产后阶段
在这里插入图片描述

1、评审阶段

该阶段主要包括:

  1. 项目立项
  2. 编写需求
  3. 需求评审
  4. 开发设计、开发设计评审
  5. 视觉交互评审

2、准备阶段

该阶段主要包括:

  1. 新建仓库
  2. 构建或选择脚手架
  3. 项目初始化

3、开发阶段

该阶段主要包括:

  1. 开发/打包配置
  2. 本地mock
  3. 业务实现
  4. 单元测试

4、发布交付阶段

该阶段主要包括:

  1. git commit规范;
  2. changeLog规范;
  3. 打包构建;
  4. 部署、验收;

5、产后阶段

该阶段主要包括:

  1. 错误监控
  2. 数据分析

开发全流程的5个阶段,最终目的是确保需求按期上线,且上线后正常运行,没有生产问题,但是前端页面上线后需要有工程化工具来进行打分,也就是用户体验度量。

三、体验度量

1、体验度量要解决的问题

在这里插入图片描述
上图是度量面临的问题,针对这些问题,我们通过体验度量想要达到的目标是:
在这里插入图片描述

2、体验度量设计

在这里插入图片描述
上图中的FCP、LCP是通过前端性能监控工具performance给出的重要指标,我们会专门针对性能监控开一篇。
在这里插入图片描述

同时像error上报、用户基础数据日志上报、埋点事件、访问上报、卡顿率等指标都是用来评价前端页面性能的,这样可以让体验度量具像化。

四、规范流程

1、研发效能定义:

团队能够持续地为用户产生有效价值的效率,包括有效性(Effectiveness)、效率(Efficiency)和可持续性(Sustainability)三个方面。简单来说,就是能否长期、高效地交付出有价值的产品;
在这里插入图片描述

五、稳定性建设

随着业务迭代的发展,前端(to B/to C端)或多或少都有迭代周期快的压力,在业务的眼里,前端可能更多是“切图仔”,针对前端的具体实现并不关心。导致单人或小团队内很容易造成技术选型自由松散,缺乏约束和专门的技术限制,经常每个人或几个人自己维护一套代码开发流程,技术上更多体现在“拿来主义",工程链路不统一,代码重复度高,页面一致性差,各业务域松散,缺失共享,同时,在代码发布集成后的监控告警几乎没有,缺乏有效的监控手段与快速定位问题(可监控),及时止血(可恢复)的能力,并且缺乏项目的灰度与极值流量的压测,其实以上都是前端稳定性建设需要解决的核心问题。
基于上述内容,总结为三点:

  1. 可预防;
  2. 可监控;
  3. 可回滚;

通过以上三点,我们主要从研发态与运行态出发,通过研发流程的源码框架、工程规范,依赖检测去提高开发质量,发布过程中通过在发布节点上添加监控,做灰度卡口,避免问题带到线上,线上运行时通过实时监控告警实现快速定位问题,快速止血。

稳定性建设流程
在这里插入图片描述

1、可预防

(1) 规范团队代码研发流程

通过统一规范前端文档及开发工具,最大可能减少前端研发时差异化部分;
团队文档建设&新人指导
属于软机制,通过文档记录,保证团队在研发基础、故障认知上达成一致;
开发脚手架
通常要支持以下能力:

  • git hooks、git commit配置;
  • eslint配置;
  • 根据命令行配置选择框架template;
  • 支持测试用例集成;
    组件&物料市场
    针对业务属性,梳理常见的开发通用代码,包括但不限于:
  • npm包;
  • 通用代码snippet集合;
  • 业务组件物料市场;

(2) 攻防演练

通过日常及大促前的攻防演练,训练面对问题快速止血的演练机制;
故障&压测演练
考察针对流量异常、断网弱网等场景下的降级方案的处理;
代码CR注入
通过在代码code review时加入无效信息,检测是否认真查看CR内容,记录团队攻防数;

(3)灰度方案

  • CDN分流
  1. 并不是所有项目都需要灰度发布,在CDN做层拦截对所有项目都有侵扰;
  2. 根据单一职责,CDN不应该做灰度分流的工作,若用代理模式再CDN前加一层代理分流,实际会造成无效流量的增长;
  3. CDN要记录用户是否命中灰度,通常需要加cookie,若命中多灰度,cookie增长会过多;
  • N个版本文件打包到一个文件里
  1. 灰度比例可以通过随机数比例生产,但是要记录用户是否命中灰度,需要使用localStorage记录;
  2. 需要将文件*n(n为灰度个数)融合,会造成带宽的浪费;
  • 前端分流后加载CDN
    前端代码加载前先加载一次HTTP请求
  1. 虽然有优化,能解决文件体积过大的问题,但可能会导致一但出错,阻塞后续方案,且会额外调一次接口;

2、可监控

在这里插入图片描述

(1)数据采集

  • 无埋点:自动采集
    • 脚本异常
    • 接口异常
    • 资源异常
  • 手动上报埋点:需要业务手动上报
  • 脚本异常

script error:window.onError;

window.addEventListener('error', () => {})

在这里插入图片描述
在这里插入图片描述

  • addEventListener(‘unhandledrejection’):用于处理promise.reject没有处理的异常;
    在这里插入图片描述

  • react错误上报(V16):componentDidCatch、getDerivedStateFromError;


componentDidCatch(error, info)class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {// 更新 state 使下一次渲染可以显示降级 UIreturn { hasError: true };}componentDidCatch(error, info) {// "组件堆栈" 例子://   in ComponentThatThrows (created by App)//   in ErrorBoundary (created by App)//   in div (created by App)//   in ApplogComponentStackToMyService(info.componentStack);}render() {if (this.state.hasError) {// 你可以渲染任何自定义的降级 UIreturn <h1>Something went wrong.</h1>;}return this.props.children;}
}
  • 请求异常
    XMLHttpRequest/fetch
    在这里插入图片描述
  • 性能采集
    在这里插入图片描述

(3)数据上报

上报方式

  • get 1*1像素GIF:体积小,不会带cookie,无跨域,无页面阻塞,服务器不需要响应;
  • sendBeacon;
  • xhr/fetch;

发送时机

  • 立即发送、批量发送:requestIdleCallback;

(4)数据清洗

  • 阈值处理:单位时间内错误数超过,抽样处理;错误数重复,只统计数量;
  • 数据预处理:去除无用信息;
  • 数据聚合:聚合有用数据;

(5)数据持久化

  • 时效性高:告警 -> 大量数据查询,要求错误信息及时暴露,如 Elasticsearch;
  • 时效性低:数据报表&大图展示 -> 大量数据存储,对数据量级有要求,时效性要求不高:如Mysql;

(5)数据可视化

  • 数据告警:在上传CDN时添加卡口,支持手动上传sourcemap,定位问题上下文;
  • 数据大图:支持按业务指标进行搜索;
  • 健康报告:通过定时任务跑出系统内各个业务线的定量数据指标,进行指标的排名、治理,通过榜单形成红黑榜,正向推动循环;

3、可回滚

1、容器化部署

如果将代码和配置分开部署,在回滚的时候就会遇到"应该是先回滚代码还是回滚配置"的难题,所以,要想轻松回滚,在部署的时候,一定要将代码和配置整体打包,这里建议使用容器化部署,保证代码和配置可以整体回滚;

2、数据迁移

在业务变更涉及数据迁移时,应对数据表的字段采取"只增不删"的原则。因为当某个字段被当前代码引用的字段被删除后,线上业务是会出问题的,但新增一个没有被当前代码引用到的字段,则不会有问题。
等到确认新版代码工作完全正常,不会再回滚到旧版本时,才将旧字段删除。一旦旧字段被删除,引用到旧字段的旧版本代码就无法工作,也就无法回滚到旧版本了。

4、总结

总结上述内容,其实前端的稳定性建设更多地是对整个研发流程节点上故障的预防与治理,分别从可预防、可监控、可回滚三个维度进行梳理,简要介绍了一个完整的前端项目中在稳定性建设上的发力点,实际项目还是结合业务诉求,选择最合适的切入点,优先解决最痛点的问题。

相关文章:

前端宝典十一:前端工程化稳定性方案

一、工程化体系介绍 1、什么是前端工程化 前端工程化 前端 软件工程&#xff1b;前端工程化 将工程方法系统化地应用到前端开发中&#xff1b;前端工程化 系统、严谨、可量化的方法开发、运营和维护前端应用程序&#xff1b;前端工程化 基于业务诉求&#xff0c;梳理出最…...

yum 数据源的切换

本来准备安装一个ntp 服务器时间进行同步&#xff0c;但是使用yum install ntp -y 但是却失败了 原因是yum自带的镜像源不能用了&#xff0c;所以要想使用yum 多功能只能切换yum 对应的镜像源了 如果你的服务商是可以使用wget命令的&#xff1a; wget -O /etc/yum.repos.d/Ce…...

MySQL入门学习-命令行工具.mysqlbinlog

MySQL 命令行工具mysqlbinlog用于处理二进制日志文件。 一、关于mysqlbinlog工具的详细介绍&#xff1a; 1、命令行工具mysqlbinlog的特点和使用方法&#xff1a; - 特点&#xff1a; - 可以解析和查看二进制日志文件的内容。 - 支持多种输出格式&#xff0c;如文本、SQ…...

WARNING XXX is not overriding the create method in batch

WARNING XXX is not overriding the create method in batch api.modeldef create(self, vals):quvals[name]youqu self.env[crm.qu].sudo().search([(name, , qu),(shi_id,,vals[shi_id])])if len(youqu)>0:raise UserError(_("该区名已存在&#xff0c;无需再填加…...

使用预训练的 ONNX 格式的目标检测模型(基于 YOLOv8n-pose)姿态监测

具体步骤如下&#xff1a; 加载图像&#xff1a; 从指定路径读取一张图像&#xff08;这里假设图像名为bus.jpg&#xff09;。将图像从 BGR 颜色空间转换为 RGB 颜色空间。 图像预处理&#xff1a; 计算图像的高度、宽度&#xff0c;并确定其中的最大值作为新图像的边长。创建一…...

matlab实现模拟退火算法

模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种通用概率优化算法&#xff0c;用于在给定的大搜索空间内寻找问题的近似全局最优解。该算法灵感来源于物理学中固体物质的退火过程&#xff0c;其中温度逐渐降低&#xff0c;粒子逐渐趋于能量最低状态。 在M…...

【Prettier】代码格式化工具Prettier的使用和配置介绍

前言 前段时间&#xff0c;因为项目的prettier的配置和eslint格式检查有些冲突&#xff0c;在其prettier官网和百度了一些配置相关的资料&#xff0c;在此做一些总结&#xff0c;以备不时之需。 Prettier官网 Prettier Prettier 是一种前端代码格式化工具&#xff0c;支持ja…...

【计算机网络】网络基础

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;Linux &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵&#xff0c;希望大佬指点一二 如果文章对…...

MFC在对话框中实现打印和打印预览

首先在这里感谢互联网的大哥们&#xff01;同时我讨厌动不动就是要vip才能查看&#xff01;所以我写的不需要vip就能看。只求点个赞。 直接上代码&#xff0c;新建6个文件CPrintFrame.cpp&#xff1b;CPrintFrame.h&#xff1b;CPrintPreviewView.cpp&#xff1b;CPrintPrevie…...

移动端页面出现闪屏

v-cloak 的作用和用法 用法&#xff1a; 这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时&#xff0c;这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。官方API {{msg}} HTML 绑定 Vue实例&#xff0c;在页面加载时…...

elasticsearch的高亮查询三种模式查询及可能存在的问题

目录 高亮查询使用介绍 高亮参数 三种分析器 可能存在的查询问题 fvh查询时出现StringIndexOutOfBoundsException越界 检索高亮不正确 参考文档 高亮查询使用介绍 Elasticsearch 的高亮&#xff08;highlight&#xff09;可以从搜索结果中的一个或多个字段中获取突出显…...

【精品实战项目】深度学习预测、深度强化学习优化、附源码数据手把手教学

目录 前言 一、预测算法数据与代码介绍(torch和mxnet都有) 1.1 数据介绍 1.2 代码介绍 1.3 优化介绍 二、深度强化学习算法优化 2.1 DDPG 介绍 DPG--deterministic policy gradient DQN--deep Q-network DDPG--deep deterministic policy gradient 三、其他算法 总结…...

JavaScript 手写仿深拷贝

实现对象参数的深拷贝并返回拷贝之后的新对象&#xff0c;因为参数对象和参数对象的每个数据项的数据类型范围仅在数组、普通对象&#xff08;{}&#xff09;、基本数据类型中且无需考虑循环引用问题&#xff0c;所以不需要做过多的数据类型判断&#xff0c;核心步骤有&#xf…...

spring低版本设置cookie的samesite属性

场景&#xff1a;比较古老的项目了&#xff0c;ssh架子&#xff0c;Chrome 51 开始&#xff0c;浏览器的 Cookie 新增加了一个SameSite属性&#xff0c;可用于防止 CSRF 攻击和用户追踪。因此需要给其字段赋值。 网上找了很多资源&#xff0c;由于jar版本比较低&#xff0c;没有…...

GPT4o编写步进电机控制代码

我给出的要求如下&#xff1a; 基于STM32F407 HAL库&#xff0c;写一个步进电机控制程序&#xff0c;需要控制8个步进电机&#xff0c;我会给出描述步进电机的结构体变量&#xff0c;基于这些变量需要你做出以下功能&#xff0c;电机脉冲通过定时器中断翻转脉冲引脚的电平实现…...

关于Spring Boot的自动配置

目录 1.EnableAutoConfiguration注解 2.SpringBootConfiguration注解 3.Import注解 4.spring.factories 5.总结 &#xff08;1&#xff09;EnableAutoConfiguration &#xff08;2&#xff09;AutoConfigurationImportSelector &#xff08;3&#xff09; SpringFactoriesLoade…...

## 已解决:`java.sql.SQLSyntaxErrorException: SQL语法错误` 异常的正确解决方法,亲测有效!!! ###

1. 问题描述 java.sql.SQLSyntaxErrorException 是 Java 程序在执行 SQL 查询时&#xff0c;因 SQL 语法错误而抛出的异常。通常情况下&#xff0c;错误信息会指示出错的 SQL 语句及错误原因&#xff0c;如拼写错误、关键字遗漏、字段名称错误等。 典型的错误信息如下&#x…...

备战秋招60天算法挑战,Day22

题目链接&#xff1a; https://leetcode.cn/problems/missing-number/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1HS42197Hc/ LeetCode 268.丢失的数字 题目描述 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组…...

在Linux下搭建go环境

下载go go官网&#xff1a;All releases - The Go Programming Language 我们可以吧压缩包下载到Windows上再传到Linux上&#xff0c;也可以直接web下载&#xff1a; wget https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz 解压 使用命令解压&#xff1a; tar -x…...

738.单调递增的数字

738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...