Javascript优化技巧(文件瘦身篇)


Posted in Javascript onJanuary 28, 2008

最近一直在研究 Javascript 相关的技术。在《Javascript 高级程序设计》有篇章节着重阐述了优化 Javascript 代码的重要性。相信有很多的 Javascript 开发人员在开发的同时或多或少的会接触到此类的问题。

在大部分情况下,代码的优化并不是实际开发中所需要着重的部分。但是一旦代码完成了以后,开发者总是期待自己的代码能够越短越高效越好。结合从书中获得的知识以及本人实际开发过程中的经验,下面说明本人所采取的一些花招(也算是照本宣科一下)。

前言

相比脚本语言,编译型的语言并不需要太关心优化问题。在极大的程度上,编译时编译器都会之行优化操作。比如所有的变量、函数、对象等等都会替换成只有处理器才能理解的符号和指针(就是通常所指的可执行文件)。其他的脚本语言也并不需要过分在意文件的大小问题,但是 Javascript 则不同。
因为它首先要通过从服务器端下载源代码,然后再由客户端的浏览器执行。因此,Javascript代码的速度被分割成两部分:下载时间(取决于文件的大小)和执行速度(取决于代码算法)。这篇主要讨论的是 Javascript的下载时间优化,也就是如何尽可能的缩小 Javascript 文件本身的容量。
在这里要记住的一个数字是 1160,这是能放入单个 TCP/IP 包中的字节数。所以,最好的期望值是能将每个 Javascript 文件保持在 1160 字节一下,以获取最优的下载时间。

删除注释

这似乎是是废话,不过很多开发人员都会忘记。在实际生产环境中,脚本中的注释都应该删除。在开发期间注释相当的重要,它可以帮助团队理解代码。但在实际生产环境中,注释会明显使脚本文件体积变大。删除它们并不会给脚本实际运行带来任何的影响。

删除制表符和空格

具有良好缩进和空格的代码通常都具有良好的可读性。但是浏览器并不需要这些额外的制表符和空格,所以最好删除它们。当然也不要忘记函数参数,赋值语句以及比较操作之间的空格。比如

function showMeTheMoney(money)
{
    if (!money) {
        return false;
    } else {
        ...
    }
}可以优化成

function showMeTheMoney(money){if(!money){reutrn false;}else{...}}

这样可以减少部分容量。

删除所有的换行

有许多关于在 Javascript 中换行应该存在的思考,但底线都是换行要增加代码的可读性。但过分的换行也会造成代码体积的增加。
可能处于某种原因而不能删除换行符,这样则要保证文件是 Unix 格式的。因为 Windows、Mac 格式的换行符用两个字符表示换行;Unix 仅用一个。所以将文件转换成 Unix 格式也可以节约一些字节数。

替换变量名

这可能是最无聊的一种做法,这通常不是手工完成的。毕竟变量的名称对解释器来说毫无意义(只是对开发人员来说会更友好一些),在生产环境中将描述性的变量名替换成更简单、更短的名称也可以缩减一部分体积。比如上述的代码可以缩减成:

function sm(m){if(!m){reutrn false;}else{...}}

这样虽然看起来会比较的头痛,不过实际之行效果是一样的。

使用工具

实际使用上述的方法可能会有一些困难,幸好有现成的外部工具能完成这些步骤。下面简单的介绍几个:
ECMAScript Cruncher:http://saltstorm.net/depo/esc/ 
JSMin(The JavaScript Minifier): http://www.crockford.com/javascript/jsmin.html 
Online JavaScript Compressor.:http://dean.edwards.name/packer/

我猜你会有兴趣看下这篇文章。

其他方法

替换布尔值

对于比较来说,true 就等于 1,false 就等于 0 。因此,脚本包含的字面量 true 都可以用 1 来替换,而 false 可以用 0 来替换。对于 true 节省了 3 个字节,而 false 则节省了 4 个字节。

缩短否定检测

代码中常常会出现检测某个值是否有效的语句。而大部分条件非的判断就是判断某个变量是否为 undefined、null 或者 false,比如:

if (myValue != undefined) {
    // ...
}

if (myValue != null) {
    // ...
}

if (myValue != false) {
    // ...
}

这些虽然都正确,但用逻辑非操作符也可以有同样的效果:

if (!myValue) {
    // ...
}

这样的替换也可以节省一部分字节。

使用数组和对象字面量

这个比较好理解,比如一下两行是相同的:

var myArray = new Array;
var myArray = [];

然而第二行比第一行短很多,而且也能非常容易的理解。类似的还有对象声明:

var myObject = new Object;
var myObject = {};

举个例子,比如下面的语句:

var mySite = new Object;
mySite.author = "feelinglucky";
mySite.location = "http://www.gracecode.com";

这样写也可以非常容易的理解,并且短很多:

var mySite = {author:"feeinglucky", location:"http://www.gracecode.com"};

好的,这期就到这里。就向上面说的,Javascript 代码的速度被分割成两部分:下载时间(取决于文件的大小)和执行速度(取决于代码算法)。这次讨论的是下载时间方面的优化,下期讨论之行速度方面的优化(这样看起来非常有技术含量,不是么)。

下面布置家庭作业。或许大家会有兴趣了解下 jQuery 是怎么把自己 70KB 的代码压缩至 20KB 左右的。

Javascript 相关文章推荐
js时间日期和毫秒的相互转换
Feb 22 Javascript
浅谈轻量级js模板引擎simplite
Feb 13 Javascript
js获得当前系统日期时间的方法
May 06 Javascript
jqTransform美化表单
Oct 10 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
Sep 13 Javascript
jQuery使用cookie与json简单实现购物车功能
Apr 15 Javascript
AngularJS 实现弹性盒子布局的方法
Aug 30 Javascript
微信小程序 详解Page中data数据操作和函数调用
Jan 12 Javascript
JavaScript实现瀑布流以及加载效果
Feb 11 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
May 28 jQuery
vue使用过滤器格式化日期
Jan 20 Vue.js
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
用dom+xhtml+css制作的一个相册效果代码打包下载
Jan 24 #Javascript
JavaScript 数组的 uniq 方法
Jan 23 #Javascript
Javascript 更新 JavaScript 数组的 uniq 方法
Jan 23 #Javascript
Javascript 各浏览器的 Javascript 效率对比
Jan 23 #Javascript
Javascript 写的简单进度条控件
Jan 22 #Javascript
用jQuery实现检测浏览器及版本的脚本代码
Jan 22 #Javascript
零基础学JavaScript最新动画教程+iso光盘下载
Jan 22 #Javascript
You might like
php strrpos()与strripos()函数
2013/08/31 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
2019/03/01 PHP
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
使用 Vue 实现一个虚拟列表的方法
2019/08/20 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
Vue——前端生成二维码的示例
2020/12/19 Vue.js
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
python实现Floyd算法
2018/01/03 Python
pymysql 开启调试模式的实现
2019/09/24 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
python计算导数并绘图的实例
2020/02/29 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
2020/04/22 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
什么是servlet链?
2014/07/13 面试题
医药大学生求职简历的自我评价
2013/10/17 职场文书
哈理工毕业生的求职信
2013/12/22 职场文书
餐饮加盟计划书
2014/01/10 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
经贸韩语专业大学生职业规划
2014/02/14 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
应届毕业生自荐书
2014/06/18 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
督导岗位职责
2015/02/04 职场文书
2015年乡镇残联工作总结
2015/05/13 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书