阿孜去面试-性能优化

132 阅读4分钟

面试官:看你简历里写了性能优化,具体是怎么做的。

首屏优化

  • 拆分js文件,cdn,按需引入
  • 接口请求数据过多,减少数据请求,使用数据缓存,
  • 大量图片加载慢,图片压缩,图片懒加载
  • 过多的渲染重绘动作,使用css动画代替js动画
  • 网络问题,使用cdn等优化
  • 字体问题,优化字体大小,字符集。font-display: swap 在加载完成前可读。

其他优化

1. 减少HTTP请求

  • 合并文件:将多个CSS或JavaScript文件合并为一个,减少请求次数。
  • 使用CSS Sprites:将多个小图标合并为一张大图,通过CSS定位显示不同部分。
  • 内联小资源:将小的CSS或JavaScript代码直接嵌入HTML中,减少外部请求。

2. 优化资源加载

  • 异步加载JavaScript:使用asyncdefer属性异步加载JavaScript,避免阻塞页面渲染。
  • 延迟加载非关键资源:使用lazy-loading技术延迟加载图片、视频等非关键资源。
  • 预加载关键资源:使用<link rel="preload">预加载关键资源,如字体、CSS、JavaScript等。

3. 压缩和优化资源

  • 压缩CSS、JavaScript和HTML:使用工具如UglifyJS、CSSNano、HTMLMinifier等压缩代码。
  • 压缩图片:使用工具如ImageOptim、TinyPNG等压缩图片,减少文件大小。
  • 使用WebP格式:WebP格式比JPEG和PNG更高效,支持更小的文件大小和更好的质量。

4. 使用CDN

  • 内容分发网络(CDN) :使用CDN加速静态资源的加载,减少服务器响应时间。

5. 缓存优化

  • 浏览器缓存:通过设置HTTP缓存头(如Cache-ControlExpires)利用浏览器缓存。
  • Service Worker:使用Service Worker实现离线缓存和资源预加载。

6. 减少重绘和回流

  • 避免频繁操作DOM:减少对DOM的频繁操作,避免引起重绘和回流。
  • 使用CSS3动画:使用CSS3动画代替JavaScript动画,利用硬件加速。

7. 优化JavaScript

  • 减少全局变量:减少全局变量的使用,避免命名冲突和内存泄漏。
  • 使用事件委托:使用事件委托减少事件处理器的数量。
  • 避免长任务:将长任务分解为多个小任务,使用requestIdleCallbacksetTimeout避免阻塞主线程。

8. 优化CSS

  • 避免使用@import@import会阻塞CSS加载,使用<link>标签代替。
  • 减少CSS选择器复杂度:简化CSS选择器,减少浏览器匹配时间。
  • 使用Flexbox和Grid布局:使用现代布局技术减少布局计算时间。

9. 使用Web Workers

  • 后台任务处理:将复杂的计算任务放到Web Workers中执行,避免阻塞主线程。

10. 监控和分析

  • 使用性能分析工具:使用Chrome DevTools、Lighthouse等工具分析页面性能。
  • 监控真实用户性能:使用RUM(Real User Monitoring)工具监控真实用户的性能数据。

11. 优化字体加载

  • 使用font-display:通过font-display属性控制字体加载行为,避免文本闪烁。
  • 预加载字体:使用<link rel="preload">预加载关键字体。

12. 减少第三方脚本的影响

  • 延迟加载第三方脚本:将非关键的第三方脚本延迟加载,避免阻塞页面渲染。
  • 使用异步加载:使用asyncdefer属性异步加载第三方脚本。

13. 优化首屏加载

  • 关键CSS内联:将首屏所需的CSS内联到HTML中,避免阻塞渲染。
  • 骨架屏:使用骨架屏提升用户感知性能。

14. 使用HTTP/2

  • 多路复用:HTTP/2支持多路复用,减少连接数,提升加载速度。
  • 服务器推送:利用HTTP/2的服务器推送功能,提前推送关键资源。

15. 优化Webpack打包

  • 代码分割:使用SplitChunksPlugin进行代码分割,按需加载。
  • Tree Shaking:移除未使用的代码,减少打包体积。
  • 压缩代码:使用TerserPlugin压缩JavaScript代码。

16. 使用PWA

  • 渐进式Web应用(PWA) :通过Service Worker和Web App Manifest实现离线访问和快速加载。

17. 优化动画

  • 使用requestAnimationFrame:使用requestAnimationFrame代替setTimeoutsetInterval实现动画。
  • 避免布局抖动:避免在动画中频繁修改布局属性,减少重绘和回流。

18. 优化Web字体

  • 子集化字体:只加载需要的字符集,减少字体文件大小。
  • 使用font-display: swap:确保文本在字体加载完成前可读。

19. 减少JavaScript库的使用

  • 按需引入:只引入需要的库或模块,避免引入整个库。
  • 使用轻量级替代品:选择轻量级的库或框架,减少不必要的开销。

20. 优化SEO

  • 提升页面加载速度:页面加载速度是SEO的重要指标之一。
  • 使用结构化数据:通过结构化数据提升搜索引擎对页面的理解。

通过以上策略,可以显著提升前端性能,改善用户体验。