我偶然发现谷歌闭包编译器,ADVANCED模式的奇怪行为,我无法找到解释:它重命名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不是函数"
" C"实际上,如果我将c.a更改为c.resetTransform,则该脚本实际上是一个CanvasRenderingContext2D的实例。
我做错了什么?
在任何地方都找不到关于这个问题的引用
目前我正在使用最新的编译器版本,从以下网址下载: https://dl.google.com/closure-compiler/compiler-latest.zip
java version si 1.7.0_80,但问题仍然存在,即使是较旧的
答案 0 :(得分:1)
resetTransform
在mozilla.org上被标记为experimental feature,这解释了closure_compiler/externs/browser/html5.js
中尚未出现的原因。因此,Closure-compiler不知道不缩小该名称。
如果你可以build closure-compiler from source(很容易做到),那么你可以添加html5.js
之类的内容
/**
* @return {undefined}
*/
CanvasRenderingContext2D.prototype.resetTransform = function() {};
然后重建编译器。 IIRC,必须重建编译器以更改externs文件才能产生任何效果。
您还可以使用添加的API在https://github.com/google/closure-compiler/issues/处提交问题或提取请求。
可能有一种方法可以在高级编译模式下调用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