前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >无阻塞加载脚本

无阻塞加载脚本

作者头像
菜的黑人牙膏
发布2019-01-21 16:37:30
4080
发布2019-01-21 16:37:30
举报

通常加载页面的时候,对于组件是并行下载的,现代大部分浏览器对于Js同样也是支持并行下载,但是在脚本下载、解析并执行完毕之前,不会开始下载任何其他内容。

正常引入:

可以看出,在脚本下载完毕后的一段时间内(该时间在解析执行脚本),不会对其他组件进行下载,以下几种方案解决该问题。

1. XHR Eval加载脚本:

即使用ajax引入脚本,并通过eval对其执行。

代码:

var xhrObj = getXHRObject();

  xhrObj.onreadystatechange = function(){

      if(xhrObj.readyState == 4 && xhrObj.status == 200){

           eval(xhrObj.respoenseText);

      }

  }

  xhrObj.open('GET', 'js/User/search.js', true);

  xhrObj.send();

  function getXHRObject(){

      var xhrObj = false;

      if(window.XMLHttpRequest){

            xhrObj = new XMLHttpRequest();

        }else{

            //IE6,5

            xhrObj = new ActiveXObject("Microsoft.XMLHTTP");

        }

    return xhrObj;

  };

该方法的主要缺点是:脚本必须部署在和主页面相同的域中,参见同源策略。

2.XHR注入:

类似于XHR Eval,XHR注入也是通过ajax来获取脚本,不同的是该方法为创建一个script的DOM元素,并将脚本内容插入。

代码(getXHRObject代码如上):

var xhrObj = getXHRObject();

  xhrObj.onreadystatechange = function(){

      if(xhrObj.readyState == 4 && xhrObj.status == 200){

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

           document.getElementsByTagName('head')[0].appendChild(scriptElem);

           scriptElm.text = xhrObj.responseText;

      }

  }

xhrObj.open('GET', 'js/User/search.js', true);

  xhrObj.send();

缺点:同上 受同源策略的影响。

3.Iframe引入:

该方法为将js改成html文件,并把外部脚本写进为内行脚本,同时需要对父级和iframe文档进行关联,同样受同源策略的影响。

<iframe src="search.html" width=0 height=0 frameborder="0"></iframe>

缺点:iframe消耗性能大,维护性低,不推荐使用。

4.Script DOM Element

通过创建一个script的DOM元素,并设置其src引用脚本。

代码:

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

  scriptElm.src = "js/User/search.js";

           document.getElementsByTagName('head')[0].appendChild(scriptElm);

优点:代码短,不受同源策略影响,无需重构代码。

5.Defer

大部分浏览器支持的属性 在引用时加入

代码:

<script defer src="js/User/search.js"  ></script>

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-03-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档