高性能js之script的加载

js加载:

看了网上很多文章写关于js加载的问题。
总结了一下。
js放在head标签头部会存在很多问题,

  • 1:script标签下载会阻塞其他资源的下载;

现在大多数浏览器都允许并行下载 JavaScript 文件。这就缓解了加载与执行的问题,但是,JavaScript 下载过程仍然会阻塞其他资源的下载,比如样式文件和图片。

由于脚本会阻塞页面其他资源的下载,因此推荐将所有<script>标签尽可能放到<body>标签的底部,以尽量减少对整个页面下载的影响。

  • 2 有些是dom操作,而此时页面还未渲染。可能会引发错误。

开发人员放在body标签外下面,这样做不好的地方有两处:1、不规范 2、可能会造成js获取不到页面元素而导致报错。而放在body标签内底部可以确保js执行前页面渲染完成

<body>
js...                         //正确
</body>
<!-----------------------分界线---------------------------->
<body>

</body>
js...                         //错误

所以,script标签最好还是放在</body>标签底部;

无阻塞的脚本

延迟加载脚本
HTML4 为<script>标签定义了一个扩展属性:defer

文档解析时,遇到设置了defer的脚本,就会在后台进行下载,但是并不会阻止文档的渲染,
当页面解析&渲染完毕后执行,在window.onload之前。
会等到所有的defer脚本加载完毕并按照顺序执行,

动态脚本元素(下载完后会立即执行)
创建<script>元素

function loadScript(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"){

                script.onreadystatechange = null;

                callback();

            }

        };

    } else { //Others

        script.onload = function(){//监听是否加载完成。

            callback();

        };

    }

    script.src = url;

    document.getElementsByTagName("head")[0].appendChild(script);

}


loadScript("script1.js", function(){//按顺序下载script1.js、script2.js、script3.js

    loadScript("script2.js", function(){

        loadScript("script3.js", function(){

            alert("All files are loaded!");

        });

    });

});

新的<script>元素加载 script1.js 源文件。此文件当元素添加到页面之后立刻开始下载。此技术的重点在于:无论在何处启动下载,文件的下载和运行都不会阻塞其他页面处理过程。您甚至可以将这些代码放在<head>部分而不会对其余部分的页面代码造成影响(除了用于下载文件的 HTTP 连接)。

如果多个文件的次序十分重要,更好的办法是将这些文件按照正确的次序连接成一个文件。独立文件可以一次性下载所有代码(由于这是异步进行的,使用一个大文件并没有什么损失)。

使用 XMLHttpRequest(XHR)对象加载脚本类似于原生的ajax的get请求

var xhr = new XMLHttpRequest();

xhr.open("get", "script1.js", true);

xhr.onreadystatechange = function(){

    if (xhr.readyState == 4){

        if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){

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

            script.type = "text/javascript";

            script.text = xhr.responseText;

            document.body.appendChild(script);

        }

    }

};

xhr.send(null);

这种方法的主要优点是,可以下载不立即执行的 JavaScript 代码。由于代码返回在<script>标签之外(换句话说不受<script>标签约束),它下载后不会自动执行,这使得您可以推迟执行,直到一切都准备好了。另一个优点是,同样的代码在所有现代浏览器中都不会引发异常。

此方法最主要的限制是:JavaScript 文件必须与页面放置在同一个域内。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,395评论 0 3
  • js性能--加载执行 [TOC] 加载脚本的方式 脚本位置 HTML4规范指出,< script >标签可放在< ...
    小a草阅读 940评论 0 2
  • 面对开发者的浏览器的Js性能可以说,最重要的是可用性问题。这个问题是复杂的,因为Js的阻塞特性,换句话说当Js代码...
    Addy_Zhou阅读 823评论 0 1
  • 年底了,来一回说走就走啊。再不搞,就2015年了。 本来,我们大学宿舍四人约好,毕业四周年纪念,大家带上家属,选一...
    广州许多多阅读 315评论 6 3
  • vue 项目开启gzip自拍压缩和部署 nginx 开启gzip优化性能 第一步,在vue项目中安装依赖并将pro...
    白小纯Zzz阅读 3,244评论 0 0