2017-04-03 68 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