资讯专栏INFORMATION COLUMN

高性能JavaScript学习笔记-执行与加载

fou7 / 2955人阅读

摘要:虽然会有阻塞但还是有几招可以减少对性能的影响的。下载资源是异步的但是执行代码的时候仍是同步的同样会造成阻塞。缺点文件必须与所请求页面处于同一个域这种情况下文件不能从下载不适合大型的应用。

浏览器在处理HTML页面渲染和JavaScript脚本执行的时候是单一进程的,所以在当浏览器在渲染HTML遇到了

这种加载多个js文件的时候,浏览器就会因先下载执行js代码而阻塞页面渲染从而出现白屏页面(浏览器解析到标签之前,不会渲染页面任何内容),没法预览也没法交互,很差劲的用户体验。

注意:

现代浏览器支持资源并行下载,只限于

defer demo
defer demo
defer demo
defer demo
defer demo
defer demo
defer demo
defer demo
defer demo
defer demo
defer demo
defer demo
//defer.js的文件下只有alert("defer");一行代码

async的例子也是相同的页面结构,这里就不摆例子了,可以戳下面的链接。
defer example的链接戳这里!
async example的链接戳这里!
虽然页面结构一样,但不一样的是

打开defer.html依次看到是: 弹出"script"的alert框=>页面渲染出文字=>弹出"defer"的alert框=>弹出"load"的alert框

打开async.html依次看到是: 弹出"script"的alert框=>弹出"async"的alert框=>页面渲染出文字=>弹出"load"的alert框

3.2.使用动态创建的script标签来下载执行JavaScript代码
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "file.js";
document.getElementByTagName("head")[0].appendChild(script);

file.js在script元素添加到页面时就启动下载,使用这种方式的优势在于file.js的下载和执行不会阻塞页面其他进程。
下面是普通方式和动态添加脚本方式的两个demo,file.js中仅仅是一个10000次的for循环和之后弹出一个alert框的几句代码。
动态添加script元素的Demo链接戳这里!
普通的引入script脚本Demo链接戳这里!
从demo上可以明显的看出动态加载方式可以在alert框弹出之前先看到页面上的文字,但是普通的方式只有在alert框弹出之后才可以看到页面上的文字。

我们可以封装一个跨浏览器的读取script脚本并动态创建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{//其他浏览器
        script.onload = function(){
            callback();
        }    
    }
    
    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}

这类动态加载脚本的方法兼容性好,也比较简单,是一种常用的无阻塞解决方案。

3.3.使用XHR对象下载JavaScript代码并注入页面

另一种无阻塞加载脚本的方式是使用XMLHttpRequest(XHR)对象获取脚本并注入页面中。
这种技术会先创建一个XHR对象,然后用他下载JavaScript文件,最后通过常见动态

这样只需在第一个

阅读需要支付1元查看
<