H5论坛性能优化实践之图片加速

2,660 阅读7分钟

一、引言

在移动互联网时代,用户对网页加载速度的要求越来越高,每一毫秒的等待都可能成为用户流失的转折点。对于论坛类应用来说,图片是吸引用户、提升用户体验的关键因素之一,然而,大量的图片内容如果不经过优化,往往会成为拖慢页面加载速度的主要因素,进而影响用户体验和论坛的活跃度。本文旨在探讨有效提升H5论坛中图片加载速度的方法,通过技术手段减少图片加载延迟,增强用户满意度和留存率。

二、背景介绍

iShot2024-06-21 17.05.07.png 通过APM监控对手游H5论坛分析得知,目前存在一些资源加载缓慢的问题,特别是图片资源,对用户体验有显著的负面影响,某些图片资源的加载问题甚至影响了超过70%的用户。因此当下迫切需要采取措施来优化图片的加载效率,这可能包括图片压缩、格式转换、懒加载技术以及使用CDN等。

三、图片优化策略

1.图片压缩技术:

图片压缩技术主要目的是减少图片文件的大小,以加快加载速度,同时尽量保持图片的视觉质量。图片压缩可以通过不同的算法实现,主要分为无损压缩和有损压缩两种类型。

1)无损压缩:

无损压缩技术允许图片在压缩后完全恢复到原始状态,没有任何质量损失。无损压缩的常见格式有PNG、GIF等。无损压缩算法的核心原理是去除数据中的冗余,而不丢失任何原始信息,确保压缩后的数据可以完全恢复到原始状态。

常见的算法有霍夫曼编码、Lempel-Ziv-Welch (LZW) 算法、字典压缩、游程编码等,在这里不展开叙述。无损压缩算法通常不会像有损压缩算法那样产生非常高的压缩比,因为它们不能去除任何原始数据信息。

2)有损压缩:

有损压缩技术通过去除图片中一些对视觉影响不大的数据来减小文件大小,但会导致一定程度的质量损失。适用于对图片质量要求不是特别高的场景,如网页图片、社交媒体分享等。有损压缩的常见格式包括JPEG、WebP等。

常见的有损压缩算法包含离散余弦变换、量化、子带编码、离散小波变换等等。

有损压缩算法在实现高压缩比的同时,必须仔细平衡压缩率和图像质量,以确保压缩后的图像在视觉上是可接受的。不同的应用可能对压缩质量和压缩率有不同的要求,因此选择合适的压缩算法和参数是至关重要的。

以下是图片压缩的代码示例:

public function compressImage($path) {
        if (!extension_loaded('gd')) {
            return $path;
        }
 
        $imageInfo = getimagesize($path);
        $originalWidth = $imageInfo[0];
        $originalHeight = $imageInfo[1];
 
        // 根据原始图片的格式创建相应的图片资源
        switch ($imageInfo['mime']) {
            case 'image/jpeg':
            case 'image/pjpeg':
                $source = imagecreatefromjpeg($path);
                $outputFunction = 'imagejpeg';
                break;
            case 'image/png':
            case 'image/x-png':
                $source = imagecreatefrompng($path);
                $outputFunction = 'imagepng';
                break;
            default:
                return $path;
        }
        // 创建一个空白画布
        $compressed = imagecreatetruecolor($originalWidth, $originalHeight);
 
        imagecopyresampled($compressed, $source, 0, 0, 0, 0, $originalWidth, $originalHeight, $originalWidth, $originalHeight);
 
        if ($outputFunction === 'imagejpeg') {
            $outputFunction($compressed, $path, 50);
        } else if ($outputFunction === 'imagepng') {
            $outputFunction($compressed, $path, 6);
        }
 
        imagedestroy($compressed);
        imagedestroy($source);
 
        return $path;
}

对于PNG格式的图片,使用PHP的imegapng函数进行压缩,它是基于底层zlib 库来实现的。zlib 是一个提供数据压缩功能的库,PNG 图像格式使用的是 zlib 库的 DEFLATE 压缩算法。

对于JPEG格式的图片,使用PHP的imagejpeg函数进行压缩,它使用有损压缩算法,主要是基于离散余弦变换(DCT)。DCT 将图像从空间域转换到频率域,然后对得到的频率分量进行量化,这一步会丢失一些数据,从而实现压缩。

在C端用户上传图片时,服务器自动进行压缩操作,以减小图片的大小。以下是压缩前后效果对比。

压缩前:

image.png

iShot2024-06-21 17.10.29.png

压缩后:

image-2024-6-21_12-12-43.png

iShot2024-06-21 17.07.18.png

通过上面的案例可以看到,在设置压缩程度50%的情况下,将该图片压缩后,文件大小减少了72%,色彩丰富度虽有一定降低,在可接受范围内。这就可以很大的提高图片的加载速度。

2.常驻图片的尺寸优化

对于常驻在页面中的图片,比如banner图、活动图片、按钮等,往往是访问量最大的资源,而UI设计同学直接给到的图通常都是高清大图,尺寸较大,因此对这些类型的图片进行瘦身的重要性不容小觑。

image-2024-6-21_14-25-52.png

在对banner图进行瘦身替换之后,其加载时长得到明显改善,资源返回的时间减少了90%,打开页面“丝滑感”有所提升。

iShot2024-06-21 17.12.01.png

3.图片CDN加速

CDN是互联网时代非常常见的一项技术了。它是一种分布式网络服务,通过将内容缓存到离用户更近的服务器上,减少数据传输的延迟和提高加载速度。工作原理是当用户请求资源时,CDN会将请求重定向到最近的边缘节点,从而提供更快的内容访问。对于图片等静态资源的加速,当然是离不开CDN了。

4.图片懒加载:

懒加载是一种延迟加载网页中非关键资源的技术,特别是对图片和视频等媒体内容。懒加载的核心原理是按需加载资源,即只有当这些资源即将进入用户的视口时才开始加载。通过延迟非关键资源的加载,懒加载可以减少初始页面加载时间,降低服务器负载,节省带宽。
它的实现一般包含:

1)滚动事件监听:通过监听滚动事件来检测元素是否进入视口。
2)计算视口位置:计算元素与视口的距离,确定是否需要加载。
3)加载资源:一旦确定元素即将进入视口,立即加载对应的资源。

前端通常借助LazyLoad、intersection-observer等懒加载库去实现资源的懒加载。

5.列表页使用缩略图,详情页加载原图

列表页展示缩略图和详情页加载原图是一种常见的图片优化策略,它能有效提升页面加载速度和改善用户体验。

实现这一策略也是离不开图片的压缩技术,同样地,我们可以借助GD库或者ImageMagick,在C端在执行上传动作时,把图片压缩成一份合适尺寸的缩略图,同时保留原图。在用户访问页面时,根据请求提供不同尺寸的图片。

四、前端性能监控

除了做优化本身之外,监控必不可少,它是我们发现问题、并确保优化效果得以持续和改进的重要环节。市面上有很多开源或者付费的监控工具,Pingdom、Google PageSpeed Insights、Lighthouse等,根据实际情况选用即可。

五、结语

虽然图片加速是提升网页性能的关键一环,但我们深知性能优化远不止于此。从精进代码效率、优化网络请求、加速服务器响应,到深入浏览器渲染机制,每一个环节都潜藏着成为性能瓶颈的可能。因此,我们必须采取全方位的优化策略,综合考虑各个层面,以确保我们的论坛能够流畅、高效地运行。