提高网站性能之 如何对待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 相关文章推荐
JavaScript window.setTimeout() 的详细用法
Nov 04 Javascript
Javascript笔记一 js以及json基础使用说明
May 22 Javascript
js querySelector和getElementById通过id获取元素的区别
Apr 20 Javascript
原生JS可拖动弹窗效果实例代码
Nov 09 Javascript
浅谈javascript获取元素transform参数
Jul 24 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
Feb 20 Javascript
node实现定时发送邮件的示例代码
Aug 26 Javascript
AngularJS实现自定义指令及指令配置项的方法
Nov 20 Javascript
JS实现去除数组中重复json的方法示例
Dec 21 Javascript
vue实现的下拉框功能示例
Jan 29 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
Dec 10 Javascript
vue-resource post数据时碰到Django csrf问题的解决
Mar 13 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文件上传的例子及参数详解
2013/12/12 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
php实现的双色球算法示例
2017/06/20 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
Vue中封装input组件的实例详解
2017/10/17 Javascript
Python中文字符串截取问题
2015/06/15 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
python读写json文件的简单实现
2017/04/11 Python
django允许外部访问的实例讲解
2018/05/14 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
pandas.DataFrame删除/选取含有特定数值的行或列实例
2018/11/07 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
Python collections模块使用方法详解
2019/08/28 Python
详解python中index()、find()方法
2019/08/29 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
Python实现仿射密码的思路详解
2020/04/23 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
基于HTML5 WebGL的3D机房的示例
2018/03/16 HTML / CSS
教师岗位职责
2013/11/17 职场文书
电子银行营销方案
2014/02/22 职场文书
关于读书的演讲稿500字
2014/08/27 职场文书
村干部群众路线整改措施思想汇报
2014/10/12 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
职场新人知识:如何制定一份合理的工作计划?
2019/09/11 职场文书
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫