2017-04-03 55 views
0

我需要在高级模式下使用闭包编译器编译我的代码。我还需要在我的应用程序中保留我的对象的原型,因为我正在循环使用Javascript对象原型。尝试在启动应用程序时在一些ReferenceError中得到两个结果。在ADVANCED模式下保存原型

使用ADVANCED模式进行编译时,某些原型会被删除并替换为使用对象参数恢复“this”关键字的函数。这是由CompilerOptions.java的crossModuleCodeMotionNoStubMethods属性造成的。在编译之前的代码

例:编译后的代码

function MyClass() = { // Some code } 
MyClass.prototype.someFunc = function() { // Some code calling someOtherFunc }; 
MyClass.prototype.someOtherFunc = function(someParam) { // Some code }; 

例子:

function MyCompiledClass = { // Some code } 
MyCompiledClass.prototype.someCompiledFunc = function() { // Some code calling someOtherFunc } 
function someOtherCompiledFunc(that, someParam) = { // Some code } 

我第一次尝试使用@this和@preserve JSDoc标签来解决这个问题,但没有成功。使用@export不是解决方案,因为函数将保留它们的原始名称。

我发现两个选项来解决我的问题,现在:

  1. 重构所看到here
  2. 构建关闭编译器的定制版本所看到的代码here

选项1将需要在我的代码中进行大量修改,并且会使其不易读,如果它是唯一的解决方案,那么我将为此做好准备。

选项2似乎是一个很好的解决方法,但我读过CompilationLevel.java上的一些更改可能会违反编译器的一些核心假设。有人可以告诉我,如果修改setCrossModuleMethodMotion从真到假,它是否仍然尊重编译器的所有核心假设?

我目前正在构建编译器的自定义版本,以检查代码是否正确编译,但即使代码可用,我也需要确保它会被正确模糊处理。

谢谢!

回答

0

您所指的具体优化过程是DevirtualizePrototypeMethods。阻止优化的最好方法是使用@nocollapse注释。它将允许你的方法被重新命名,但不允许它从原型中移除。

我不是100%肯定它会为这种情况下工作,但如果没有它应该和您可以提出问题,以有固定的:https://github.com/google/closure-compiler/issues

+0

我我的文章,它是'DevirtualizePrototypeMethods',是造成我一些麻烦后发现。 我刚刚尝试使用'@ nocollapse',但没有成功。我甚至为构造函数描述了“构造函数”,并且为原型描述了“@ this”,以将它们与我的构造函数关联起来。 我也检查了编译器版本:20170218.0.0。 现在,我的quickfix在我的闭包编译器自定义版本中将'DevirtualizePrototypeMethods'设置为'false'。 因为我的代码是专有的,我该如何帮助您解决问题?除了用户端,我没有关于闭包编译器的知识;) –

+0

我可以说'@ nocollapse'正在为Javascript对象属性工作,比如'MyClass.myProperty'。但它不适用于像MyClass.prototype.myAttribute这样的属性。我刚刚遇到与JavaScript对象属性相同的问题,您的解决方案可以正常工作。 –

+0

我建议提交一个问题。 '@ nocollapse'是阻止这种优化而不阻止重命名的正确方法。 –

0

可以导出构造函数和原型属性以相同的方式。 例如:

MyClass = function(name) { 
 
    this.myName = name; 
 
}; 
 
MyClass.prototype.myMethod = function() { 
 
    alert(this.myName); 
 
}; 
 
window['MyClass'] = MyClass; // <-- Constructor 
 
MyClass.prototype['myMethod'] = MyClass.prototype.myMethod;

正如https://developers.google.com/closure/compiler/docs/api-tutorial3