51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1932|回复: 0
打印 上一主题 下一主题

[转贴] 前端性能优化,我们可以做哪些?

[复制链接]
  • TA的每日心情
    无聊
    4 天前
  • 签到天数: 530 天

    连续签到: 2 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-12 15:27:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1、雪碧图技术

    这个很简单,把每个小图标都整合到一张大图上面,极大的减轻http请求数,同时能够让图片快速加载进来。

    考虑到当前的5g的发展前景,以后图片不会造成加载延迟的现象。

    2、浏览器渲染机制

    输入一个网址:我们得到服务端html文件。

    根据html文件,从头到尾的一个个的依次渲染页面渲染页面。

    但是遇到图片——不会等待图片的加载完毕,会直接渲染下面的标签。

    如果图片加载出来——根据图片选择,由于图片要占用空间,决定是否重新加载页面,这个概念叫reflow。(优化的方式——给图片宽高)。

    reflow和什么相关:占位面积、定位方式、边距。

    对于样式中的颜色变化,叫做repaint、这个就只需要把颜色改变。所以性能上来说,repaint稍微比reflow高点。

    repaint和什么相关:和颜色变化相关

    3、webpack、gulp等打包工具的使用

    压缩代码,减少了代码体积。

    可以把多个css文件,多个js文件,合并为一个css文件/js文件。

    合并文件,让我们减少了http请求数。

    4、避免页面跳转,也就是使用单页面应用的开发。

    每次页面跳转,就是一次html文件的下载过程。而这个过程,我们首先从服务端下载网页,再进行渲染,网页性能体验会很差。而单页面应用,它从一开始,就把完整的网页给加载到本地。

    5、延迟加载、懒加载技术

    什么是懒加载技术:

    原理:先将img标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再img标签的自定义属性中(比如data-src)。当js监听到该图片元素进入可视窗口时,即将自定义属性中的地址存储到src属性中,达到懒加载的效果。
    这样做能防止页面一次性向服务器响应大量请求导致服务器响应慢,页面卡顿或崩溃等问题。

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <title>懒加载技术</title>
    6.     <style>
    7.         li{
    8.             width: 300px;
    9.             height: 400px;
    10.         }
    11.         li img{
    12.             width: 100%;
    13.             height: 100%;
    14.         }
    15.     </style>
    16.     <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    17.     <script>
    18.         window.onload = function () {

    19.             var lazyLoad = (function () {
    20.                 var timer = 0;

    21.                 function init() {
    22.                     $(window).on('scroll',function () {
    23.                         timer && clearTimeout(timer);
    24.                         timer = setTimeout(function () {
    25.                             console.log('scroll')
    26.                             showImage();
    27.                         },200)
    28.                     });
    29.                     showImage();
    30.                 }

    31.                 function showImage() {
    32.                     $('img').each(function () {
    33.                         var current = $(this);
    34.                         if(current.attr('isLoaded')) return;
    35.                         shouldShow(current) && showImg(current);
    36.                     })
    37.                 }

    38.                 function shouldShow(node) {
    39.                     var scrollH = $(window).scrollTop(),
    40.                         winH = $(window).height(),
    41.                         top = node.offset().top;
    42.                     if(top < winH + scrollH){
    43.                         return true;
    44.                     }else{
    45.                         return false;
    46.                     }
    47.                 }

    48.                 function showImg(node) {
    49.                     node.attr('src',node.attr('data-src'));
    50.                     node.attr('isLoaded',true);
    51.                 }

    52.                 return {
    53.                     init: init
    54.                 }

    55.             })();

    56.             lazyLoad.init();
    57.         };
    58.     </script>

    59. </head>
    60. <body>
    61.     <ul>
    62.         <li>
    63.             <img
    64.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    65.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    66.                     alt=""
    67.             >
    68.         </li>
    69.         <li>
    70.             <img
    71.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    72.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    73.                     alt=""
    74.             >
    75.         </li>
    76.         <li>
    77.             <img
    78.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    79.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    80.                     alt=""
    81.             >
    82.         </li>
    83.         <li>
    84.             <img
    85.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    86.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    87.                     alt=""
    88.             >
    89.         </li>
    90.         <li>
    91.             <img
    92.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    93.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    94.                     alt=""
    95.             >
    96.         </li>
    97.         <li>
    98.             <img
    99.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    100.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    101.                     alt=""
    102.             >
    103.         </li>
    104.         <li>
    105.             <img
    106.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    107.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    108.                     alt=""
    109.             >
    110.         </li>
    111.         <li>
    112.             <img
    113.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    114.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    115.                     alt=""
    116.             >
    117.         </li>
    118.         <li>
    119.             <img
    120.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    121.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    122.                     alt=""
    123.             >
    124.         </li>
    125.         <li>
    126.             <img
    127.                     data-src="https://img11.360buyimg.com/babel/s700x360_jfs/t17803/198/955524217/34057/c1046b73/5ab469d6Nb7738eba.jpg!q90!cc_350x180"
    128.                     src="https://img10.360buyimg.com/babel/s340x420_jfs/t17560/109/1280106391/43247/e6499029/5ac48cf1N6ae7ba3a.jpg!q90!cc_340x420"
    129.                     alt=""
    130.             >
    131.         </li>
    132.     </ul>
    133. </body>
    134. </html>
    复制代码
    6、将css放在HEAD中

    如果将 CSS放在其他地方比如 BODY中,则浏览器有可能还未下载和解析到 CSS就已经开始渲染页面了,这就导致页面由无 CSS状态跳转到 CSS状态,用户体验比较糟糕。除此之外,有些浏览器会在 CSS下载完成后才开始渲染页面,如果 CSS放在靠下的位置则会导致浏览器将渲染时间推迟。

    7、Vue项目的按需加载

    vue中的懒加载是通过webpack的代码分割来实现的,下面是官网文档:https://router.vuejs.org/zh-cn/advanced/lazy-loading.html

    主要是在加载路由的时候,使用:
    const Main = r => require.ensure([], () => r(require(‘../views/main/Main’)))

    require.ensure就是webpack提供的异步加载的方式。

    8、关于React的性能优化

    react中,进行性能优化的核心就是shouldComponentDidMount周期函数。
    下面是我写的性能优化的博客:
    react性能优化

    9、设置合理的http缓存

    http请求中,我们可以合理的设置headers,就能达到缓存的目的。

    有两种常见的缓存,强制缓存和对比缓存:

    第一种:强制缓存。
    直接访问浏览器中的缓存数据,如果存在,则直接使用浏览器中的数据。如果不存在,则再向服务器发送请求,然后得到服务器的数据,再把这些数据存在浏览器中。
    第二种:对比缓存。
    首先,获取浏览器中的数据缓存标识,再获取服务器上面的数据缓存标识,如果相匹配,则直接从浏览器中获取数据,如果不匹配,则从服务器上获取数据。

    关于缓存标识,有两类标识:

    第一类:
    第一次请求,服务器会返回一个Last-Modified。
    下一次请求,浏览器会自动在headers中添加一条If-Modified-Since属性,记录的就是上一次数据发生修改的时间。

    第二类:
    第一次请求,服务端返回一个Etag资源唯一标识符。
    第二次请求,浏览器会自动携带一个If-None_Match标识符。

    应用程序缓存

    创建cache manifest文件,通过给html文件中的HTML标签添加一个manifest属性来实现的。
    1. <span class="hljs-doctype" style="box-sizing: border-box; outline: 0px;"><!DOCTYPE HTML></span>
    复制代码



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-25 03:12 , Processed in 0.069907 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表