2

Google Closure Compiler로 난독 화 된 상태에서도이 코드 구조가 유지되는 데 문제가 있습니다. 여기에 몇 가지 예제 코드입니다 : 자바 스크립트 모듈 패턴, 프로토 타입 및 Google Closure

var MyModule = (function() 
{ 
    function myModule() 
    { 
     // Constructor 
    } 

    function moduleFoo(url) 
    { 
     // Method 
    } 

    function moduleBar() 
    { 
     // Method 
    } 

    myModule.prototype = { 
     constructor: myModule, 
     foo: moduleFoo, 
     bar: moduleBar 
    }; 

    return myModule; 

})(); 

는 다른 곳에서 내 코드에서 나는 다음과 같은 것들을 쓸 수 필요

var myMod = new MyModule(); 
myMod.foo(); 
myMod.bar(); 

하지만 (예상대로) 컴파일러가 모든 이름을 변경한다. 난독 화 후에 코드에서 다른 곳에서 정의한 프로토 타입을 어떻게 만들 수 있습니까? 나는 다음과 같이 내보내기를 시도했다.

// In place of the prototype object above 
myModule.prototype['constructor'] = myModule; 
myModule.prototype['foo'] = moduleFoo; 
myModule.prototype['bar'] = moduleBar; 

window['myModule'] = myModule; 

그러나 프로토 타입 메소드가 호출되거나 해당 클로저가 실행될 때 문제가있는 것으로 보인다.

도움을 주시면 감사하겠습니다.

답변

3

이 정확한 패턴은 ADVANCED_OPTIMIZATIONS를 사용하는 클로저 컴파일러에서 제대로 작동하지 않습니다. 대신, 당신은 약간의 코드를 리팩토링해야합니다 귀하의 수출이 제대로 작동합니다 위의 방법 중 하나를 사용하여

/** @const */ 
var MyNamespace = {}; 

(function() { 
    /** @constructor */ 
    MyNamespace.MyModule = function() {}; 

    MyNamespace.MyModule.prototype = { 
     constructor: function() {}, 
     foo: function(url) {}, 
     bar: function() {} 
    }; 
})(); 

:

/** @constructor */ 
function MyModule() 
{ 
    // Constructor 
} 

(function() { 
    function moduleFoo(url) 
    { 
     // Problem using "this" keyword. Will require @this annotation. 
    } 

    MyModule.prototype = { 
     foo: moduleFoo 
    }; 

    MyModule.prototype.bar = function() { 
     // "this" keyword works fine. 
    }; 
})(); 

또는 같은합니다.

참고 : 두 번째 옵션은 지난 주 방금 수정 된 버그가 포함되어 있기 때문에 최신 소스에서 작성된 컴파일러에서만 작동합니다.