Dojo 构建中的闭包编译器在 IE11 中使用对象属性值速记创建语法错误

问题描述

我们最近从 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 以专门阻止此操作。目前我看到的唯一解决方案是:

  1. 仅使用简单的优化(可能不是初学者)
  2. 重写代码以防止出现这种情况,因此优化器不会这样做(非常不愿意这样做,因为它是 Dojo 库中的代码,我不清楚这将在多少地方)
  3. 以某种方式更改 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 语法和库如 letconst 它以不符合规范的方式这样做。