问题描述
我们最近从 Dojo 1.10 升级到 Dojo 1.16。 (是的,最近。)这是 Closure 编译器的更新版本,这很棒,因为我们的构建经常被数组中可接受的尾随逗号破坏。但是现在业务允许我们只支持 11 版的 IE,我们可以升级了。
我很高兴我们能够使用更多的 ES6,因为之前的闭包不允许 let、const 等。但是,当给出这种结构时:
return {l: l,t: t,w: node.offsetWidth + me.w,h: node.offsetHeight + me.h};
编译器会(可能?)将其简化为:
return{l,t:g,w:a.offsetWidth+c.w,h:a.offsetHeight+c.h}};
问题是它使用有效的 ES6 速记将 l: l
简化为 l
,但 IE11 无法识别这一点,因此我们的代码在此处给出了语法错误。
我对此进行了大量搜索,但看不到是否有任何配置可以应用于 Closure 以专门阻止此操作。目前我看到的唯一解决方案是:
- 仅使用简单的优化(可能不是初学者)
- 重写代码以防止出现这种情况,因此优化器不会这样做(非常不愿意这样做,因为它是 Dojo 库中的代码,我不清楚这将在多少地方)
- 以某种方式更改 Closure 活动? (如果没有配置选项,我可能不知道如何/能够做到这一点)
查看现有配置,我找到了这些并尝试将它们添加到我的优化器选项中:
optimizeOptions: {
'coalesceVariableNames': false,'collapseProperties': false,'collapseVariableDeclarations': false,'removeDeadCode': false,'rewriteFunctionExpressions': false,'smartNameRemoval': false
},
这似乎确实有所作为,但只是因为它这次将代码转换为 return{l:t,t:q,w:a.offsetWidth+m.w,h:a.offsetHeight+m.h}};
,所以我不知道我是否真的修复了它,或者这次它决定将变量 l
更改为 t
,它只是将问题推迟到将来某个未知点。
解决方法
IE11 不支持 EcmaScript 6*,请确保您使用的是适当的“language_out”,即“ECMASCRIPT5”,编译器会将其翻译为 IE11 可以理解的内容。
*IE11 所理解的 ES6 语法和库如 let
和 const
它以不符合规范的方式这样做。