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 相关文章推荐
javascript 支持ie和firefox杰奇翻页函数
Jul 22 Javascript
jquery入门—数据删除与隔行变色以及图片预览
Jan 07 Javascript
详解JS正则replace的使用方法
Mar 06 Javascript
AngularJS辅助库browserTrigger用法示例
Nov 03 Javascript
webpack配置文件和常用配置项介绍
Apr 28 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
Mar 08 Javascript
在vue里面设置全局变量或数据的方法
Mar 09 Javascript
详解vuex的简单使用
Mar 12 Javascript
浅谈Webpack 持久化缓存实践
Mar 22 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
JS动态图片的实现方法完整示例
Jan 13 Javascript
cypress测试本地web应用
Jun 01 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
简单实用的.net DataTable导出Execl
2013/10/28 PHP
php使用session二维数组实例
2014/11/06 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
JS实现alert中显示换行的方法
2015/12/17 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
微信小程序  modal弹框组件详解
2016/10/27 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python部署web开发程序的几种方法
2017/05/05 Python
python如何获取服务器硬件信息
2017/05/11 Python
Python表示矩阵的方法分析
2017/05/26 Python
python3.0 模拟用户登录,三次错误锁定的实例
2017/11/02 Python
python dict 相同key 合并value的实例
2019/01/21 Python
python 字符串常用函数详解
2019/09/11 Python
pycharm的python_stubs问题
2020/04/08 Python
Python 实现一行输入多个数字(用空格隔开)
2020/04/29 Python
欧洲最大的品牌水上运动服装和设备在线零售商:Wuituit Outlet
2018/05/05 全球购物
人力资源经理的岗位职责
2014/03/02 职场文书
施工工地安全标语
2014/06/07 职场文书
反四风个人对照检查材料
2014/09/26 职场文书
美术教师个人总结
2015/02/06 职场文书
总结Python变量的相关知识
2021/06/28 Python
nginx lua 操作 mysql
2022/05/15 Servers