使用google-closure-compiler切换输出语言规范时报$jscomp未定义错误
报错原因
该报错属于Google Closure Compiler的预期行为,并非编译器Bug:当你配置--language_out ECMASCRIPT5将代码降级到ES5规范时,for...of这种ES6新增的迭代语法无法直接转译为原生ES5代码,编译器会依赖内部的$jscomp运行时辅助函数实现等价逻辑,默认配置下这些辅助函数不会自动打包到输出文件中,因此运行时会报未定义错误。
无额外依赖的解决方案
以下方案均不需要引入项目外的第三方依赖:
- 方案1:新增
--inject_libraries编译参数
该参数会让编译器自动将本次编译用到的$jscomp辅助函数直接注入到输出的JS文件中,不会生成额外的依赖文件。调整后的编译命令如下:
注入的辅助函数体积极小,不会对最终包体积造成明显影响,是优先级最高的选择。java -jar closure-compiler-v20211006.jar -W VERBOSE -O WHITESPACE_ONLY --language_out ECMASCRIPT5 --inject_libraries $script_path_in --js_output_file $script_path_tmp - 方案2:显式指定输入代码的语言版本为ES5
如果你可以确认所有输入的JS代码本身就符合ES5规范,没有用到任何ES6+特性,可以新增--language_in ECMASCRIPT5参数,编译器会跳过语法降级流程,不会生成依赖$jscomp的代码。 - 方案3:手动替换ES6语法为ES5原生语法
不想修改编译参数的话,可以直接把代码中的for...of循环改写为ES5支持的普通循环,示例如下:
改写后再编译也不会触发运行时依赖注入逻辑。for(var i = 0; i < extraProperties.length; i++){ var extraProperty = extraProperties[i]; option.setAttribute(extraProperty,initialOption[extraProperty]); }
内容的提问来源于stack exchange,提问作者diabolusss
相关产品推荐
相关产品推荐

