web前端性能优化 —— 前端人必需的知识储备

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 本文较长,也比较全,从多个维度、各个阶段来谈前端性能优化的各种实用技巧。(重点与难点放了图片解析,希望能够对大家有所帮助)

本文较长,也比较全,从多个维度、各个阶段来谈前端性能优化的各种实用技巧。(重点与难点放了图片解析,希望能够对大家有所帮助)


请求阶段


开启HTTP2

多路复用,突破TCP连接数限制。

头部压缩,节省请求带宽。

二进制分帧方式,提高通信效率。

1.png

  • 开启http缓存
  • 利用Expires和Cathe-Control开启强缓存
  • 利用Last-Modified/If-Modified-Since开启协商缓存


2.png

  • 开启gzip压缩
  • 降低关键资源的带宽体量(实测可压缩60%以上)

3.png

缩小请求头

减少一些不必要的Cookie信息携带。

利用CND(把大文件的加载变成一个请求,直接拿过来用,适用于大图、大文件)

减少单次RTT时长,加速资源获取。

4.png


域名分片


将一个网站的资源放在多个域名下面,拓展TCP连接数。

降低HTTP请求数


CSS和JS,根据实际情况,进行内联与合并。


图片合成雪碧图,小图片base64化。


避免css @import。


可以用CSS实现的不要用图片,再小的图片也是一个请求!


避免重定向


避免延迟整个HTML文档的传输。

DNS预解析

// 打开DNS预读取
<meta http-equiv="x-dns-prefetch-control" content="on">
// 强制查询特定主机名
<link rel="dns-prefetch" href="http://example.com">

5.png6.png

域名预连接

<link rel="preconnect" href="http://example.com">


加载阶段



资源压缩


对前端资源进行压缩

加载时机


js设置为异步加载(defer/async)

加载策略


SPA业务中,模块按需加载(路由懒加载)


css媒体查询,定义场景加载


图片懒加载


预获取


<link rel="prefetch" href="image.png">

预加载

<link rel="preload" href="image.png">


渲染阶段



预渲染

<link rel="prerender" href="image.png">

避免使用iframe


iframe连接页面后,会开启独立的页面进程,消耗资源

HTML优化


控制html标签层级,减轻解析负担,降低解析时间


首屏html可以少量,主体结构动态插入


CSS优化


CSS文件放head,让CSSOM先行,避免阻塞渲染树


控制css选择器层级,不要太深,降低匹配开销


尽量用id和class选择器,不要过渡层叠


避免使用通配符,提高匹配效率


JS优化


JS文件放在body底部,避免阻塞DOM树构建


避免在body内容中间插入script脚本


JS异步加载,设置defer/async


运行阶段




CSS层面


给图片设置尺寸,避免载入显示后,造成重排


巧用绝对定位,脱离文档流,避免后续操作,造成重排


因为绝对定位的元素一般处于默认复合层,所以它的改变还是会造成整个图层的重绘

巧用合成属性(will-change/3D transform)


新建合成层,独立于默认复合层,后续改变不会造成重拍/重绘


因为是合成层,运作基于合成线程,未占用主线程,效率较高


能用CSS实现的效果,尽量不用JS实现,充分发挥合成线程的能力


利用合成属性时,一定要设置z-index,防止后面的重叠元素同样被游览器新建图层,浪费资源


JS层面


巧用异步处理,减少js对主线程的长时占用(定时器/Web Worker)


不影响this的情况下,对反复访问的对象进行变量保存


避免过长的对象层次访问,提高读取效率


合理使用局部变量,减少作用域跨越


减少使用for...in循环,避免遍历原型链


巧用事件委托,降低事件绑定的内存占用


慎用闭包,避免使用with和eval


条件判断上,避免类型转换


条件较多时,使用switch代替if..else


最小化语句数,避免多个声明


简化终止条件,简化循环体,减值迭代


减少字符串拼接,避免"临时字符串"的出现


当叠加字符串的时候,字符串变量应该靠左


数组join方法,比其他字符串连接方式慢


字符串concat方法,比使用简单的+和+=慢


DOM层面


尽量用新选择器API代替老API


尽量通过Id和Class选择器进行DOM获取


避免直接操作style进行布局信息修改,造成重排


避免强制同步布局(在JS更改DOM信息后,立即访问)


DOM集合操作非常昂贵,应转换为数组再进行操作


对dom访问信息进行缓存,对dom改变进行批量操作


对操作频繁的dom,尽可能采用position:absolute(避免重排)


对操作密集的dom,先display:none——>操作——>再display:block(避免重排)


对操作量很大的dom,采用文档碎片createDocumentFragment


webApi层面


用requestAnimationFrame代替setTimeOut/setInterval进行动画实现(这一点是大多数人不知道的,画重点)


根据业务情况,适时使用Storage和IndexDB缓存数据,减少不必要的ajax请求


利用Web Worker处理无关dom的任务,减少对主线程的时间占用


对那些不会改变服务器状态,只获取数据的Ajax请求,应该使用get类型(让游览器缓存起来)






目录
相关文章
|
1月前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
58 3
|
1月前
|
前端开发 JavaScript
探索现代Web应用的微前端架构
【10月更文挑战第40天】在数字时代的浪潮中,Web应用的发展日益复杂多变。微前端架构作为一种新兴的设计理念,正逐步改变着传统的单一前端开发模式。本文将深入探讨微前端的核心概念、实现原理及其在实际项目中的应用,同时通过一个简单的代码示例,揭示如何将一个庞大的前端工程拆分成小而美的模块,进而提升项目的可维护性、可扩展性和开发效率。
|
22天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
31 6
|
1月前
|
消息中间件 前端开发 JavaScript
探索微前端架构:构建现代Web应用的新策略
本文探讨了微前端架构的概念、优势及实施策略,旨在解决传统单体应用难以快速迭代和团队协作的问题。微前端允许不同团队独立开发、部署应用的各部分,提升灵活性与可维护性。文中还讨论了技术栈灵活性、独立部署、团队自治等优势,并提出了定义清晰接口、使用Web组件、状态管理和样式隔离等实施策略。
|
1月前
|
监控 前端开发 JavaScript
探索微前端架构:构建可扩展的现代Web应用
【10月更文挑战第29天】本文探讨了微前端架构的核心概念、优势及实施策略,通过将大型前端应用拆分为多个独立的微应用,提高开发效率、增强可维护性,并支持灵活的技术选型。实际案例包括Spotify和Zalando的成功应用。
|
1月前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
37 3
|
1月前
|
前端开发 JavaScript API
前端框架新探索:Svelte在构建高性能Web应用中的优势
【10月更文挑战第26天】近年来,前端技术飞速发展,Svelte凭借独特的编译时优化和简洁的API设计,成为构建高性能Web应用的优选。本文介绍Svelte的特点和优势,包括编译而非虚拟DOM、组件化开发、状态管理及响应式更新机制,并通过示例代码展示其使用方法。
48 2
|
2月前
|
人工智能 前端开发
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
|
2月前
|
存储 前端开发 JavaScript
从 Web 2.0 到 Web 3.0:前端开发的历史与未来
【10月更文挑战第4天】本文探讨了从 Web 2.0 到 Web 3.0 的前端开发演变过程。Web 2.0 时代,前端开发者从静态网页设计走向复杂交互,技术框架如 jQuery、React 和 Vue 带来了巨大的变革。而 Web 3.0 以区块链技术为核心,带来了去中心化的互联网体验,前端开发者面临与区块链交互、去中心化身份验证、分布式存储等新挑战。文章总结了 Web 2.0 和 Web 3.0 的核心区别,并为开发者提供了如何应对新技术的建议,帮助他们在新时代中掌握技能、设计更安全的用户体验。
66 0
从 Web 2.0 到 Web 3.0:前端开发的历史与未来
|
1月前
|
监控 前端开发 JavaScript
前端技术探索:构建高效、可维护的Web应用
【10月更文挑战第23天】前端技术探索:构建高效、可维护的Web应用
52 0
下一篇
DataWorks