我需要在高級模式下使用閉包編譯器編譯我的代碼。我還需要在我的應用程序中保留我的對象的原型,因爲我正在循環使用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'是阻止這種優化而不阻止重命名的正確方法。 –