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 相关文章推荐
一个不错的用JavaScript实现的UBB编码函数
Mar 09 Javascript
JavaScript 实现类的多种方法实例
May 01 Javascript
node+express+ejs制作简单页面上手指南
Nov 26 Javascript
AngularJs动态加载模块和依赖注入详解
Jan 11 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
May 17 Javascript
jQuery.uploadify文件上传组件实例讲解
Sep 23 Javascript
微信小程序实战之自定义抽屉菜单(7)
Apr 18 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
Apr 10 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
Jul 04 Javascript
聊聊鉴权那些事(推荐)
Aug 22 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
Feb 25 Javascript
Vue使用Ref跨层级获取组件的步骤
Jan 25 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的控制语句
2006/10/09 PHP
PHP的基本常识小结
2013/07/05 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
jquery 获取表单元素里面的值示例代码
2013/07/28 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
详解JavaScript数组的操作大全
2015/10/19 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
Python实现拼接多张图片的方法
2014/12/01 Python
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
澳大利亚优惠网站:Deals.com.au
2019/07/02 全球购物
毕业生动漫设计求职信
2013/10/11 职场文书
西游记读书笔记
2015/06/25 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
Python中的datetime包与time包包和模块详情
2022/02/28 Python
windows系统搭建WEB服务器详细教程
2022/08/05 Servers