0.通过并行构建、并行压缩、缩小范围、启用缓存等方法,webpack构建速度提升 80%。
1. 通过对webpack进行配置优化,提升项目构建速度和减少项目打包体积,提高开发效率,提升页面加载体验。
2.大数据上传,通过Blob 大文件切片上传,async-pool 实现请求并发限制
asnyc-pool是一个库,用来实现并发控制。 参数
- 表示限制的并发数
- 表示任务数组
- 迭代函数
3.统一封装Axios通用请求,实现公用参数携带、请求响应拦截、全局loading自动化配置、统一文件下载处理等功能
- 公用参数携带 利用axios.creact()实现一个axios实例,里面可以配置一些变量
- 全局loading自动化配置:根据自定义变量loading变量入参来判断是否设置全局loading。设一个变量a=0,请求拦截时a+1,弹出全局loading,响应拦截时,如果loading存在,a-1,就消失loading
- 统一文件下载处理:如果请求状态码不为200的时候,报错,如果成功则利用Blob下载文档流的方式封装下载方法。大概步骤为使用new Blob(返回的二进制流)使用creactObjectURL转换成a标签的href,然后利用a标签下载。
4.设计并实现前端权限管理方案,实现登录权限、页面权限和内容权限的控制,可以更加细粒度对页面进行管理
菜单权限:
- 后台返回菜单路由信息,前端去动态路由里面匹配,从里面过滤可以访问的路由,然后在添加到动态路由实例里面
- 路由直接配置到后台, 在登陆项目里面先登录拿到菜单,在main项目里面调用router包的方法,生成路由
- 如果存在跳转到某个错误页,可以根据判断生成一个路由实例去重定向到某个固定页面(登录权限)
内容/按钮权限:
- 根据后端返回的权限编码展示
5.通过减小入口文件体积、静态资源本地缓存和图片资源的压缩等方案,实现首屏 FCP 从 5s 减少到 1.5s
- 减小入口文件体积 : 通过cdn引入静态资源 路由懒加载vue:import+箭头函数 React:React.Lazy
- 静态资源本地缓存
- 图片资源的压缩
6.通过选择合适图片格式、图片懒加载和预加载方案,提升多图页面加载速度,
-
图片优化:进行图片压缩/缩放和选择正确的图片格式。
-
网络传输优化:使用 HTTP/2 和 CDN 服务。
使用 HTTP/1.X 协议时,浏览器有同源最大并发连接数的限制,且 HTTP/1.X 不支持多路复用,因此一个多图站点想要获得较完整的视觉呈现,会有一定程度的延迟:所有的资源请求(包括图片资源)会进入先进先出(FIFO)队列等待被下载。
使用 HTTP/2 前的常见优化方案包括:- 使用精灵图 / 雪碧图,减少 HTTP 请求数。
- 10kb 大小以内的图片资源使用 base64 编码,减少 HTTP 请求数。
- 通过使用多个域名,开启多个 TCP 连接,突破浏览器同源最大并发连接数的限制。
由于 HTTP/2 支持多路复用,因此使用 HTTP/2 可以进一步减少网络延迟,更加快速的加载图片资源。
-
图片加载策略优化:按需使用懒加载、预加载,响应式图片加载等策略。
-
图片懒加载:
- 使用 img 标签的 loading 属性。
- 使用 Intersection Observer API。
- 使用 scroll、resize 和 orientationchange 事件。
-
预加载:
- link:
<link rel="preload">
允许开发者在 HTML 的 head 标签中声明资源请求,指定页面需要预加载的资源,并且在浏览器的主要渲染机制启动之前加载,避免阻塞页面渲染且保证资源尽早可用。 - 动态场景:一般常见方案是动态创建 Image 标签或者是 Ajax 请求。使用 Ajax 时需要注意可能存在跨域问题。
// 动态创建 Image function preloadImage(url) { var img = new Image(); img.src = url; }
- link:
-
响应式图片加载
- 一般可以通过使用 picture 标签来定义零或多个 source 节点和一个 img 节点,用于提供图片在不同设备/显示场景下对应的内容展示。
-
7.由于首页列表数据量大,长时间滑动加载会卡顿,使用虚拟列表优化性能
原理:虚拟列表就是只加载显示可视化区域的dom,往上滚动或者往下滚动更新可视化区域的dom
8.引⼊ ESLint 和 Prettier规范代码,使⽤ commitizen 规范化提交信息
9.一套代码编译到小程序端和H5端,解决跨端兼容问题
uni-app 已将常用的组件、API封装到框架中,开发者按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足。
10.设计并实现小程序数据缓存方案,通过在不同网络状态下对静态和动态数据缓存,提升页面加载速度
数据缓存
-
静态数据 --- 类似省市区
- 接口获取后storage 缓存数据 每次缓存取
-
动态数据 网络状态监听 --- 简易的中间层拦截 网络状态判断 缓存判断 转发请求 返回数据更新数据
- 接口http请求
-
正常网络
- 设计过期时间 --- 可配置哪些接口需要
- storage存在 并且没有过期使用
- 否则http请求 并更新数据
- 设计过期时间 --- 可配置哪些接口需要
-
弱网情况的 熔断-降级-恢复机制 --- 可配置哪些接口需要
- 通过配置 一些接口在正常网络下每次缓存数据
- 弱网直接使用 缓存数据
- 请求进入 taskQueue
- 网络恢复 执行taskQueue 更新缓存数据
-
- 接口http请求
11.封装常用业务组件,包含常见表单、人脸识别等
12.通过canvas生成海报,方便用户分享
性能优化:
离屏渲染技术
原理:将静态或重复绘制的内容预先渲染到不可见的画布上,后续直接复用已渲染结果,避免重复计算和绘制。
// 创建隐藏Canvas预渲染
const offscreenCanvas = uni.createOffscreenCanvas({ type: '2d' });
// 预渲染二维码等静态内容
renderStaticParts(offscreenCanvas);
异步分步渲染
sequenceDiagram
participant UI
participant Renderer
UI->>Renderer: 启动渲染
Renderer->>Renderer: 阶段1: 绘制背景(同步)
Renderer-->>UI: 更新进度(30%)
Renderer->>Renderer: 阶段2: 加载图片(异步Promise)
Renderer-->>UI: 更新进度(50%) Renderer->>Renderer: 阶段3: 生成二维码(Web Worker)
Renderer-->>UI: 更新进度(80%) Renderer->>Renderer: 阶段4: 合成最终图像
Renderer-->>UI: 完成(100%)
async function renderStepByStep() {
// 阶段1:同步绘制背景
const ctx = uni.createCanvasContext('poster');
drawBackground(ctx);
await ctx.draw(true);
updateProgress(30);
// 阶段2:异步加载动态图片
const images = await Promise.all([
loadImage('flower.png'),
loadImage('qrcode.png')
]);
updateProgress(50);
// 阶段3:Worker线程生成复杂内容
const qrCodeData = await worker.generateQRCode('https://example.com');
ctx.drawImage(qrCodeData, 100, 100);
updateProgress(80);
// 阶段4:最终合成
await ctx.draw(true);
updateProgress(100);
}
// Web Worker任务分配
worker.onMessage(async (res) => {
if (res.type === 'qrcode') {
const data = await generateQRCode(res.text);
worker.postMessage({ type: 'qrcode', data });
}
});
//Worker线程 :在后台执行耗时操作(如计算、I/O、网络请求),完成后将结果返回主线程