Javascript 加载和执行-性能提高篇


Posted in Javascript onDecember 28, 2012

Js的阻塞性
Javascript 在浏览器中的性能问题,可能是最重要的可用性问题
Js的阻塞性 浏览器用单一进程来处理UI进程和Js的执行
不管是内嵌的还是外链的,下载并立即执行 因为它有可能会修改页面

页面生存周期的概念
瀑布图中看到了下载时间和executing time
在head中加入script 和link body加载到前不会输出任何东西,因此会看到空白页面

<script type="text/javascript"> 
document.write("The date is" + (new Date().toDateString())); 
</script>

页面在到script时,不知道script里会做什么,所以必然阻塞,等它执行
Ie8 等浏览器能并行下载多个js等资源,但是还是对下载图片有影响
结论, 将脚本放在底部加载

组织脚本
目标 最小化迟延时间
问题
引用多个script文件 内嵌多个script标签
每个http请求都会带来性能上的开销
紧跟在link 后的script 是个错误 它会等待css的加载,以求获得最精准的描绘
结论:减少script标签的数量
将多个js文件合并成一个,打包工具
yahoo的合并处理器

无阻塞的脚本
js倾向于阻止浏览器的某些处理过程,如http请求处理和界面更新.这是最重要的性能问题。于是要减少js文件大小和限制http请求数
但是功能丰富与代码量之间的矛盾, 合并成单个文件却体积大会锁死浏览器一大段时间,于是我们需要逐步加载javascript文件
重点:在页面加载完成后加载javascript文件

1、延迟加载脚本
defer 属性
如果要下载的js文件不会进行dom操作,那么defer属性有很大的用处,它能让文件并行下载,并不会立即执行,而会在onload事件后再执行,适用于任何script标签
2、动态加载脚本
一个function

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(); 
} 
} 
}

这里要注意浏览器的兼容性,删除事件,
如果有多个文件需要这样加载,那么可以
loadScript('file1.js', function(){ 
loadScript('file2.js',function(){ 
}) 
});

3、XHR脚本注入
var xhr = new XMLHttpRequest(); 
xhr.open('get','file1.js',true); 
xhr.onreadystatechange= function(){ 
if(xhr.readyState == 4) { 


if(xhr.status >= 200 && xhr.status <=300 || xhr.status==304) { 
var oScript = document.createElement('script'); 


 oScript.text = xhr.responseText; 


 document.body.appendChild(oScript); 
} 
} 
}

304表示从缓存取 text将ajax的内容放入text

它的优点
兼容性好,异步, 缺点:不能扩域 不能从cdn取内容

Javascript 相关文章推荐
js中的escape及unescape函数的php实现代码
Sep 04 Javascript
实现局部遮罩与关闭原理及代码
Feb 04 Javascript
javascript ready和load事件的区别示例介绍
Aug 30 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
Apr 03 Javascript
JavaScript替换当前页面的方法
Apr 03 Javascript
jquery trigger函数执行两次的解决方法
Feb 29 Javascript
EasyUI加载完Html内容样式渲染完成后显示
Jul 25 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
Aug 05 Javascript
javascript 开发之百度地图使用到的js函数整理
May 19 Javascript
完美实现js拖拽效果 return false用法详解
Jul 28 Javascript
vue单页应用加百度统计代码(亲测有效)
Jan 31 Javascript
通过实例解析js简易模块加载器
Jun 17 Javascript
javascript延时加载之defer测试
Dec 28 #Javascript
JavaScript(js)设置默认输入焦点(focus)
Dec 28 #Javascript
Javascript图像处理—平滑处理实现原理
Dec 28 #Javascript
js获取网页高度(详细整理)
Dec 28 #Javascript
前台js改变Session的值(用ajax实现)
Dec 28 #Javascript
window.open的页面如何刷新(父页面)上层页面
Dec 28 #Javascript
CSS(js)限制页面显示的文本字符长度
Dec 27 #Javascript
You might like
实现dedecms全站URL静态化改造的代码
2007/03/29 PHP
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
thinkphp文件处理类Dir.class.php的用法分析
2014/12/08 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
JavaScript设计模式之适配器模式介绍
2014/12/28 Javascript
Bootstrap表格和栅格分页实例详解
2016/05/20 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
pygame学习笔记(5):游戏精灵
2015/04/15 Python
python获得一个月有多少天的方法
2015/06/04 Python
windows下python连接oracle数据库
2017/06/07 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
pandas去除重复列的实现方法
2019/01/29 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
python中pickle模块浅析
2020/12/29 Python
Boda Skins皮衣官网:奢侈皮夹克,全球配送
2016/12/15 全球购物
装潢设计专业推荐信模板
2013/11/26 职场文书
国际经济与贸易专业大学生职业规划书
2014/03/01 职场文书
给老婆的保证书范文
2014/04/28 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
Python编程编写完善的命令行工具
2021/09/15 Python
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
利用Python实现模拟登录知乎
2022/05/25 Python