[分享]使用非阻塞方式并行加载Javascript,降低页面加载时间
1.目前绝大部分的浏览器都是采取阻塞方式(Scripts Block Downloads)加载Javascript文件的;
如下图所示:
只有当浏览器一个一个下载完所有的script文件时,才会开始并行下载其他资源(css, 图片,网页);
这种机制的好处就是我们可以随意在页面上使用那种JS库中的函数,因为页面肯定是在JS加裁之后呈现的,但是缺点也非常明显:一旦此Javascript文件过大,或网络连接不稳定,整个页面就会被阻塞一段时间,这里有一个 示例。
2.因此一般大型的网站都会采取非阻塞方式加载Javascript来提高性能(降低页面加载时间),Steve 在他的博文中提到了几种方法,如使用iframe, 动态添加script节点等来并行下载javascript文件。不过目前用得最多的应该还是动态添加script节点的方法。如下代码,出自 Nicholas的文章。
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.body.appendChild(script);}(function($){ //定义功能函数 var RowSwitch = function(){ var rowSwitch = this; rowSwitch.init = function(){ …… }; rowSwitch.bind = function(){ $(".ptslist li a").click(function(e){ …… }); }; …… }; //绑定代码 $(function(){ var rowSwitch = new RowSwitch(); rowSwitch.init(); rowSwitch.bind(); });})(jQuery);(function ($) { var defaults = { …… }; $.fn.rollOver = function (options) { var settings = $.extend(true, {}, defaults, options); }); } $.fn.rollOver.defaults = defaults;})(jQuery);....window.asyncCanary = 1; //文件结束标志$async = function(canary){....} //异步检测函数定义,这里会定义一个timer,隔一断时间就会检测标志是否已定义;$async("asyncCanary", function(){ //检测asyncCanary,如果已定义则执行绑定 $("#menubar").rollOver({hoverTxt:""....});});