likes
comments
collection
share

一招骚操作,改变经Terser.js压缩后的代码的运行效果

作者站长头像
站长
· 阅读数 10

众所周知,生产环境打包后的代码必然经过压缩。目前最流行的代码压缩工具主要有两个:UglifyJsTerser

Terser是一个新起的代码压缩工具,支持ES6+语法,因此被很多构建工具内置使用。webpack安装后会内置Terser,当启用生产环境后即可用其进行代码压缩。

我们可以前往官网尝试其压缩效果:

Terser官网:terser.org/

简单尝试一例:

一招骚操作,改变经Terser.js压缩后的代码的运行效果

可见,其将没有使用到的变量声明和函数申明全都去除了,减少了代码量,达到压缩效果。

可是一旦遇到副作用函数,或者Terser本身无法判断其是否有副作用,将会保留该函数,示例如下:

一招骚操作,改变经Terser.js压缩后的代码的运行效果

对于Math.random()Terser无法判断其是否有副作用,为保证压缩后不影响运行效果,选择了将其保留;但同时,会明确干掉没引用的变量fn

可以看出,Terser的压缩,都是在保证不影响源代码运行的前提下,尽可能压缩代码。

但是,如果从原型入手,可以很容易导致压缩后的代码跟源代码运行不一致。

在示例之前,我们先看以下代码:

一招骚操作,改变经Terser.js压缩后的代码的运行效果 看上去没毛病。现在骚操作来了,如果我动了原型,改成如下代码:

一招骚操作,改变经Terser.js压缩后的代码的运行效果 我们知道,1+[]会调用数组的toString方法,控制台最终会打印出数字1。但是Terser将其当成无效声明给剔除了,这意味着压缩后的代码将不再出现打印。也就是说,通过原型更改,可以导致压缩后的代码跟源代码的最终运行效果不一致!

因为webpack内置了terser-webpack-plugin插件,生产环境下会自动用其压缩代码,所以以上问题依旧会出现。