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 相关文章推荐
基于jQuery.Validate验证库知识点的详解
Apr 26 Javascript
jQuery 设置 CSS 属性示例介绍
Jan 16 Javascript
jqeury-easyui-layout问题解决方法
Mar 24 Javascript
jQuery表格行上移下移和置顶的实现方法
Oct 08 Javascript
JS从一组数据中找到指定的单条数据的方法
Jun 02 Javascript
JS实现弹出居中的模式窗口示例
Jun 20 Javascript
利用angularjs1.4制作的简易滑动门效果
Feb 28 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
Jun 09 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
Aug 24 Javascript
angular json对象push到数组中的方法
Feb 27 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 Javascript
快速解决vue在ios端下点击响应延时的问题
Aug 27 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
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
详解php实现页面静态化原理
2017/06/21 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
JavaScript判断浏览器版本的方法
2019/11/03 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
浅谈vue生命周期共有几个阶段?分别是什么?
2020/08/07 Javascript
python遍历文件夹下所有excel文件
2018/01/03 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
pyqt5、qtdesigner安装和环境设置教程
2019/09/25 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
本科生个人求职自荐信
2013/09/26 职场文书
股东授权委托书范本
2014/09/13 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
党员作风建设整改方案
2014/10/27 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
React四级菜单的实现
2022/04/08 Javascript
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL