提高网站性能之 如何对待JavaScript


Posted in Javascript onOctober 31, 2009

尤其是JavaScript 文件,在下载它时,并行下载实际上是被禁用的,并且还会阻塞页面的呈现!

关于JavaScript 的下载

在下载JavaScript 脚本文件时,浏览器不会并行启动其它下载,而是让JavaScript 脚本文件单独下载完毕后,再继续其它请求。这将对页面的整体性能是一个很大的问题,解决方案如下:

解决方案1:将JavaScript 脚本内联在页面中,即直接将JavaScript 脚本写在HTML标签中。
优点:速度最快。在大型网站的首页中,可以合理的将JavaScript 脚本的一部分直接内联在HTML标签中。
缺点:JavaScript 脚本不被单独缓存,其它页面不能共享该JavaScript 脚本(不能重用)。

解决方案2:将JavaScript 脚本标签的链接(link)放在HTML文件标签的底部。
要求:脚本中不包含document.write() 方法改写页面。

解决方案3:使用延迟(Defferred) 脚本。即在link标签中添加defer 属性表明JS脚本中不包含document.write() 方法。
缺陷:在Firefox 中使用延迟(Defferred ) 脚本后,JavaScript 脚本还是会阻塞呈现、阻塞并行下载。
而在IE中,效果也不明显。

总结:如果一个脚本可以使用延迟(Defferred ) 脚本技术,那么它一定可以移到页面的底部!
即“解决方案3”完全可以用“解决方案2”替代。

解决方案4:使用加载后下载。即JavaScript 脚本在页面加载完毕后,通过onload 事件动态下载。(CSS也通用 )
优点:既不阻塞HTML页面的呈现,又能实现JavaScript 脚本的重用(脚本将被缓存在浏览器中)。
缺点:产生额外的JavaScript 代码用于实现该功能,增加了程序复杂度。
问题:可能加载两次(内联一次,外部加载一次)。

可以使用IFrame嵌套一个页面并加载JavaScript 脚本来解决。
示例:http://stevesouders.com/hpws/post-onload.php

解决方案5:动态内联。根据cookie做指示器,用代码进行判断,实现将外部JS内联到页面当中。
动态内联是对“加载后下载”的进一步完善。也再次增加了程序复杂度。
虽然JavaScript 脚本推荐放在页面底部,但CSS样式表则应该放在页面的顶部!

关于JavaScript 的精简

精简(Minification)是从代码中移除不必要的字符、注释、空白以减小JavaScript 代码的大小,进而改善JavaScript的下载长度和加载速度。

精简工具:JSMin JS Minifier js压缩
JSMin 用于去除javascript 文件中所有不必要的字符、注释、空白。

cmd 使用方法:C:\Documents and Settings\xugang>jsmin <openWin.js> js_rerurn.js
1. 先指定到 jsmin.exe 文件夹
2. openWin.js为源文件
3. js_rerurn.js为目标文件

精简工具:ShrinkSafe( 原名:Dojo Compressor ) http://dojotoolkit.org/docs/shrinksafe
ShrinkSafe 用于移除javascript 文件中的空白,同时还通过替换的方式缩短了变量名。
cmd 使用方法:java -jar shrinksafe.jar infile.js > outfile.js
shrinksafe.jar是工具名
infile.js为源文件
outfile.js为目标文件

注意:在控制台运行时,要保证shrinksafe.jar和js.jar是在同一个目录,并且输入的JS源文件和输出的JS目标文件也会在同一个目录。(默认在C盘根目录)

一般可以对你的JavaScrip文件同时使用JSMin 和 ShrinkSafe 这两个工具进行精简。
压缩组件

同时,不要忘记通过HTTP的头部声明,压缩脚本、样式表和HTML文档来减少响应时间。
浏览器客户端的请求: Accept-Encoding: gzip, deflate
Web服务器端的响应:Content-Encoding: gzip
gzip是目前流行和理想有效压缩方法,deflate效果略逊且不太流行。

Javascript 相关文章推荐
jQuery最佳实践完整篇
Aug 20 Javascript
ajax处理php返回json数据的实例代码
Jan 24 Javascript
限制只能输入数字的实现代码
May 16 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
Sep 06 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
Jan 21 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
Jul 13 Javascript
详解react服务端渲染(同构)的方法
Sep 21 Javascript
JavaScript原生实现观察者模式的示例
Dec 15 Javascript
AngularJS实现的生成随机数与猜数字大小功能示例
Dec 25 Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 Javascript
CountUp.js数字滚动插件使用方法详解
Oct 17 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
Oct 30 Javascript
JavaScript Sort 表格排序
Oct 31 #Javascript
DOM 脚本编程中的兄弟节点
Oct 31 #Javascript
javascript GUID生成器实现代码
Oct 31 #Javascript
json 实例详细说明教程
Oct 31 #Javascript
json 入门基础教程 推荐
Oct 31 #Javascript
jquery text()要注意啦
Oct 30 #Javascript
CCPry JS类库 代码
Oct 30 #Javascript
You might like
PHP中array_slice函数用法实例详解
2014/11/25 PHP
简单谈谈favicon
2015/06/10 PHP
php把数组值转换成键的方法
2015/07/13 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
jquery遍历input取得input的name
2009/04/27 Javascript
js 中的switch表达式使用示例
2020/06/03 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
Vue 2.x教程之基础API
2017/03/06 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
解决Pycharm后台indexing导致不能run的问题
2019/06/27 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
建筑项目策划书
2014/01/13 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
庆元旦演讲稿
2014/09/15 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书
python之基数排序的实现
2021/07/26 Python