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 相关文章推荐
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
Oct 12 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
Jan 24 Javascript
判断在css加载完毕后执行后续代码示例
Sep 03 Javascript
JS for循环中i++ 和 ++i的区别介绍
Jul 20 Javascript
微信小程序 require机制详解及实例代码
Dec 14 Javascript
微信小程序 Toast自定义实例详解
Jan 20 Javascript
JQuery中Ajax的操作完整例子
Mar 07 Javascript
footer定位页面底部(代码分享)
Mar 07 Javascript
node.JS md5加密中文与php结果不一致的解决方法
May 05 Javascript
在Vue项目中,防止页面被缩放和放大示例
Oct 28 Javascript
记一次用ts+vuecli4重构项目的实现
May 21 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
Jul 11 Javascript
用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
终于听上了直流胆调频
2021/03/02 无线电
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
php中使用接口实现工厂设计模式的代码
2012/06/17 PHP
基于Zookeeper的使用详解
2013/05/02 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
vue+element加入签名效果(移动端可用)
2019/06/17 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
python网络编程调用recv函数完整接收数据的三种方法
2017/03/31 Python
python 反向输出字符串的方法
2018/07/16 Python
python读取csv和txt数据转换成向量的实例
2019/02/12 Python
django 取消csrf限制的实例
2020/03/13 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
人事部岗位职责范本
2014/03/05 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
2014年仓库工作总结
2014/11/20 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
商务宴请邀请函范文
2015/02/02 职场文书
房地产项目合作意向书
2015/05/08 职场文书