高性能js之script的加载

2019-08-26  本文已影响0人  newway_001

js加载:

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

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

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

开发人员放在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 文件必须与页面放置在同一个域内。

上一篇 下一篇

猜你喜欢

热点阅读