代码压缩minify

抽象语法树:AST(Abstract Syntax Tree)

通过 AST 分析,根据选项配置一些策略,来生成一颗更小体积的 AST 并生成代码。

常见用以压缩 AST 的几种方案如下:

去除多余字符: 空格,换行及注释

1
2
3
4
5
6
7
// before
function sum (a, b) {
return a + b;
}

// after
function sum(a,b){return a+b}

多行代码压缩到一行时要注意行尾分号。

压缩变量名:变量名,函数名及属性名

1
2
3
4
5
6
7
// before
function sum (first, second) {
return first + second;
}

// after
function s(x,y){return x+y}

在这个示例中,当完成代码压缩 (compress) 时,代码的混淆 (mangle) 也捎带完成。 但此时缩短变量的命名也需要 AST 支持,不至于在作用域中造成命名冲突。

解析程序逻辑:合并声明以及布尔值简化

合并声明:

1
2
3
4
5
6
// before
const a = 3;
const b = 4;

// after
const a = 3, b = 4;

布尔值简化:

1
2
3
4
5
// before
!b && !c && !d && !e

// after
!(b||c||d||e)

解析程序逻辑: 编译预计算

在编译期进行计算,减少运行时的计算量:

1
2
3
4
5
// before
const ONE_YEAR = 365 * 24 * 60 * 60

// after
const ONE_YAAR = 31536000

以及一个更复杂的例子:

1
2
3
4
5
6
7
8
// before
function hello () {
console.log('hello, world')
}
hello()

// after
console.log('hello, world')