背景
在自研打包工具的过程中,发现有时会碰到不同的编译工具处理相同的代码,其大小差距可能很大,追查下来大部分是和不同工具对代码优化的处理方式不同所致。目前大部分js打包工具都支持的一种优化即treeshaking,但是不幸的是treeshaking没有比较标准的定义,各个打包工具的treeshaking实现又不尽相同。
术语
Treeshaking在不同工具里的意义不太统一,为了统一后续讨论,我们规范各个术语。
minify:编译优化手段,指在不影响代码语义的情况下,尽可能的减小程序的体积,常见的minify工具如terser、uglify,swc和esbuid也自带minify功能。
Deadcodeelimination(DCE):即死代码优化,一种编译器优化手段,用于移除不影响程序结果的代码,实现DCE的手段有很多种,如constfolding(常量折叠)、Controlflowanalysis、也包括下面的LTO。
LinkTimeOptimization:指link期优化的手段,可以进行跨模块的分析优化,如可以分析模块之间的引用关系,删掉其他模块未使用的导出变量,也可以进行跨模块对符号进行mangle。