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如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
Apr 20 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
Nov 03 Javascript
jquery delay()介绍及使用指南
Sep 02 Javascript
jquery简单的弹出层浮动层代码
Apr 27 Javascript
JS代码防止SQL注入的方法(超简单)
Apr 12 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 Javascript
JS跨域请求外部服务器的资源
Feb 06 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
Angular2安装angular-cli
May 21 Javascript
JQuery.dataTables表格插件添加跳转到指定页
Jun 09 jQuery
vue2使用keep-alive缓存多层列表页的方法
Sep 21 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 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
B2K与车机的中波PK
2021/03/02 无线电
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
Javascript判断图片尺寸大小实例分析
2014/06/16 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
python避免死锁方法实例分析
2015/06/04 Python
python3大文件解压和基本操作
2017/12/15 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
python多进程控制学习小结
2018/10/31 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
python 判断文件还是文件夹的简单实例
2019/06/10 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
浅谈django channels 路由误导
2020/05/28 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
Python2与Python3关于字符串编码处理的差别总结
2020/09/07 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
IBatis持久层技术
2016/07/18 面试题
培训班开班仪式主持词
2014/03/28 职场文书
超市创业计划书
2014/09/15 职场文书