前一段时间出去面试了一波,有一个很常见但是也很值得深思的问题:在前端某次获取的数据量非常大的情况下,如何优化用户体验?假设不仅数据量很大,还需要在前端进行一些计算,那么该如何优化?
我猜大家都遇到过这种类似的问题吧……以下来分析一下我的个人看法
1. 数据量非常大
这种情况其实还可以细分数据量的数量区间,不同的数量区间有不同的解决办法~
1. 分页懒加载
这种应该是最直接粗暴的解法了,当数据量变少了的时候,数据下载时间自然会变小,毕竟大公司前端渲染的速度都是按照ms级别进行优化的~这样肯定是一个行之有效的办法,但是缺点是有一些场景确实没办法分页取数据,这样的话我们看下面的解决方案~
2. 服务端做缓存
从后端响应的速度来看,大数据量的情况下,查数据库的时间是需要消耗不少的,这个可以参考chrome开发者工具的network中的TTFB,这个时间越长,那么证明服务端不给力,需要进行优化,在数据量大的情况下,数据库查询是要消耗掉大部分时间的,这个时候,最好是使用缓存服务来提高查询效率,这个主要就是redis或者memcache来做,内存数据库,速度会非常快,重点是我们查询的数据只要命中缓存即可,这个方案缺点是第一次查询会慢一些,之后的会很快,但是首次查询其实可以由后端直接操作redis或memcache来直接设置数据~
3. web worker
这种办法的简单介绍是:Web Worker为Web内容在后台线程中运行脚本提供了一种简单的方法。线程可以执行任务而不干扰用户界面。此外,他们可以使用XMLHttpRequest执行 I/O (尽管responseXML和channel属性总是为空)。一旦创建, 一个worker 可以将消息发送到创建它的JavaScript代码, 通过将消息发布到该代码指定的事件处理程序(反之亦然)。
这种方法可以不占用用户界面的显示而去做一些其它的事情,这样,相对来讲,我们平时最常用的UI线程和JS执行线程就是空出来做一些其他的事情,这种请求数据的活可以交给web worker来做,具体做法这里不加赘述,有兴趣可以看看文档~
4. 前端缓存
这种方式就是传统的解决方式,例用强缓存也好,协商缓存也好,都可以达到某一段时间内使用缓存数据的目的,这个方式有超级多的文章解释,这里我也就不多说了~只是提供一个解决思路而已
2. 前端做计算
其实从用户体验上来讲,我不太建议前端做太过复杂、过多计算;我之前和一个(做后端的)朋友聊过,他也更建议把计算逻辑放在后端,另开一个线程去计算,这样的话,服务端也不浪费,前端也不必做一些类似的事情,请求来的数据直接渲染肯定是最快的,用户体验也是比较好的,假设有条件限制,这部分工作只能放在前端来做,那么我的建议就是还是使用web worker来做前端的多线程,把计算相关的部分放在web worker中完成。
个人经验有限,所以可能整理出的东西也不尽完整,有问题还请大家多多指出~