金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > web前端 > 网页性能提升指南,你应该知道的

网页性能提升指南,你应该知道的

发布时间:2019-11-03 17:41编辑:web前端浏览(184)

    你应该知道的 setTimeout 秘密

    2017/01/11 · JavaScript · 4 评论 · Javascript, settimeout

    本文作者: 伯乐在线 - TGCode 。未经作者许可,禁止转载!
    欢迎加入伯乐在线 专栏作者。

    计时器setTimeout是我们经常会用到的,它用于在指定的毫秒数后调用函数或计算表达式。

    语法:

    setTimeout(code, millisec, args);

    1
    setTimeout(code, millisec, args);

    注意:如果code为字符串,相当于执行eval()方法来执行code。

    当然,这一篇文章并不仅仅告诉你怎么用setTimeout,而且理解其是如何执行的。

    1、setTimeout原理

    先来看一段代码:

    var start = new Date();   var end = 0;   setTimeout(function() {      console.log(new Date() - start);   },  500);   while (new Date() - start <= 1000) {}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var start = new Date();  
     
    var end = 0;  
     
    setTimeout(function() {   
     
      console.log(new Date() - start);  
     
    },  500);  
     
    while (new Date() - start <= 1000) {}

    在上面的代码中,定义了一个setTimeout定时器,延时时间是500毫秒。

    你是不是觉得打印结果是: 500

    可事实却是出乎你的意料,打印结果是这样的(也许你打印出来会不一样,但肯定会大于1000毫秒):

    图片 1

    这是为毛呢?

    究其原因,这是因为 JavaScript是单线程执行的。也就是说,在任何时间点,有且只有一个线程在运行JavaScript程序,无法同一时候运行多段代码。

    再来看看浏览器下的JavaScript。

    浏览器的内核是多线程的,它们在内核控制下相互配合以保持同步,一个浏览器至少实现三个常驻线程:JavaScript引擎线程GUI渲染线程浏览器事件触发线程

    • JavaScript引擎是基于事件驱动单线程执行的,JavaScript引擎一直等待着任务队列中任务的到来,然后加以处理,浏览器无论什么时候都只有一个JavaScript线程在运行JavaScript程序。
    • GUI渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操作引发回流(Reflow)时,该线程就会执行。但需要注意,GUI渲染线程与JavaScript引擎是互斥的,当JavaScript引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JavaScript引擎空闲时立即被执行。
    • 事件触发线程,当一个事件被触发时,该线程会把事件添加到待处理队列的队尾,等待JavaScript引擎的处理。这些事件可来自JavaScript引擎当前执行的代码块如setTimeout、也可来自浏览器内核的其他线程如鼠标点击、Ajax异步请求等,但由于JavaScript的单线程关系,所有这些事件都得排队等待JavaScript引擎处理(当线程中没有执行任何同步代码的前提下才会执行异步代码)。

    到这里,我们再来回顾一下最初的例子:

    var start = new Date();   var end = 0;   setTimeout(function() {      console.log(new Date() - start);   },  500);   while (new Date() - start <= 1000) {}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var start = new Date();  
     
    var end = 0;  
     
    setTimeout(function() {   
     
      console.log(new Date() - start);  
     
    },  500);  
     
    while (new Date() - start <= 1000) {}

    虽然setTimeout的延时时间是500毫秒,可是由于while循环的存在,只有当间隔时间大于1000毫秒时,才会跳出while循环,也就是说,在1000毫秒之前,while循环都在占据着JavaScript线程。也就是说,只有等待跳出while后,线程才会空闲下来,才会去执行之前定义的setTimeout

    最后 ,我们可以总结出,setTimeout只能保证在指定的时间后将任务(需要执行的函数)插入任务队列中等候,但是不保证这个任务在什么时候执行。一旦执行javascript的线程空闲出来,自行从队列中取出任务然后执行它。

    因为javascript线程并没有因为什么耗时操作而阻塞,所以可以很快地取出排队队列中的任务然后执行它,也是这种队列机制,给我们制造一个异步执行的假象。

    2、setTimeout的好搭档“0”

    也许你见过下面这一段代码:

    setTimeout(function(){   // statement }, 0);

    1
    2
    3
    4
    5
    setTimeout(function(){
     
      // statement
     
    }, 0);

    上面的代码表示立即执行。

    本意是立刻执行调用函数,但事实上,上面的代码并不是立即执行的,这是因为setTimeout有一个最小执行时间,当指定的时间小于该时间时,浏览器会用最小允许的时间作为setTimeout的时间间隔,也就是说即使我们把setTimeout的延迟时间设置为0,被调用的程序也没有马上启动。

    不同的浏览器实际情况不同,IE8和更早的IE的时间精确度是15.6ms。不过,随着HTML5的出现,在高级版本的浏览器(Chrome、ie9+等),定义的最小时间间隔是不得低于4毫秒,如果低于这个值,就会自动增加,并且在2010年及之后发布的浏览器中采取一致。

    所以说,当我们写为 setTimeout(fn,0) 的时候,实际是实现插队操作,要求浏览器“尽可能快”的进行回调,但是实际能多快就完全取决于浏览器了。

    setTimeout(fn, 0)有什么用处呢?其实用处就在于我们可以改变任务的执行顺序!因为浏览器会在执行完当前任务队列中的任务,再执行setTimeout队列中积累的的任务。

    通过设置任务在延迟到0s后执行,就能改变任务执行的先后顺序,延迟该任务发生,使之异步执行。

    来看一个网上很流行的例子:

    document.querySelector('#one input').onkeydown = function() {      document.querySelector('#one span').innerHTML = this.value;    };    document.querySelector('#second input').onkeydown = function() {      setTimeout(function() {        document.querySelector('#second span').innerHTML = document.querySelector('#second input').value;   }, 0); };

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    document.querySelector('#one input').onkeydown = function() {   
     
      document.querySelector('#one span').innerHTML = this.value;   
     
    };   
     
    document.querySelector('#second input').onkeydown = function() {   
     
      setTimeout(function() {   
     
        document.querySelector('#second span').innerHTML = document.querySelector('#second input').value;   }, 0);
     
    };

    实例:实例

    当你往两个表单输入内容时,你会发现未使用setTimeout函数的只会获取到输入前的内容,而使用setTimeout函数的则会获取到输入的内容。

    这是为什么呢?

    因为当按下按键的时候,JavaScript 引擎需要执行 keydown 的事件处理程序,然后更新文本框的 value 值,这两个任务也需要按顺序来,事件处理程序执行时,更新 value值(是在keypress后)的任务则进入队列等待,所以我们在 keydown 的事件处理程序里是无法得到更新后的value的,而利用 setTimeout(fn, 0),我们把取 value 的操作放入队列,放在更新 value 值以后,这样便可获取出文本框的值。

    未使用setTimeout函数,执行顺序是:onkeydown => onkeypress => onkeyup

    使用setTimeout函数,执行顺序是:onkeydown => onkeypress => function => onkeyup

    虽然我们可以使用keyup来替代keydown,不过有一些问题,那就是长按时,keyup并不会触发。

    长按时,keydown、keypress、keyup的调用顺序:

    keydown keypress keydown keypress ... keyup

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    keydown
     
    keypress
     
    keydown
     
    keypress
     
    ...
     
    keyup

    也就是说keyup只会触发一次,所以你无法用keyup来实时获取值。

    我们还可以用setImmediate()来替代setTimeout(fn,0)

    if (!window.setImmediate) {      window.setImmediate = function(func, args){        return window.setTimeout(func, 0, args);      };      window.clearImmediate = window.clearTimeout;   }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (!window.setImmediate) {   
     
      window.setImmediate = function(func, args){   
     
        return window.setTimeout(func, 0, args);   
     
      };   
     
      window.clearImmediate = window.clearTimeout;  
     
    }

    setImmediate()方法用来把一些需要长时间运行的操作放在一个回调函数里,在浏览器完成后面的其他语句后,就立刻执行这个回调函数,必选的第一个参数func,表示将要执行的回调函数,它并不需要时间参数。

    注意:目前只有IE10支持此方法,当然,在Nodejs中也可以调用此方法。

    3、setTimeout的一些秘密

    3.1 setTimeout中回调函数的this

    由于setTimeout()方法是浏览器 window 对象提供的,因此第一个参数函数中的this其实是指向window对象,这跟变量的作用域有关。

    看个例子:

    var a = 1;    var obj = {      a: 2,      test: function() {        setTimeout(function(){          console.log(this.a);        }, 0);      }    };    obj.test();  //  1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    var a = 1;   
     
    var obj = {   
     
      a: 2,   
     
      test: function() {   
     
        setTimeout(function(){   
     
          console.log(this.a);   
     
        }, 0);   
     
      }   
     
    };   
     
    obj.test();  //  1

    不过我们可以通过使用bind()方法来改变setTimeout回调函数里的this

    var a = 1;    var obj = {      a: 2,      test: function() {        setTimeout(function(){          console.log(this.a);        }.bind(this), 0);      }    };    obj.test();  //  2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    var a = 1;   
     
    var obj = {   
     
      a: 2,   
     
      test: function() {   
     
        setTimeout(function(){   
     
          console.log(this.a);   
     
        }.bind(this), 0);   
     
      }   
     
    };   
     
    obj.test();  //  2

    相关文章:JS中的call、apply、bind方法

    3.2 setTimeout不止两个参数

    我们都知道,setTimeout的第一个参数是要执行的回调函数,第二个参数是延迟时间(如果省略,会由浏览器自动设置。在IE,FireFox中,第一次配可能给个很大的数字,100ms上下,往后会缩小到最小时间间隔,Safari,chrome,opera则多为10ms上下。)

    其实,setTimeout可以传入第三个参数、第四个参数….,它们表示神马呢?其实是用来表示第一个参数(回调函数)传入的参数。

    setTimeout(function(a, b){      console.log(a);   // 3   console.log(b);   // 4 },0, 3, 4);

    1
    2
    3
    4
    5
    6
    7
    setTimeout(function(a, b){   
     
      console.log(a);   // 3
     
      console.log(b);   // 4
     
    },0, 3, 4);

    如果你有疑问或建议,欢迎在下面的评论区评论!

    打赏支持我写出更多好文章,谢谢!

    打赏作者

    2017前端性能优化清单

    2017/04/10 · 基础技术 · 性能

    原文出处: Xsu Edwan   

    你开始使用渐进启动了么?是不是已经使用过React和Angular中tree-shakingcode-splitting两个工具?有没有用过Brotli、Zofli和HPACK这几种压缩技术,或者OCSP协议(在线证书状态协议)?知不知道资源提醒,客户端提醒和CSS containment一类的技术?了解IPv6,HTTP/2和Service Worker这些协议吗?

    回想那些年,大家往往在完成了产品之后才会去考虑性能。常常把与性能相关的事情拖到项目的最后来做,所做的也不过是对服务器上的config文件进行一些微调、串联、优化以及部分特别小的调整。而现在,技术已经有了翻天覆地的变化。

    一个项目的性能是非常重要的,除了要在技术层面上注意,更要在项目的设计之初就开始考虑,这样才可以使性能的各种隐形需求完美的整合到项目中,随着项目一起推进。性能最好具有可量化、可监测以及可改动的特性。网络越来越复杂,对网络的监控也变得越来越难,因为监测的过程会受到包括设备、浏览器、协议、网络类型以及其他技术(CDN,ISP,缓存,代理服务器,防火墙,负载均衡器和服务器对性能的影响都很大)的很大影响。

    下文是一份2017年的前端性能优化清单,阐述了作为前端开发人员,为了确保反馈速度以及浏览器兼容性我们需要考虑的问题。

    (你也可以下载checklist PDF或者check in Apple Pages。优化万岁!)

    Web 的现状:网页性能提升指南

    2017/09/21 · 基础技术 · 性能

    原文出处: Karolina Szczur   译文出处:碧青_Kwok   

    互联网发展非常迅速,所以我们创造了Web平台。通常我们会忽视连通性等问题,但用户们却不会视而不见。一瞥万维网的现状,可以发现我们并没有用同情心、变通意识去构建它,更不要说性能了。

    所以,今天的Web是什么状态呢?

    在这个星球上的74亿人中,只有46%可以上网。平均网络速度上限为7Mb/s。更重要的是,有93%的互联网用户正在通过移动设备进行访问——若不适配移动设备将引起用户反感。通常情况下,数据比我们假设的更昂贵——可能需要1到13小时才能购买500MB的数据包(德国 vs. 巴西;更有趣的统计数据参见 Ben Schwarz 的 Beyond the Bubble: The Real World Performance)。

    我们的网站也不是完美的——平均网站是原始Doom游戏的大小(约3 MB)(请注意,为了统计准确,应使用中位数,阅读 Ilya Grigorik 的优秀“平均页面”是一个神话,中档网站大小目前为1.4MB)。图像可以轻松占用1.7 MB的带宽,而JavaScript平均值也有400KB的体积。这不仅是Web平台的问题,原生应用程序可能更糟,还记得为了获取错误修复版本,而下载200MB安装包的情景吗?

    技术人员经常会发现自己处于特权状态。随着最新的高端笔记本电脑、手机和快速有线互联网连接,很容易让我们忘记,这些并不是每个人都有的条件(实际上,真的很少)。

    如果我们从特权和缺乏同情的角度来构建网络平台,那么将导致排他性的糟糕体验。

    考虑到设计和开发的性能,我们怎样才能做得更好?


    打赏支持我写出更多好文章,谢谢!

    任选一种支付方式

    图片 2 图片 3

    3 赞 14 收藏 4 评论

    正文

    微优化是保持性能最好的办法,但是又不能有太过明确的优化目标,因为过于明确的目标会影响在项目中做的每一个决定。以下是一些不同的模型,请按照自己舒服的顺序阅读。

    优化所有资源

    理解浏览器如何分析和处理资源,是显著提高性能的最强大但未充分利用的方式之一。事实证明,浏览器在嗅探资源方面非常出色,同时解析并确定其优先级。这里是关键请求的来源。

    如果请求中包含用户视口中呈现内容所必需的资源,则该请求至关重要。

    对于大多数网站,它将是HTML、必要的CSS、logo、网络字体,也可能是图片。在许多情况下,几十个其他不相关的资源(JavaScript、跟踪代码、广告等)影响了关键请求。幸运的是,我们能够通过仔细挑选重要资源并调整优先级来控制这种行为。

    通过``我们可以手动强制调高资源的优先级,确保所需的内容按时呈现。这种技术可以显著改善“交互时间”指标,从而使最佳的用户体验成为可能。

    图片 4

    关键请求对许多人来说,似乎仍然是一个黑匣子,可共享资料的缺乏并不能改变现状。幸运的是,Ben Schwarz
    发表了关于这个问题的非常全面并平易近人的文章——关键请求。另外,请参阅Addy的文章,在Chrome中的预加载、预取和优先级(Preload, Prefetch and Priorities in Chrome)。

    图片 5

    [在Chrome开发人员工具中启用优先级]

    要跟踪在请求优先级处理方面的情况,请使用Lighthouse性能工具和关键请求链审核工具,或查看Chrome开发人员工具中“网络”选项卡下的请求优先级。

    关于作者:TGCode

    图片 6

    路途虽远,无所畏 个人主页 · 我的文章 · 9 ·    

    图片 7

    请准备好然后定下目标!

    通用性能清单

    1. 积极地缓存
    2. 启用压缩
    3. 优化关键资源的优先级
    4. 使用CDN(Content Delivery Networks)

    1. 比你最强的竞争对手快20%

    根据一个心理学研究,你的网站最少在速度上比别人快20%,才能让用户感觉到你的网站比别人的更快。这个速度说的不是整个页面的加载时间,而是开始加载渲染的时间,首次有效渲染时间(例如页面需要加载主要内容的时间),或者交互时间(指的是页面或者应用中主要的页面加载完成,并主备好与用户进行交互的时间)。

    在Moto G(或中端三星设备)和Nexus 4(比较主流的设备)上衡量开始渲染时间(用WebPagetest)以及首页有效渲染时间(用Lighthouse),最好是在一个开放的实验室中,使用规范的3G,4G和Wi-Fi链接。

    图片 8
    Lighthouse,一个Google开发的新的性能审查工具

    你可以通过你的分析报告看看你的用户处在哪个阶段,选取其中前90%的用户体验来做测试。接着收集数据,建一个表格,筛去20%的数据并预设一个目标(如:性能预算)。现在你可以将上述两个值进行对比检测。如果你始终维持着你的目标并且通过一点一点改变脚本去加快交互时间,那么上述方法就是合理可行的。

    图片 9
    由Brad Frost创建的性能分析

    和你的同事分享这份清单。首先要确保团队中的每个人都熟悉这份清单。项目中每一个决定都会影响性能,如果前端工程师们都在积极的参与项目概念,UX以及视觉设计的决定,这将会给整个项目带来巨大收益。地图设计的决定违背了性能理念,所以他在这份清单内的顺序有待考虑。

    图片优化

    图片通常占网页传输的大部分有效载荷,因此图片优化可以带来最大的性能提升。有许多现有的策略和工具可以帮助我们删除额外的字节,但是首先应考虑的问题是:“图片对于我想传达的信息和效果至关重要吗?”。如果可以消除它,不仅可以节省带宽,而且还节省了请求。

    在某些情况下,可以通过不同的技术实现类似的结果。比如CSS就具有艺术方向的一系列属性,例如阴影、渐变、动画及形状,允许我们构造适当风格的DOM元素。

    2. 反应时间为100毫秒,帧数是每秒60帧

    RAIL性能模型会为你提供一个优秀的目标,既尽最大的努力在用户初始操作后的100毫秒内提供反馈。为了达到这个目标,页面需要放弃权限,并将权限在50毫秒内交回给主线程。对于像动画一样的高压点,最好的方法就是什么都不做,因为你永远无法达到最小绝对值。
    同理,动画的每一帧都需要在16毫秒内完成,这样才能保证每秒60帧(一秒/60=16.6毫秒),如果可以的话最好能在10毫秒内完成。因为浏览器需要一定的时间去在屏幕上渲染新的帧,而且你的代码需要在16.6毫秒内完成执行。要注意,上述目标应用于衡量项目的运行性能,而非加载性能。

    选择正确的格式

    如果不能舍弃图片,确定哪种格式更合适就很重要了。首先要在矢量和光栅图形之间做出选择:

    • 矢量图形:分辨率独立,通常体积更小。非常适合logo、icon和简单的图形,包括基本形状(线,多边形,圆和点)。
    • 光栅图形:呈现更详细的信息,比较适合相片。

    做出首个决定后,可以选择以下几种格式:JPEG、GIF、PNG–8、PNG–24,或最新的 WEBP 与 JPEG-XR 格式。有了这么多的选项,如何确保我们做出正确的选择?以下是找出最佳格式的基本方法:

    • JPEG:颜色非常丰富的图片(例如照片)
    • PNG–8:色彩相对单一的图片
    • PNG–24:局部透明的图片
    • GIF:动图

    Photoshop可以通过各种设置,例如降低质量、降低噪音或色彩数量来优化以上每一种格式。确保设计师了解上述性能实践,并能够使用正确的方式优化相应格式的图片。如果您想了解更多如何处理图片,请阅读 Lara Hogan 的好文 Designing for Performance。

    3. 首次有效渲染时间要低于1.25秒,速度指数要低于1000

    纵使这个目标实现起来非常困难,你的最终目标也应该是让开始渲染时间低于1秒且速度指数低于1000(在网速快的地方)。对于首次有效渲染时间,上限最好是1250毫秒。对于移动端,3G下移动设备首次渲染时间低于3秒都是可以接受的。稍微高一点也没关系,但千万别高太多。

    试用新格式

    图像格式有几个较新的玩家,即WebP、JPEG 2000 和 JPEG-XR。它们都是由浏览器厂商开发的:Google 的 WebP,Apple 的 JPEG 2000 和 Microsoft 的 JPEG-XR。

    WebP 是最受欢迎的竞争者,支持无损和有损压缩,这使得它非常灵活。无损的 WebP 比 PNG 小26%,比 JPG 小25-34%。WebP 有着74%的浏览器支持,它可以安全地进行降级,最多可节省1/3的传输字节。JPG 和 PNG 可以在 Photoshop 和其他图像处理应用程序以及命令行界面(brew install webp)中转换为WebP。

    如果你想探索其他格式之间的视觉差异,推荐 Github 上这个很赞的 Demo。

    定义你所需要的环境

    用工具和算法进行优化

    即使使用了高效的图像格式,也不应跳过后处理优化。这一步很重要。

    如果您选择了尺寸相对较小的 SVG,它们也是可以再次压缩的。SVGO 是一个命令行工具,可以通过剥离不必要的元数据来快速优化 SVG。另外,如果您喜欢Web界面或受操作系统的限制,请使用 Jake Archibald 的 SVGOMG。因为 SVG 是基于 XML 的格式,它也可以在服务器端进行 GZIP 压缩。

    ImageOptim 是大多其他图像类型的最好选择。包括 pngcrush、pngquant、MozJPEG、Google Zopfli等,它在一个全面的开源包中捆绑了一大堆优秀的工具。ImageOptim 可以以 Mac OS 应用程序、命令行界面和 Sketch 插件形式,轻松地实现到现有的工作流程中。对于那些在 Linux 或 Windows 上的场景,大多数 ImageOptim 的 CLI 都可以在您的平台上使用。

    如果您倾向于尝试新兴的编码器,Google 今年早些时候发布了 Guetzli——源自 WebP 和 Zopfli 的开源算法。Guetzli 可以比任何其他可用的压缩方法生成35%更小体积的 JPEG。唯一的缺点是:处理时间慢(CPU 每处理百万像素需要1分钟)。

    选择工具时,请确保它们生成所需的结果并适应团队的工作流程。理想情况是,将优化过程自动化,这样就不会产生漏掉的情况。

    4. 选择和安装你的开发环境

    不要过多的关注当下最流行的工具,坚持选择适合自己开发环境的工具,例如Grunt、Gulp、Webpack、PostCSS,或者组合起来的工具。只要这个工具运行的速度够快,而且没有给你的维护带来太大问题,这就够了。

    响应式图片

    十年前,我们使用一种分辨率,就可以为所有人服务,但时代变化太快,现今的响应式 Web 已非往日可比。这也是为什么我们必须要特别留心,去精心优化视觉资源,确保它们适应各种视口设备。幸运的是,感谢 Responsive Images 社区小组,我们可以完美使用 picture 元素和 srcset 属性(二者都有85%+支持率)。

    5. 渐进增强(progressive enhancement)

    在构建前端结构的时候,应始终将渐进增强作为你的指导原则。首先设计并且构建核心体验,随后再完善那些为高性能浏览器设计的高级特性的相关体验,创建弹性体验。如果你的网页可以在使用低速网络、老旧显示器的很慢的电脑上运行飞快,那么在光纤高配电脑上它只会运行的更快。

    srcset 属性

    srcset在分辨率切换方案中效果最佳——即当我们需要根据用户的屏幕密度和大小显示图像时。基于srcsetsize属性中的一组预定义规则,浏览器将选择最佳图片,相应地提供给视口。这项技术可以带来很大的带宽和请求节省,特别是对于移动用户。
    图片 10
    [srcset 使用示例]

    6. Angular,React,Ember等

    最好使用那些支持服务器端渲染的框架。在使用某个框架钱,先记录服务器和客户端的引导时间,记得要在移动设备上测试,最终才能使用某个框架(因为面对的是性能问题,如果在使用某个框架后,再做修改是非常困难的)。如果你使用JavaScript框架,要保证你的选择是被广泛使用并且经过考验的。不同框架对性能有着不同程度的影响,同时对应着不同的优化策略,所以最好可以清楚的了解你要用的框架的每个方面。在写网页应用时可以先看看PRPL pattern和application shell architecture。

    图片 11
    本图描述了PRPL pattern

    图片 12
    上图是application shell,是一个小型的、由HTML,CSS和JavaScript构成的用户界面

    picture 元素

    picture元素和media属性旨在使艺术设计变得容易。通过为不同情形提供不同图片(通过媒体查询进行测试),无论什么分辨率,我们都能始终将图像中最重要的元素保持在焦点。
    图片 13
    [picture 元素使用示例]

    请务必阅读 Jason Grigsby 的 Responsive Images 101指南,以便对这两种方法进行彻底的阐述。

    7. AMP还是Instant Articles?

    根据你整体组织结构的优先顺序和策略,你可以考虑使用Google的AMP或Facebook的Instant Articles。要知道没有这些你也可以达到不错的性能,但是AMP可以提供一个性能不错的免费的内容分发网络框架(CDN),Instant Articles可以在Facebook上促进你的性能。你也可以建立progressive web AMP。

    使用图片 CDN 进行分发

    视觉优化的最后一步是分发。所有资源都可以从使用 内容分发网络 中受益,但还有一些针对图片优化的特定工具,例如 Cloudinary 和 imgx。使用这些服务的好处远远超过了减少服务器上的流量,并显着降低了响应延迟。

    CDN可以很好的解决重图片网站的复杂度,包括响应式服务与图片优化。虽然产品不同(价格也是如此),但是大多数方案都是根据设备和浏览器,调整大小、裁剪来确定哪种格式最适合用户。甚至更多——它们可以压缩、检测像素密度、水印、识别面部,并允许后置处理能力。借助这些强大的功能,和将参数附加到URL的能力,以用户为中心的图片服务变得十分容易。

    8. 选择适合你的CDN

    根据你的动态数据量,可以将一部分内容外包给静态网站生成工具,将它置于CDN上,从中生成一个静态版本,从而避免那些数据库的请求。也可以选择基于CDN的静态主机平台,通过交互组件丰富你的页面(JAMStack)。

    注意CDN是否可以很好的处理(或分流)动态内容。没必要单纯的将你的CDN限制为静态。反复检查CDN是否执行了内容的压缩和转化,检查智能HTTP/2传输和缓存服务器(ESI),注意哪些静态或动态的部分处在CDN的边缘(最接近用户的服务器)。

    图像性能清单

    1. 选择正确的图片格式
    2. 尽可能使用矢量图形
    3. 如果变化不明显,则降低图片质量
    4. 使用新格式图片
    5. 使用工具与算法优化
    6. 学习srcsetpicture
    7. 使用图片 CDN

    开始优化

    Web 字体优化

    自定义字体是一项非常强大的设计工具。但是能力伴随着很多责任。现有68%的网站在使用 Web字体,这种类型的资源是性能杀手之一(平均轻松可达100KB,取决于变体和字体的数量)。

    即使体积不是最大的问题,不可见文本闪动(FOIT)也算是。当Web字体加载中或加载失败时,会发生FOIT,这会让空白页面,从而导致内容无法访问。首先仔细检查我们是否需要Web字体可能是值得的。如果真是这样,有一些策略可以帮助我们减轻对业务的负面影响。

    9. 直接确定优化顺序

    首先应该弄清楚你想解决的问题是什么。检查一遍你所有的文件(JavaScript,图片,字体,第三方script文件以及页面中重要的模块,例如轮播,复杂信息图标和多媒体内容),并将他们分类。
    列一个表格。明确浏览器上应该有的基础核心内容,哪些部分属于为高性能浏览器设计的升级体验,哪些是附加内容(那些不必要或者可以被延时加载的部分,例如字体,不必要的样式,轮播组件,播放器,社交网站入口,很大的图片)。更详细的细节请参考文章”Improving Smashing Magazine’s Performance‘’。

    选择正确的格式

    有4种网络字体格式:EOT、TTF、WOFF 和最近的 WOFF2。TTF 和 WOFF 被广泛使用,拥有超过90%的浏览器支持率。根据支持情况,最有可能安全地使用WOFF2,并在旧版浏览器降级使用 WOFF。使用WOFF2的优点是,一套定制的预处理和压缩算法(如Brotli),并有大约30%的文件大小减少和改进的解析能力。

    @font-face中定义网页字体的来源时,请使用format()提示来指定应使用哪种格式。

    如果您使用 Google Fonts 或 Typekit 来提供字体,这两种工具都实施了一些策略来优化其性能。Typekit 现在可以异步地为所有套件提供服务,防止 FOIT 以及允许其JavaScript套件代码的10天延长缓存期限(而不是默认10分钟)。Google Fonts 可以根据用户设备自动提供最小的文件。

    本文由金沙国际官网发布于web前端,转载请注明出处:网页性能提升指南,你应该知道的

    关键词: