脚本位置:将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. Servlet开发详解

    一.Servlet简介 Servlet是sun公司提供的一门用于动态web资源的技术 sun公司在其API中提供了一个Servlet接口,用户若想开发一个动态web资源,需要完成两个步骤: 编写一个J ...

  3. 浅析word-break work-wrap区别

    word-break:[断词] 定义:规定自动换行的处理方法.   注:通过word-break使用,可以实现让浏览器在任意位置换行. 语法:word-break: normal|break-all| ...

  4. SQLServer语句执行效率及性能测试

    写程序的人,往往需要分析所写的SQL语句是否已经优化过了,服务器的响应时间有多快,这个时候就需要用到SQL的STATISTICS状态值来查看了. 通过设置STATISTICS我们可以查看执行SQL时的 ...

  5. [poj2492]A Bug's Life(并查集+补集)

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 34678   Accepted: 11339 D ...

  6. mac下安装 xampp 无法启动apache (转,留用)

    1.查看端口是否被占用 sudo lsof -i -n   2.用终端运行xampp,查看具体的错误 sudo su /Applications/XAMPP/xamppfiles/xampp star ...

  7. sql 查看某用户的连接数 以及 如何删除该用户的会话

    --查看不同用户的连接数 select TERMINAL from v$session where username='username' and machine='machine' ---查询用户会 ...

  8. 扒一扒自从买了kindle后看的书

    一.<性别战争> 讲述的是动物界各类动物的xxx(你懂的),以动物拟人化的口吻来进行问答,十分的生动形象,虽说和自己的生活没有多大联系,但是偶尔了解一下,也是意外的不错的感觉. 二.< ...

  9. 内存屏障 & Memory barrier

    Memory Barrier http://www.wowotech.net/kernel_synchronization/memory-barrier.html 这里面讲了Memory Barrie ...

  10. Image放大缩小在放进Imageview

    // 拿到要缩小放大的Bitmap obitmap = BitmapFactory.decodeResource(this.getResources(),R.drawable.ic_launcher) ...