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 BASE64编码 window.atob(), window.btoa()
Mar 09 Javascript
用Jquery实现多级下拉框无刷新的联动
Dec 22 Javascript
jQuery点击自身以外地方关闭弹出层的简单实例
Dec 24 Javascript
22点关于jquery性能优化的建议
May 28 Javascript
四种参数传递的形式——URL,超链接,js,form表单
Jul 24 Javascript
如何实现json数据可视化详解
Nov 24 Javascript
Vuex简单入门
Apr 19 Javascript
js提取中文拼音首字母的封装工具类
Mar 12 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
Aug 13 jQuery
Vue 一键清空表单的实现方法
Feb 07 Javascript
Vue关于组件化开发知识点详解
May 13 Javascript
解决vue中el-tab-pane切换的问题
Jul 19 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
PHP 实用代码收集
2010/01/22 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
解析PHP中一些可能会被忽略的问题
2013/06/21 PHP
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
简单实现JS对dom操作封装
2015/12/02 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
小程序实现留言板
2018/11/02 Javascript
关于vue的npm run dev和npm run build的区别介绍
2019/01/14 Javascript
微信小程序canvas实现签名功能
2021/01/19 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
Python实现字符串的逆序 C++字符串逆序算法
2020/05/28 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
python 同时读取多个文件的例子
2019/07/16 Python
Flask框架学习笔记之模板操作实例详解
2019/08/15 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
营业员实习自我鉴定
2013/12/07 职场文书
美德少年事迹材料
2014/01/23 职场文书
颁奖典礼主持词
2014/03/25 职场文书
研讨会主持词
2014/04/02 职场文书
期末评语大全
2014/05/04 职场文书
关键在于落实心得体会
2014/09/03 职场文书
2015年维修工作总结
2015/04/25 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
pytorch Dropout过拟合的操作
2021/05/27 Python
ConstraintValidator类如何实现自定义注解校验前端传参
2021/06/18 Java/Android
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers