从恋爱到前端性能优化

Halo,大家好,我是古韵,一个热爱技术的全栈工程师。你可能已经看过我的一些文章,那些文章就像你的早餐,能给你提供满满的能量。

往期热文

是时候该换掉你的axios了

(深度)开源框架/库的伟大与罪恶

不过,今天我们要谈的不是这些美食,而是前端首屏加载性能优化这个“大菜”。你知道吗,前端就像约会中的第一印象,它的重要性不言而喻。而首屏加载速度,就如同约会中的迟到,让你的形象大打折扣。

所以,让我们一起挽起袖子,拿起筷子(或者是键盘和鼠标),一起来优化前端这道“菜”,让你的网站在用户心目中留下美好的第一印象。

你要知道,前端首屏加载速度就像是你约会迟到了,结果发现自己的发型凌乱、衬衫塞错了裤子,然后你女朋友问你:“你怎么这么晚?”这时候,你心里只有两个字:崩溃!

image.png

但是,我们不能崩溃,我们要优化!以下是一些有趣的优化方法,让你在前端世界中成为约会专家(哦不,是优化专家)。

image.png

那应该如何优化前端性能呢?我觉得最首要的一个关键因素就是

资源的瞬时开销量

资源的瞬时开销量指的是在某个时间段内,电脑需要同时处理的所有资源的数量,包括以下4个方面:

  1. 网络
  2. 算法
  3. 视图渲染
  4. 服务端优化

让我们来一一探讨一番!

第一大点:网络

减少网络数据瞬时传输量

想象一下,你要一次性搬完一座山,还是慢慢搬?当然是慢慢搬对吧?减少网络数据瞬时传输量就像是这样,慢慢地传输数据,而不是让所有的数据一下子涌进来。

首先,我们要学会“减肥”!想象一下,网络数据传输就像是一场马拉松比赛,而我们的浏览器就是那个跑得飞快的主角。但是,浏览器在跑马拉松的时候,得带着一大堆的行李,就像我们加载网页时需要传输的数据一样。

那么,如何减轻这个“行李负担”,让浏览器跑得更快呢?

首先,我们要学会“减肥”!就像我们为了跑马拉松而要减轻负担一样,在前端优化中,我们也需要减轻数据的负担,主要有以下方式:

  1. 去掉不必要的传输数据
  2. 静态资源压缩
  3. 非首屏使用的数据延迟加载
  4. 图片延迟加载
  5. js分包
  6. 代码体积优化
    1. 代码压缩
    2. tree shaking
    3. gzip开启

减少网络通信数量

我们要知道网络通信是浏览器在加载网页时的主要性能瓶颈之一。每次发出HTTP请求和接收响应都需要进行通信,而通信的时间和数据量都会影响网页的加载速度。

那么,怎么才能减少网络通信数量呢?

以下是我们的三个主角:

1. 图片合并

想象一下,如果你需要向朋友发送一张照片,但照片太大无法直接发送,你需要把它压缩到合适的大小。同样地,我们可以把多个图片合并成一个文件,从而减少HTTP请求的数量。这种技术被称为图片合并(Image Sprites)。

示例代码:

.icon {  

  background-image: url('sprite.png');  

  background-position: -10px -10px; /* 表示第一个图片的位置 */  

}

2. 使用HTTP/2共用socket

HTTP/2是新一代的HTTP协议,它支持多路复用,也就是可以在同一个TCP连接上同时发送多个请求和响应。这就好比是你们班在餐厅聚餐,每个人都可以在一桌菜里夹菜,不用每个人都开一桌。这样可以大大减少网络通信的数量哦!

3. 不常变更的资源进行缓存

有些资源是不经常变化的,比如一些库文件、CSS样式表等。我们可以把这些资源缓存到本地,从而减少对服务器的请求次数。这就好比是你在网上购物,如果你经常购买的商品可以放到购物车里,下次购买时就可以直接从购物车里选择,不用每次都要重新加入购物车,这样可以节省时间和网络通信量。

缩短网络通信链路

每一次网络通信都需要经过各种节点,而这些节点的数量和距离都会影响网络通信的速度。所以,缩短网络通信链路是提高前端性能的另一个重要手段。

那么,怎么才能缩短网络通信链路呢?

1. 使用CDN缩短网络通信链路

CDN(Content Delivery Network,内容分发网络)是一种通过将内容缓存到网络边缘,从而提高网站性能和可靠性的技术。CDN可以减少网络延迟,加快用户下载速度,并减少服务器负载,从而提高网站的可访问性和用户体验。

当用户访问网站时,首先会尝试从离用户最近的“缓存仓库”中获取这些内容。如果仓库中已经存在用户所需的内容,那么用户就可以快速地下载并使用这些内容,而不需要直接向远在千里之外的服务器发送请求。

这就好比是一个超市,在门口放置了一个“购物车”,当顾客进入超市时,他们可以直接从购物车中获取所需的商品,而不需要重新在货架上寻找。这样不仅可以节省顾客的时间和精力,还可以减轻超市员工的工作负担,提高整个超市的效率和可靠性。

2. DNS缓存

DNS(Domain Name System)是将域名转换成IP地址的网络服务。每次访问一个网站时,都需要通过DNS来将域名转换成IP地址,然后才能进行网络通信。而DNS缓存可以将之前查询过的域名和对应的IP地址缓存到本地,下次再访问同样的网站时就可以直接使用缓存中的IP地址,而不需要重新进行DNS查询,从而缩短网络通信链路。

第二大点:算法优化

一个好的算法可以让你在处理大量数据时依然能够保持高效,而优化算法的方法有很多种,下面我们就来介绍两种常见的优化方案:

1. 合理设计数据结构

选择合适的数据结构可以让你的算法运行速度更快,因为绝大部分时候,我们可以使用存储量换计算量,也就是使用更好的数据结构来减少计算量。比如你需要存储一组数据,你可以选择使用数组、链表、栈、队列还是哈希表呢?

答案是:根据具体情况选择最合适的数据结构!

比如,如果你需要快速地访问和修改数据,那么数组可能是最好的选择;如果你需要实现动态的添加和删除数据,那么链表可能更适合;如果你需要实现先进先出或先进后出的数据结构,那么栈和队列可能是更好的选择;而如果你需要快速地查找数据,那么哈希表可能更适合。

2. 将复杂算法放在服务端

我的观点是,客户端应该尽量轻,因为客户端环境是不可控的。
因此,客户端的算法太过复杂,会占用大量的计算资源。这时候,我们可以考虑将一些复杂的算法放在服务端处理。

比如,如果你需要处理大量的数据,你可以在服务端使用分布式计算框架,如Hadoop或Spark,将数据分成多个部分并行处理。这样不仅可以提高计算效率,还可以减少客户端的资源占用,这些都是在我们可控的范围内。

又比如,如果你需要使用一些复杂的机器学习算法,可以在服务端使用GPU加速计算,提高算法的计算效率。

第三大点:视图渲染方面

终于到了要聊DOM渲染的事儿了,DOM渲染可是一件相当神奇的事情,它是需要JavaScript和浏览器进行通信的,这些都是成本啊!!!

只渲染首屏使用到的视图,避免瞬时渲染过度dom

在DOM渲染的过程中,最关键的一点就是要避免瞬时渲染过度DOM。你想象一下啊,你要在操场上绘制一个巨大的图形,但是你却试图一次性画完,那画面该有多么壮观!

同样地,在DOM渲染时,如果一次性渲染过多的DOM元素,浏览器也会累得满头大汗,导致页面加载速度变慢。

所以,我们要根据实际情况触发,采用一些技巧来控制DOM的渲染。

比如说,我们可以只渲染首屏使用到的视图。就像你在操场上画画时,可以先画出一块观赏区域,然后再慢慢地扩展到其他地方。

为了实现这个功能,这些功能,在UI框架比如React、Vue或者Angular等,一般都能找到现成的轮子使用,比如React中的React.memo和React.useMemo等高阶组件,可以用来缓存和复用已经渲染过的组件,避免重复渲染。

当然,如果你不想使用框架或者库,也可以手动实现这个功能。比如说,你可以在页面加载完成后,再动态地加载其他模块的代码。这样可以有效地控制DOM的渲染,提高页面加载速度,让用户的体验更加流畅。就像你在操场上画画一样,要一步步来,不要一次性画得太多哦!

第四大点:服务端优化

聊完前端部分了,我们还可以再换一个思路,将优化手段转换到服务端范围,那就是服务端渲染了,这种方式可以有效地减少客户端的渲染负担,提高页面加载速度。

服务端渲染

想象一下,你开了一家餐厅,但是每次都要让顾客【排队等待】很长时间才能上菜,那么你的生意肯定好不到哪儿去。同样地,在Web开发中,如果页面加载速度过慢,用户也会失去耐心,从而选择离开。

而服务端渲染就可以帮助我们解决这个问题。我们可以将菜品拍照放在菜单上和调味品准备好调好味道放在锅中等,当顾客进入餐厅点餐后,直接将饭菜送到顾客的桌子上。这样不仅提高了上菜的速度,还减少了顾客等待的焦虑。

说回我们的前端来的话,就是,服务端渲染可以将页面代码和数据合并在一起,通过一次网络传输将它们发送给客户端。这样可以减少网络传输的时间和延迟,从而提高页面加载速度,同时,服务端渲染可以可以将已经渲染好的页面缓存到服务端内存或磁盘中,下次用户请求时可以直接返回缓存页面,而不需要重新渲染。这样也可以大大减少页面加载时间。

同时,服务端渲染可以在服务端进行计算和渲染,从而减轻客户端的计算负担,这样可以减少客户端的资源占用,提高页面的响应速度和用户体验。

页面预生成

另一个优化方式是页面预生成。页面预生成是指提前将页面代码和数据合并在一起,然后存储在缓存中放在菜单上,等到用户请求时可以直接返回缓存中的页面。

想象一下,你有一个非常繁忙的餐厅,但是每次点餐都要花费很长时间,每次等服务员记录订单和做菜的时间很久,这不是要准备要倒闭的迹象。而如果你提前将一些常见的菜品常见的菜单准备好提前拍照放在菜单上,等到顾客点餐时就可以直接从缓存中取出直接翻到对应的菜单页,大大提高了效率点餐速度。

最后,我们不得不提Nextjs和Nuxtjs两大服务端渲染框架!!!

image.png

image.png

Nextjs和Nuxtjs是两个非常流行的服务端渲染框架,它们都可以用来提高服务端渲染和页面预生成的效果。这两个框架都是基于React或Vue的,具有很强的功能和灵活性,可以让你在开发Web应用时更加高效和舒适。

在nextjs中,你可以使用getServerSidePropsgetStaticProps来分别获取服务端渲染时的数据,和页面预生成时的数据。

而在nuxtjs中,你可以通过nuxt.config.js的generate函数来预生成页面。

随意总结一下

对于一个公司而言,公司产品的性能可能是公司能否做大的决定性因素之一,例如以下几个方面:

  1. 提高转化率:通过优化页面,提高用户完成转化目标的比例,例如购买商品、注册、下载等。
  2. 提高广告收入:通过优化页面,提高广告曝光和点击率,从而提高广告收入。
  3. 提高品牌形象:通过优化页面,提高公司品牌形象和知名度,从而吸引更多用户和客户。

我觉得这方面是一定要注重的。

今天就到这啦,拜拜!!!

往期热文(梅开二度)

是时候该换掉你的axios了

(深度)开源框架/库的伟大与罪恶

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYOw4WY5' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片