如何使用Google Closure Compiler对Kotlin JS做优于Webpack的压缩优化
是否可以使用Google Closure Compiler对Kotlin JS代码实现比Webpack更好的压缩效果?
结论
完全可以。Google Closure Compiler(以下简称GCC)的压缩效果普遍优于Webpack默认的Terser压缩方案,尤其是Kotlin/JS官方原生集成了GCC支持,在高级压缩模式下,最终产物体积通常比Webpack默认压缩小15%~35%,死代码剔除、标识符混淆的力度都更强。
具体操作步骤
Kotlin/JS的GCC集成不需要手动单独引入GCC工具,官方Gradle插件已经封装了完整能力,操作步骤如下:
- 第一步:修改Kotlin/JS Gradle配置,禁用Webpack默认压缩,开启GCC压缩
在项目的build.gradle.kts中添加如下配置:
kotlin { // 仅支持IR编译器后端,旧的Legacy后端已废弃 js(IR) { browser { // 关闭Webpack默认的Terser压缩,避免重复压缩 webpackTask { minification = false } // 配置GCC压缩规则 dceTask { // 保留入口函数不被GCC删除 keep("com.your.project.package.entry.main") // 配置GCC编译参数 compilerOptions.set(listOf( // 压缩级别可选:WHITESPACE_ONLY / SIMPLE / ADVANCED,级别越高压缩率越高,兼容性要求越高 "--compilation_level=ADVANCED", // 输出的JS语法版本,根据你的业务兼容要求调整 "--language_out=ECMASCRIPT_2020", // 关闭不必要的编译警告,避免构建失败 "--jscomp_off=checkVars", "--jscomp_off=unknownDefines" )) } binaries.executable() } } }
- 第二步:补充JS互操作的保留规则
如果项目存在Kotlin代码导出给原生JS调用、或者Kotlin调用未声明类型的NPM依赖的场景,需要补充对应保留规则避免GCC误混淆:- 给需要对外暴露的Kotlin方法/属性添加
@JsName("自定义名称")注解 - 如果用到无类型声明的第三方JS库,补充GCC externs声明文件,在compilerOptions中通过
--externs=./your-externs.js参数引入 - 不能被混淆的标识符统一添加到dceTask的keep配置中
- 给需要对外暴露的Kotlin方法/属性添加
- 第三步:验证压缩后产物
首次开启高级压缩后建议先测试功能完整性,如果出现运行异常,可以先将压缩级别改为SIMPLE定位问题,该级别压缩率也比Webpack默认压缩高5%~10%,且兼容性和Webpack压缩基本一致,不需要额外补充太多规则。
提示:如果你的项目几乎没有动态JS互操作、所有外部依赖都有完整的类型声明,ADVANCED模式可以达到最优的压缩效果,适合面向生产环境的端侧小体积要求场景。
内容的提问来源于stack exchange,提问作者CLOVIS
相关产品推荐
相关产品推荐

