CanvasRenderingContext2D resetTransform 和 google 闭包编译器

CanvasRenderingContext2D resetTransform and google closure compiler

我偶然发现了 google 闭包编译器、​​高级模式的奇怪行为,我找不到解释:它重命名了 CanvasRenderingContext2D 的函数 resetTransform

由于问题出现在生产代码中,我无法在此处复制粘贴,但我已经能够在此处的案例中重现该问题 https://www.dropbox.com/s/ic9l755dvgkkqv7/case.zip?dl=0

不清楚的问题片段是:

context.resetTransform ()
context.translate ( 0 , canvas.height )

对应编译器输出:

c.a();c.translate(0,b.height);

如果我没记错的话,resetTransform 应该保留它的名字,就像 CanvasRenderingContext2D 的其他成员一样,例如,翻译。 浏览器找不到 "a" 函数并生成 "TypeError: c.a is not a function"

"c" 实际上是 CanvasRenderingContext2D 的一个实例,事实上,如果我将 c.a 更改为 c.resetTransform,脚本将完美运行。

我做错了什么?

在任何地方都找不到关于这个问题的参考资料

目前我使用的是最新的编译器版本,下载自: https://dl.google.com/closure-compiler/compiler-latest.zip

java 版本 si 1.7.0_80,但问题仍然存在,即使使用旧版本

resetTransform 被标记为 experimental feature on mozilla.org which explains why it is not yet present in closure_compiler/externs/browser/html5.js。因此,闭包编译器不知道不缩小该名称。

如果可以 build closure-compiler from source(这很容易做到),那么您可以向 html5.js 添加类似

的内容
/**
 * @return {undefined}
 */
CanvasRenderingContext2D.prototype.resetTransform = function() {};

然后重建编译器。 IIRC,必须重建编译器才能使外部文件的更改生效。

您还可以在 https://github.com/google/closure-compiler/issues/ 提交问题或拉取请求并添加 API.

可能有一种方法可以调用 resetTransform 而无需在高级编译模式下将其缩小。 Closure-compiler 不会缩小通过方括号访问的属性。

(/** Function */mycontext['resetTransform'])();

我从未尝试过,但我认为这会奏效。使闭包编译器对语法满意的确切表达式可能需要一些调整。


instructions for building closure-compiler 目前有点搞砸了。以下是一些基本说明:

获取闭包编译器存储库的本地副本:

git clone https://github.com/google/closure-compiler.git

稍后您可以根据需要使用

更新您的副本
git pull

构建

ant clean
ant jar

检查版本:

java -jar build/compiler.jar --version