提高网站性能之 如何对待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 相关文章推荐
用Javscript实现表单复选框的全选功能
May 25 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
Dec 28 Javascript
node.js中的fs.writeFile方法使用说明
Dec 14 Javascript
JS &amp; JQuery 动态添加 select option
Jun 08 Javascript
浅谈js中StringBuffer类的实现方法及使用
Sep 02 Javascript
DWR3 访问WEB元素的两种方法实例详解
Jan 03 Javascript
原生JS实现九宫格抽奖效果
Apr 01 Javascript
vue路由嵌套的SPA实现步骤
Nov 06 Javascript
javascript代码优化的8点总结
Jan 29 Javascript
详解如何实现一个简单的 vuex
Feb 10 Javascript
Vue axios 将传递的json数据转为form data的例子
Oct 29 Javascript
Vue实现兄弟组件间的联动效果
Jan 21 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实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
帝国cms目录结构分享
2015/07/06 PHP
关于laravel框架中的常用目录路径函数
2019/10/23 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
JavaScript中九种常用排序算法
2014/09/02 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
Angular.js前台传list数组由后台spring MVC接收数组示例代码
2017/07/31 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
JavaScript 正则命名分组【推荐】
2018/06/07 Javascript
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
Python实现远程调用MetaSploit的方法
2014/08/22 Python
初学Python函数的笔记整理
2015/04/07 Python
利用Python学习RabbitMQ消息队列
2015/11/30 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
python中字符串数组逆序排列方法总结
2019/06/23 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
在django中查询获取数据,get, filter,all(),values()操作
2020/08/09 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
Python descriptor(描述符)的实现
2020/11/15 Python
python 实现超级玛丽游戏
2020/11/25 Python
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
大学生2014全国两会学习心得体会
2014/03/10 职场文书
《水乡歌》教学反思
2014/04/24 职场文书
雨中的树观后感
2015/06/03 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
MySQL主从切换的超详细步骤
2022/06/28 MySQL