脚本位置:将js脚本放置在body底部,由于脚本会阻塞页面渲染,导致明显延迟,通常表现为空白页面,用户无法游览页面的内容,也无法与页面进行交互。故因此推荐js脚本放在body底部,尽可能减少对整个页面的下载的影响。

注:内嵌脚本放置在引用外链样式表的<link>标签之后会导致页面堵塞去等待样式表的下载。(原因:为确保内嵌脚本在执行时能获取最精准的页面信息。)

组织脚本:由于每个script标签都会阻塞页面渲染,因为http请求会带来额外的性能开销。

无阻塞的脚本:

  • 延迟的脚本:defer和async
  • 动态脚本脚本元素:
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); }

动态脚本加载凭借在跨游览器兼容性和易用的优势,成为最通用的无阻塞加载解决方案。

  • XMLHttpRequest脚本注入
var xhr = new XMLHttpRequest();
xhr.open("get","file.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);

优点:你可以下载js脚本但不立即执行,同时同样的代码在所有主流游览器中均能正常工作。

局限性:js文件必须与所请求的页面处于相同的域。

故推荐使用的无阻塞模式:先添加动态加载所需的代码,然后加载初始化页面所需的剩下的代码。例如

<script type="text/javascript" src="loader.js"></script>
<script type="text/javascript">
loadScript("the-rest.js",function(){
Application.init();
})
</script>

优点:确保js执行过程中不会阻塞页面其他内容的显示;第二个js完成下载时,DOM结构已经创建完毕,并做好了交互的准备,从而避免了需要其他事件来检测页面是否准备好。

另一种方法是把loadScript()函数直接嵌入页面,从而避免多产生一次HTTP请求。

高性能javascript(记录一)的更多相关文章

  1. 《高性能javascript》一书要点和延伸(上)

    前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...

  2. 《高性能javascript》学习总结

    本文是学习<高性能javascript>(Nichols C. Zakes著)的一些总结,虽然书比较过时,里面的知识点也有很多用不上了,但是毕竟是前人一步步探索过来的,记录着javascr ...

  3. 高性能JavaScript(1)

    ---------------------------------------------------------------------------------------------------- ...

  4. 《高性能javascript》阅读摘要

    最近在阅读这本Nicholas C.Zakas(javascript高级程序设计作者)写的最佳实践.性能优化类的书.记录下主要知识. 加载和执行 脚本位置 放在<head>中的javasc ...

  5. 《高性能javascript》 领悟随笔之-------DOM编程篇(二)

    <高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  6. 《高性能javascript》 领悟随笔之-------DOM编程篇

    <高性能javascript> 领悟随笔之-------DOM编程篇一 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  7. 各种JS模板引擎对比数据(高性能JavaScript模板引擎)

    最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...

  8. 高性能javascript学习笔记系列(6) -ajax

    参考 高性能javascript javascript高级程序设计 ajax基础  ajax技术的核心是XMLHttpRequest对象(XHR),通过XHR我们就可以实现无需刷新页面就能从服务器端读 ...

  9. 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践

    参考高性能javascript 理解浏览器UI线程  用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程  UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...

  10. 高性能JavaScript 编程实践

    前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的 ...

随机推荐

  1. Android 图形总结

    1.9patch图 2.按钮自定义 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:a ...

  2. OpenCV从入门到放弃系列之——core模块.核心功能(一)

    Mat - 基本图像容器 世间的图像是各种各样的,但是到了计算机的世界里所有的图像都简化为了数值矩以及矩阵信息.作为一个计算视觉库,OpenCV的主要目的就是处理和操作这些信息,来获取更高级的信息,也 ...

  3. zookeeper 安装及一些问题

    一.mac brew安装 http://blog.itpub.net/27099995/viewspace-1394831/ 二.部署多台 参考链接:http://blog.itpub.net/270 ...

  4. RansomNote

    
Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 all 
th ...

  5. unity自带寻路Navmesh入门教程(一)

    说明:从今天开始,我阿赵打算写一些简单的教程,方便自己日后回顾,或者方便刚入门的朋友学习.水平有限请勿见怪.不过请尊重码字截图录屏的劳动,如需转载请先告诉我.谢谢! unity自从3.5版本之后,增加 ...

  6. SSIS数据转换后数值总数差异过大

    之前做过一个项目,犯了一个小错误,写出来给大家分享一下,以防大家出同样的错误. 做了一个ETL包,对货品的销售额进行数据转换,字符型 --〉 浮点型: 之后对销售额进行求和,在测试数据结果时发现与销售 ...

  7. ADO.NET 基础 (SQL Server)

    一.Web.config配置 <connectionStrings> <add name="constr_name" connectionString=" ...

  8. android APK更新

    菜鸟的博客请多多指教 最近做了一个新功能,更新APK的功能 1.更新APK是一个耗时的任务,我采用了一个服务来做,上次在网上看到服务是在主线程里面,自己也测试了下,数据是真的 所以下载动作还必须在服务 ...

  9. laravel 安装完成后安装 vendor 目录

    composer  install 就是将composer.js 中的配置下载安装 生成vendor目录

  10. 【转】mysql查询结果输出到文件

    转自:http://www.cnblogs.com/emanlee/p/4233602.html mysql查询结果导出/输出/写入到文件 方法一: 直接执行命令: mysql> select ...