提高网站性能之 如何对待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 相关文章推荐
上传图片js判断图片尺寸和格式兼容IE
Sep 01 Javascript
使用jQuery jqPlot插件绘制柱状图
Dec 18 Javascript
JS中利用FileReader实现上传图片前本地预览功能
Mar 02 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
Sep 21 Javascript
Vue+Express实现登录注销功能的实例代码
May 05 Javascript
五分钟搞懂Vuex实用知识(小结)
Aug 12 Javascript
解决微信小程序中的滚动穿透问题
Sep 16 Javascript
微信小程序以ssm做后台开发的实现示例
Apr 08 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
Oct 27 Javascript
Vue 401配合Vuex防止多次弹框的案例
Nov 11 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入门学习知识点六 PHP文件的读写操作代码
2011/07/14 PHP
php中定时计划任务的实现原理
2013/01/08 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
2014/10/30 PHP
php基于str_pad实现卡号不足位数自动补0的方法
2014/11/12 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
zepto.js 实时监听输入框的方法
2018/12/04 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
js实现车辆管理系统
2020/08/26 Javascript
[03:12]TI9战队档案 - Virtus Pro
2019/08/20 DOTA
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
Python3的socket使用方法详解
2020/02/18 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
python使用pymongo与MongoDB基本交互操作示例
2020/04/09 Python
python调用私有属性的方法总结
2020/07/24 Python
python线程里哪种模块比较适合
2020/08/02 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
大学专科生推荐信范文
2013/11/23 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
养成教育经验材料
2014/05/26 职场文书
法语专业求职信
2014/07/20 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫
python中 Flask Web 表单的使用方法
2022/05/20 Python
详解flex:1什么意思
2022/07/23 HTML / CSS
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS