2021-08-17

文章参考

一、资源压缩合并,减少HTTP请求

二、非核心代码异步加载(异步加载的方式)

1、动态脚本加载

2、defer

3、async

4、defer和async的区别

三、利用浏览器缓存

四、使用CDN

五、DNS预解析

一、资源压缩合并,减少HTTP请求

合并图片(css sprites)、CSS和JS文件合并、CSS和JS文件压缩

图片较多的页面也可以使用 lazyLoad 等技术进行优化。

精灵图等

二、非核心代码异步加载(异步加载的方式)

1、动态脚本加载

使用document.createElement创建一个script标签,即document.createElement('script'),然后把这个标签加载到body上面去。参考链接

举例:

                function asyncLoaded(url, callBack) {

        var script = document.createElement('script');

        script.type = 'text/javascript';

        if (script.readystate) {//兼容IE

            script.onreadystatechange = function () {//状态改变触发事件

                if (script.readyState == 'loaded' || script.readyState == 'complete') {

                    callBack();

                    script.onreadystatechange = null;

                }

            }

        } else {

            script.onload = function (e) {

                callBack();

            }

        }

        script.src = url;

        document.body.appendChild(script);

    }


2、defer

异步加载,但要等到dom文档全部解析完才会被执行。只有IE能用。

举例:

<script type="text/javascript" defer="defer">

// do something

</script>

//或者

<script src="./defer1.js" defer></script>


3、async

异步加载,加载完就执行,async只能加载外部脚本,不能把js写在script 标签里。此为H5新特性

举例:

                <script type="text/javascript" src="demo.js" async="async"></script>


有多种执行外部脚本的方法:

• 如果 async = "async":脚本相对于页面的其余部分异步地执行(当页面继续进行解析时,脚本将被执行)

• 如果不使用 async 且 defer = "defer":脚本将在页面完成解析时执行

• 如果既不使用 async 也不使用 defer:在浏览器继续解析页面之前,立即读取并执行脚本

4、defer和async的区别

defer:在HTML解析完之后才会执行。如果是多个,则按照加载的顺序依次执行。

async:在加载完之后立即执行。如果是多个,执行顺序和加载顺序无关。

举例:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>Document</title>

    <!--通过异步的方式引入两个外部的js文件-->

    <script src="./defer1.js" defer></script>

    <script src="./defer2.js" defer></script>

</head>

<body>

<script>

    console.log('同步任务');

</script>

</body>

</html>


上方打印结果:


同步任务

defer1

defer2


因为defer的加载是有顺序的,所以两个引入defer文件按顺序执行。如果把引入的文件改为async的方式加载,打印的结果可能是:

同步任务

async2

async1


三、利用浏览器缓存

缓存:资源文件(比如图片)在本地存有副本,浏览器下次请求的时候,可能直接从本地磁盘里读取,而不会重新请求图片的url。

缓存分为:

强缓存:不用请求服务器,直接使用本地的缓存

强缓存是利用 http 响应头中的Expires或Cache-Control实现的。

浏览器第一次请求一个资源时,服务器在返回该资源的同时,会把上面这两个属性放在response header中。比如:

need-to-insert-img

注意:这两个response header属性可以只启用一个,也可以同时启用。当response header中,Expires 和 Cache-Control 同时存在时,

Cache-Control 的优先级高于 Expires。

Expires和Cache-Control 的区别:

Expires:服务器返回的绝对时间。

是较老的强缓存管理 response header。浏览器再次请求这个资源时,先从缓存中寻找,找到这个资源后,拿出它的Expires跟当前的请求时间比较,如果请求时间在Expires的时间之前,就能命中缓存,否则就不行。

如果缓存没有命中,浏览器直接从服务器请求资源时,Expires Header在重新请求的时候会被更新。

缺点:

由于Expires是服务器返回的一个绝对时间,存在的问题是:服务器的事件和客户端的事件可能不一致。在服务器时间与客户端时间相差较大时,缓存管理容易出现问题,比如随意修改客户端时间,就能影响缓存命中的结果。

Cache-Control:服务器返回的相对时间。

http1.1中新增的 response header。浏览器第一次请求资源之后,在接下来的相对时间之内,都可以利用本地缓存。超出这个时间之后,则不能命中缓存。重新请求时,Cache-Control会被更新。

协商缓存:浏览器发现本地有资源的副本,但是不太确定要不要使用,于是去问问服务器。

当浏览器对某个资源的请求没有命中强缓存(也就是说超出时间了),就会发一个请求到服务器,验证协商缓存是否命中。

协商缓存是利用的是两对Header:

第一对:Last-Modified、If-Modified-Since

第二对:ETag、If-None-Match

①、Last-Modified、If-Modified-Since。过程如下:

(1) 浏览器第一次请求一个资源,服务器在返回这个资源的同时,会加上Last-Modified这个 response header,这个header表示这该资源在服务器上的最后修改时间:

need-to-insert-img

(2) 浏览器再次请求这个资源时,会加上If-Modified-Since这个 request header,这个header的值就是上一次返回的Last-Modified 的值:

need-to-insert-img

(3) 服务器收到第二次请求时,会比对浏览器传过来的If-Modified-Since和资源在服务器上的最后修改时间Last-Modified,判断资源是否有变化。如果没有变化则返回304 Not Modified,但不返回资源内容(此时,服务器不会返回 Last-Modified 这个 response header);如果有变化,就正常返回资源内容(继续重复整个流程)。这是服务器返回304时的response header:

need-to-insert-img

(4) 浏览器如果收到304的响应,就会从缓存中加载资源。

缺点:

Last-Modified、If-Modified-Since一般来说都是非常可靠的,但有可能出现的问题是:服务器上的资源变化了,但是最后的修改时间却没有变化。这一对header就无法解决这种情况。

②、ETag、If-None-Match。过程如下:

(1) 浏览器第一次请求一个资源,服务器在返回这个资源的同时,会加上ETag这个 response header,这个header是服务器根据当前请求的资源生成的唯一标识。这个唯一标识是一个字符串,只要资源有变化这个串就不同,跟最后修改时间无关,所以也就很好地补充了Last-Modified的不足。如下:

need-to-insert-img

(2) 浏览器再次请求这个资源时,会加上If-None-Match这个 request header,这个header的值就是上一次返回的ETag的值:

need-to-insert-img

(3) 服务器第二次请求时,会对比浏览器传过来的If-None-Match和服务器重新生成的一个新的ETag,判断资源是否有变化。如果没有变化则返回304 Not Modified,但不返回资源内容(此时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag并无变化)。如果有变化,就正常返回资源内容(继续重复整个流程)。这是服务器返回304时的response header:

need-to-insert-img

(4) 浏览器如果收到304的响应,就会从缓存中加载资源。参考链接

四、使用CDN

怎么最快地让用户请求资源。一方面是让资源在传输的过程中变小 (例如方式一) ,另外就是CDN。

要注意,浏览器第一次打开页面的时候,浏览器缓存是起不了作任何用的,使用CDN,效果就很明显。

五、DNS预解析

通过 DNS 预解析来告诉浏览器未来我们可能从某个特定的 URL 获取资源,当浏览器真正使用到该域中的某个资源时就可以尽快地完成 DNS 解析。

①、打开或关闭DNS预解析

通过在服务器端发送 X-DNS-Prefetch-Control 报头。或是在文档中使用值为 http-equiv 的meta标签:

                <meta http-equiv="x-dns-prefetch-control" content="on">


需要说明的是,在一些高级浏览器中,页面中所有的超链接(<a>标签),默认打开了DNS预解析。但是,如果页面中采用的https协议,很多浏览器是默认关闭了超链接的DNS预解析。如果加了上面这行代码,则表明强制打开浏览器的预解析。

②、对指定的域名进行DNS预解析

如果我们将来可能从 smyhvae.com 获取图片或音频资源,那么可以在文档顶部的 标签中加入以下内容:

                <link rel="dns-prefetch" href="http://www.smyhvae.com/">


当我们从该 URL 请求一个资源时,就不再需要等待 DNS 解析的过程。该技术对使用第三方资源特别有用。

DNS预解析详解

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

推荐阅读更多精彩内容