【发布时间】:2017-07-09 00:34:05
【问题描述】:
我需要在高级模式下使用闭包编译器编译我的代码。我还需要在我的应用程序中保留对象的原型,因为我正在循环使用 Javascript 对象原型。在启动应用程序时尝试同时获取这两个结果会导致一些 ReferenceError。
当使用 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 从 true 修改为 false,它是否仍然尊重编译器的所有核心假设?
我目前正在构建一个自定义版本的编译器,以检查代码是否正确编译,但即使代码可用,我也需要确保它会被正确混淆。
谢谢!
【问题讨论】:
标签: javascript google-closure-compiler