一次Web端大量图片同时加载卡顿问题的优化之旅

背景

由于业务的需要,笔者最近需要实现一个大量图片同时加载的需求。

在实现这个需求的过程中,笔者遇到了很多的坑,也总结了一些优化方案。

这里将笔者使用或准备使用的优化方案总结一下。

具体场景

在描述如何解决问题,我们现在先来申明,问题是什么?

笔者的需求大概是在某个页面显示 11000张,200500k大小的图。

好消息是这些图片来源于本地硬盘而非网络。(否则这个问题就要变成优化网络....)

踩坑历程

由于不是纯前端的项目,笔者可以从本地文件夹中读取文件。

然后一段代码劈里啪啦的就出现了。

const fileList = this.props.fileList;
return (
    <div className="list-wrapper">
        {
            fileList.map((file) => {
                <img className="img-item" src={file.src}>
            })
        }
    <div>
)

就在笔者满心欢喜的认为这个需求基本搞定了,该去楼下加鸡腿的时候。

无情的现实狠狠的抽了我一巴掌。

随着网页的刷新,一张纯白的画面展示在了我的面前,然后只见图片一点一点的从上面加载出来。

我不禁陷入了沉思,是CPU跑不动道了还是内存飘了?

在一想,我这电脑都这个表现,真要上线了,这客户能忍受吗?

不对,就这表现,没上线前产品小姐姐就的把我ko了...

方案一 懒加载

这种场景下想必大家第一反应也是懒加载。简单介绍一下图片懒加载。

常见的图片懒加载方案是指页面加载时只渲染屏幕可见区域及周围的图片。

当页面滚动时再加载需要显示的图片。
出于提高效(tou)率(lan)的目的,笔者在网上找了个比较好用的懒加载库然后引入项目。

然而,情况并不乐观。

因为该需求场景下每一张图片的宽高都是 50*50,那么在PC端常见的 1080p 的设备上首屏需要显示的图片达到了400+张。
即便我们忽视这个问题,当用户滚动网页速度很快时图片加载的体验也是不ok的。

所以懒加载并不是万能的。

方案二 预加载

首先我们要知道,在硬件性能不变且CPU调度不能更积极的前提下。

理论上我们无法减少图片渲染的时间。

所以我们只能想办法调整图片渲染的方式来提高用户的体验。

所以我们采用预加载的方式。

const fileList = this.props.fileList;
fileList.forEach((element) => {
    let img = new Image();
    img.src = element.src;
    img.onload = () => {
        // 渲染这张图
        ...
    }
})

当然我们也可以使用img.decode()方法对图片进行解码,它会返回一个promise对象。

img.decode().then(() => {
    // 渲染这张图
     ...
})

采用了这套方案后,图片会一张又一张的加载。

然而,加载的速度实在是不敢恭维。如果用户想看最后那张图片,那他只能在哪里进行长久的等待...

方案三 懒加载 + 预加载

众所周知,3 = 1 + 2。 所以方案三就是方案一和方案二的结合体。

首先我们加载一张图片未加载时的底图(占位)。

而后我们继续采用方案二的方式进行图片逐个的预加载。

当用户滚动图片时,我们便改变下一站预渲染的图片为用户可见区域的第一张。

然而,情况还是不乐观。

当用户的滚动条匀速直线不停的往下运动时,效果依然很差。

终结方案

综合上面几种方案,基本能优化的我们都已经优化了。

那如继续何提高用户的体验呢?

似乎,我们只能从图片本身去下手?
上文也提到,在我所面临的需求场景下一张图片的显示宽高为50 * 50。

而图片的大小为200~500k。

所以我们可以采用缩率图的方式,先渲染一张3~5k大小的缩略图,等用户点击图片查看详情时再去渲染大图。

采用缩略图的情况下我们再使用方案三进行优化,性能表现几乎就可以满足这个场景下用户的需求了。

其他

当然,上面的几种优化方案只是我在某个项目中使用。

我们仍然可以采用例如图片渐进式增强,CDN缓存,图片压缩,设立单独的资源服务器等诸多方式。

图片的加载优化本身也是一个前端老生常谈的问题,业内已经有太多太多的解决方案。

如果你有更好的方案,你也可以在下面留言告诉我。

谢谢观看。

作者:苏格团队
链接:https://juejin.im/post/5cbd30e7e51d456e803516ba

求点赞,求关注~


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • 背景 由于业务的需要,笔者最近需要实现一个大量图片同时加载的需求。在实现这个需求的过程中,笔者遇到了很多的坑,也总...
    编程鸭阅读 1,056评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 看到一篇关于讲列表优化,讲的很好,特转摘过来。原文链接 这一篇文章是iOS性能优化系列文章的的第二篇,主要内容是关...
    林伟彦笔记阅读 2,049评论 1 23
  • 下周一女儿班级升旗,老师l给同学们主题,让同学们回家收集资料写发言稿。上周六日女儿生病了,流鼻涕,咳嗽,还有些许的...
    每日的力量阅读 142评论 0 1
  • 今天一觉睡到八点半,懵懂地起床洗漱,突然想起了昨晚的梦。这个梦整体的感觉很好,大部分的内容忘记了,只记住了一句话—...
    此身越重洋l阅读 158评论 0 0