Javascript代码的混淆与加密(压缩)

本文只是提一些关于混淆与压缩的想法,可能会偶发抽风型更新。

混淆

混淆就是尽量让JS代码看不懂。

JS的变量名可以以字母或特殊符号开头,但不能以数字开头.

1a不是一个合法的变量名,但_1a就是

JS的变量名开头能用的特殊符号只有两个:$和_.前者被jquery等发扬光大,后者则由underscore占据.

混淆可以让格式良好的代码都看不懂,就是把变量名函数名通通变成_1,_2,_11,_a,_1a2c这种(easyui就是这么搞的).

相比a,b,c,我觉得_1,_2,_3这种名称更让人混淆,虽然后者更长.
easyui的混淆,做得还不算太绝。虽然他所有变量都是_+数字这样的,但重名的变量却不算多,梳理一下还是可以看懂的。

要做得更绝,可以人工使用大量同名变量————因为JS的不同作用域里,同名变量并不会冲突

压缩加密

很多人认为两者是一样的,所以我就都放一起了。反正就是指:让代码量变得更少。

要想压缩得更小,还要靠一些特别的编码格式—-不过这些格式一般也是良好的编码格式,并不是为了压缩了故意这样做.

用一个var加,分隔声明多个连续变量.

如:

1
var a = 1,b = 2, c={},d='sss',e=[1,2,3];

因为压缩工具不会把多个var自动合并成一个.

压缩工具不会把true和false做处理。在不严谨的场景,你可以把true写成1,false写成0.或把true改为!0,false改为!1(有的压缩工具会自动改)

如果多处用到undefined或null,可用变量预先保存他们

压缩工具不会把变量本地化,但把变量本地化后再压缩可以缩减很大的字节量.所以推荐.

本地化(其实叫做私有化)即你有一个函数,里面多次调用了外部的a.b.c方法(或属性),那么你就应该把他存下来,

1
2
var c = a.b.c;
c...

极端压缩法

将命名空间调用链里的.式调用,改成[]式调用。如:页面中有好几处这样的调用:

1
2
3
a.replace(...)
bbb.replace(...)
c.replace(...).replace(...)

则可以改成:

1
2
3
4
var r = 'replace';
a[r](...)
bbb[r](...)
ccc[r](...)[r](...)

虽然多了一个变量,但压缩后会减少不少字节(而且让代码更看不懂了)

关于这两种调用方式的效率对比:http://jsperf.com/test-call-object-or-method-by-two-way/3

(请使用多种浏览器进入测试)结论是两者几乎没有性能差距

有一款国外的在线压缩工具,是我用过压缩率最高的,放出来:

http://javascript-minifier.com/

载入有点慢,且有可能抽风(怪有关部门吧)

发表评论

电子邮件地址不会被公开。