127.0.0.1:9200
URL: http://127.0.0.1:9200/likecs_art_db/_search
REQUEST:
Array
(
    [query] => Array
        (
            [match] => Array
                (
                    [text] => Array
                        (
                            [query] => 异步加载script标签中defer和async属性的区别
                        )

                )

        )

    [highlight] => Array
        (
            [fields] => Array
                (
                    [text] => stdClass Object
                        (
                        )

                )

            [pre_tags] => #em#
            [post_tags] => #/em#
        )

    [size] => 8
    [from] => 0
)
RESPONSE:
string(8046) "{"took":64,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":10000,"relation":"gte"},"max_score":69.65188,"hits":[{"_index":"likecs_art_db","_type":"_doc","_id":"29310","_score":69.65188,"_source":{"id":"29310","text":"\u5f02\u6b65\u52a0\u8f7dscript\u6807\u7b7e\u4e2ddefer\u548casync\u5c5e\u6027\u7684\u533a\u522b","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n    color: [\r\n        ","username":"soyxiaobi","tagsname":"","tagsid":"[]","catesname":"JS\/ES6","catesid":"[\"4311\"]","createtime":"1534937493"},"highlight":{"text":["#em#异#/em##em#步#/em##em#加#/em##em#载#/em##em#script#/em##em#标#/em##em#签#/em##em#中#/em##em#defer#/em##em#和#/em##em#async#/em##em#属#/em##em#性#/em##em#的#/em##em#区#/em##em#别#/em#"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"80094","_score":54.995605,"_source":{"id":"80094","text":"   



soyxiaobi

一、异步加载script的好处

为了加快首屏响应速度,前端会采用代码切割、按需加载等方式优化性能。异步加载script也是一种前端优化的手段。

就好比如果我的页面其中一个功能需要打开地图,但是地图的js插件包是非常大的,而如果用户不用地图功能的时候,我们当然不能再给它加载js地图包,白白让他多花等待时间岂不是很冤枉!于是我们可以动态插入script,当用户点击了某个按钮的时候,再新建script标签,引入地图js资源。

下面介绍下异步加载script的几种方式。

二、异步加载script的方式

1. 按需加载JS
    getMap.onclick = function(){
        //获得需要插入的位置
        var oDiv = document.getElementById('div');
        //异步创建script
        var script = document.createElement('script');
        
        script.src = 'https://map.baidu.com/...'
        
        oDiv.appendChild(script);
    }
2. script标签加上defer或async

script标签存在两个属性,defer和async,加上两个属性之后,在js真正执行之前都不会阻止html的加载。因此script标签的使用分为三种情况:

  • 没有defer或async属性,浏览器会立即加载并执行相应的脚本。也就是说在渲染script标签之后的文档之前,不等待后续加载的文档元素,读到就开始加载和执行,此举会阻塞后续文档的加载;
<script src="example.js"></script>
  • 有了async属性,表示后续文档的加载和渲染与js脚本的加载和执行是并行进行的,即异步执行;
<script async src="example.js"></script>
  • 有了defer属性,加载后续文档的过程和js脚本的加载(此时仅加载不执行)是并行进行的(异步),js脚本的执行需要等到文档所有元素解析完成之后,DOMContentLoaded事件触发执行之前。
<script defer src="example.js"></script>

下图可以直观的看出三者之间的区别:

其中蓝色代表js脚本网络加载时间,红色代表js脚本执行时间,绿色代表html解析。

从图中我们可以明确一下几点:

  1.defer和async在网络加载过程是一致的,都是异步执行的;

  2.两者的区别在于脚本加载完成之后何时执行,可以看出defer更符合大多数场景对应用脚本加载和执行的要求;

  3.如果存在多个有defer属性的脚本,那么它们是按照加载顺序执行脚本的;而对于async,它的加载和执行是紧紧挨着的,无论声明顺序如何,只要加载完成就立刻执行,它对于应用脚本用处不大,因为它完全不考虑依赖。

转载于:https://www.cnblogs.com/neusc/archive/2016/08/12/5764162.html

3. 通过 ajax 去获取 js 代码,然后通过 eval 执行
window.onload = function(){
    //1.创建XMLHttpRequest对象并考虑兼容性
    var xhr;
    if(window.XMLHttpRequest){
        //通用浏览器
        xhr = new XMLHttpRequest();
    }
    else{
        //IE5/6
        xhr = new ActiveXObject('Miscrosoft.XMLHttp')
    }
    
    //2.设置请求方式
    let url = '';
    xhr.open('get', url, true);//异步请求
    
    //3.发送请求
    xhr.send();
    
    //4.回调函数
    xhr.onreadyStateChange = function(){
        if(xhr.readyState == 4 && xhr.status == 200){
            let script = xhr.responseText;
            eval(script);   //异步加载script
        }
    }
}
 
4. 创建并插入 iframe,让它异步执行 js
var iframe = document.createElement('iframe'); 
 document.body.appendChild(iframe); 
 var doc = iframe.contentWindow.document; 
 doc.open().write('<body onload="insertJS()">'); 
 doc.close();

分类:

JS/ES6

技术点:

相关文章:

  • 2021-08-21
  • 2021-12-20
  • 2018-09-10
  • 2021-12-20
  • 2021-08-13
  • 2021-12-03
  • 2022-01-06
  • 2021-09-14
猜你喜欢
  • 2019-11-06
  • 2021-11-17
  • 2021-04-19
  • 2022-01-06
  • 2018-06-17
  • 2021-09-29
相关资源
相似解决方案
粤ICP备22038628号Powered By WordPress