我需要在高级模式下使用闭包编译器编译我的代码。我还需要在我的应用程序中保留我的对象的原型,因为我正在循环使用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将需要在我的代码中进行大量修改,并且会使其不易读,如果它是唯一的解决方案,那么我将为此做好准备。
选项2似乎是一个很好的解决方法,但我读过CompilationLevel.java上的一些更改可能会违反编译器的一些核心假设。有人可以告诉我,如果修改setCrossModuleMethodMotion从真到假,它是否仍然尊重编译器的所有核心假设?
我目前正在构建编译器的自定义版本,以检查代码是否正确编译,但即使代码可用,我也需要确保它会被正确模糊处理。
谢谢!
我我的文章,它是'DevirtualizePrototypeMethods',是造成我一些麻烦后发现。 我刚刚尝试使用'@ nocollapse',但没有成功。我甚至为构造函数描述了“构造函数”,并且为原型描述了“@ this”,以将它们与我的构造函数关联起来。 我也检查了编译器版本:20170218.0.0。 现在,我的quickfix在我的闭包编译器自定义版本中将'DevirtualizePrototypeMethods'设置为'false'。 因为我的代码是专有的,我该如何帮助您解决问题?除了用户端,我没有关于闭包编译器的知识;) –
我可以说'@ nocollapse'正在为Javascript对象属性工作,比如'MyClass.myProperty'。但它不适用于像MyClass.prototype.myAttribute这样的属性。我刚刚遇到与JavaScript对象属性相同的问题,您的解决方案可以正常工作。 –
我建议提交一个问题。 '@ nocollapse'是阻止这种优化而不阻止重命名的正确方法。 –