Skip to content

可以从三个方面回答性能优化:

  • 项目架构
  • 项目开发
  • 项目部署

项目架构

架构设计主要考虑两个方面的因素:

  • 协同开发
    • 多个开发人员能够有效地一起工作,减少冲突和重复工作
  • 模块解耦
    • 在设计和开发过程中,使各模块之间的依赖最小化

Service网络请求模块

  • 对axios进行统一封装,然后对网络请求、错误处理、数据格式化进行统一的处理
  • 可以在services目录下为不同的页面或模块创建独立的文件,比如userService.js、homeService.js、loginService.js

Utils工具封装模块

将项目中通用的工具函数封装在utlils目录下,比如日期格式化函数、数据处理函数等

Store状态管理模块

  • 在vue项目中,可以通过pinia的模块化设计来管理状态
  • 每个页面或功能模块有自己的store模块

Webpack和Vite的优化

  • 代码分割
  • 动态导入
  • Tree Shaking

使用版本控制和分支策略

  • git flow工作流
  • 代码审查CR

其他方面

  • CI/CD实现自动化部署
  • 文档和沟通

项目开发

合理使用v-if和v-show

避免不必要的组件重渲染

  • 比如使用key确保组件的唯一性,避免不必要的DOM更新

组件懒加载

使用Vue的computed来缓存计算结果

合理使用keep-alive

防抖和节流

使用Web Workers

  • 将繁重计算任务移到web workers中,避免阻塞主线程,保持UI流畅性

避免内存泄漏

  • 在组件销毁时清理定时器、事件监听器,闭包小心内存泄漏

使用现代图片格式和精灵图

  • 使用webp、avif等格式减少图片文件大小,加快加载速度,对图片进行压缩处理
  • 精灵图的使用,页面只需要发送一次请求来加载这张大图,而不是每个小图标发送多个请求,可以显著地减少http请求的数量,降低网络开销

图片懒加载

CSS选择器优化

  • 使用简单有效的选择器,避免复杂的选择器链,提高渲染性能

避免回流和重绘

  • 尽量减少DOM操作,使用批量更新,优化回流和重绘性能
  • 使用transform和opacity进行动画效果,避免触发回流

使用CSS动画

  • 优先使用CSS动画而非js动画,提升性能

服务端渲染SSR

  • SSR是在服务器端预先渲染页面,并将完整的HTML发送到客户端
  • SSR是提高了首屏渲染速度,特别适用于SEO需求强的项目和需要快速加载的应用

第三方包按需引入

  • 比如element-plus和antd

使用虚拟列表

  • 在处理长列表时,使用虚拟滚动技术,只渲染可视区域的元素,提升性能

使用React.memo

类组件使用PureComponent,函数组件使用React.memo

使用 useCallback 和 useMemo

  • useCallback 用于缓存函数引用,避免子组件因为传入函数变化而重渲染。

  • useMemo用于缓存计算结果,避免每次渲染时都重新计算。

代码分割和懒加载

通过 React.lazySuspense 实现动态加载组件,可以有效减少初始加载时间,提高页面的首屏性能

避免不必要的副作用

确保 useEffect 中的依赖数组正确配置,避免不必要的副作用执行

项目部署

CDN的使用和配置

  • 通过将资源缓存到离用户更近的服务器上,CDN可以显著地减少资源加载时间,提升用户体验
  • 选择可靠的CDN提供商,比如阿里云、腾讯云
  • 配置构建工具(比如Webpack或Vite)输出静态资源的路径为CDN URL

首屏渲染速度优化

  • 将首屏渲染所需的关键CSS内联到HTML中,减少CSS阻塞渲染的时间,也可以整合网络请求
  • 使用async或defer属性来异步加载js脚本,避免阻塞渲染

HTTP缓存策略

  • HTTP缓存策略通过在客户端缓存静态资源,避免重复请求,减少服务器负载和页面加载时间
  • 根据文件的特性,设置强制缓存(Cache-Control和Expires),比如js文件、css文件等
  • 对于频繁更新的文件,使用协商缓存(Etag和Last-Modified),比如HTML页面经常变更

代码压缩和优化

  • 去除多余空格、注释、代码缩短,使用TreeShaking

  • 使用TerserPlugin对js代码进行压缩

  • 使用mini-css-extract-plugin对CSS代码进行分离

  • 使用css-minimizer-webpack-plugin对CSS代码进行压缩

  • 使用splitChunks提取公共的包

  • 使用TinyPNG工具对图片进行压缩,减少图片文件的大小

  • 对于图标和简单的图形,可以使用SVG格式,这种格式不仅文件小,而且可以无损缩放

  • 服务器配置中开启gzip压缩来实现文件压缩

减少和优化资源请求

  • 减少DNS查询:通过将对个资源托管在同一域名下,减少DNS查询的时间
    • 对于必须跨域的资源使用DNS预解析(<link rel="dns-prefetch" href="xxx.com">)
  • 通过异步加载或延迟加载(比如使用async或defer)来减少第三方脚本对页面加载速度的影响
  • 预加载和预获取
    • 使用<link rel="preload" href="xxx">来预加载关键资源
    • 使用<link rel="prefetch" href="xxx">来获取未来可能需要的资源