下面这段代码是什么意思,以及为什么这么写就能减少编译后的代码尺寸呢?有知道的吗,本人对CC不熟悉。
// A few optimizations for Google Closure Compiler
// will save us a couple kb in the release script.
var object = Object, array = Array, regexp = RegExp,
date = Date, string = String, number = Number,
math = Math, Undefined;
Google Closure Compiler 會把局部變量名稱縮短,但不會把全局變量縮短。(這也就是閉包編譯器的字面意思)
那段代碼就是爲了把全局變量變成局部變量。
其實有一種壓縮方式可以自動完成這一工作
甚至連 function 這樣冗長的關鍵字也可以壓縮。
比如:http://tool.lu/js/ 的「加密」(實際上是壓縮)
Object.prototype.hi = function() { return function() {} }
其中 function 出現了兩次
變成
eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('1.2.3=0(){4 0(){}}',5,5,'function|Object|prototype|hi|return'.split('|'),0,{}))
代碼被壓所成
1.2.3=0(){4 0(){}}
剩下的部分是「解密」(實際上是解壓縮)函數
其中全部代碼中只出現了一次 function。
這是 closure compiler 無論如何也做不到的。
所以我覺得,那段代碼中的做法,手動爲編譯器優化,除非代碼量較小,否則意義不大。
注释中写了for Google Closure Compiler
这玩意一般用来压缩,比如
var a_very_log_variable_name;
var a_very_long_function_name = function() {
do_sth_with(a_very_log_variable_name);
}
a_very_long_function_name();
压缩之后,所有的变量名,都被改写成尽可能短的字符串以减小体积:
var a;var b=function(){do_sth_with(a)};b();
那么问题来了,全局变量怎么压缩?这玩意不是我自己声明的,名字不是说改就能改的,如果我的脚本中用到同一个全局变量很多次,又不能压缩,怎么办?
起个别名不就行了? 新技能get√
利用重命名方式压缩的时候 ,只需要重命名别名
var object = Object;
var aaaaa = new object();
var bbbbb = new object();
var ccccc = new object();
var ddddd = new object();
var eeeee = new object();
被压缩为
var o=Object,a=new o(),b=new o(),c=new o(),d=new o(),e=new o();
普通写法
var begin=new Date();
var end=new Date();
console.log(begin.getTime()-end.getTime());
压缩后
var a=new Date();
var b=new Date();
console.log(a.getTime()-b.getTime());
这里的写法
var date=Date;
var begin=new date();
var end=new date();
console.log(begin.getTime()-end.getTime());
压缩后
var d=Date;
var a=new d();
var b=new d();
console.log(a.getTime()-b.getTime());