2011-09-21 3 views
-1

저는 Google 컴파일러를 사용하여 최소화하기 위해 자바 스크립트를 대량으로 컴파일하려고 노력하면서 Google 클로저로 작업 해 왔습니다. 그래도 문제가 발생했습니다 :클로저 컴파일러는 클로저 내부의 정의를 재정의로 처리합니다.

goog.provide('test'); 
goog.provide('test2'); 

/** 
* @constructor 
*/ 
test = function() { 
    this.x = 10; 
    this.y = 13; 
}; 

(function() { 
    /** 
    * @constructor 
    */ 
    test2 = function() { 
     this.x = 10; 
     this.y = 13; 
    }; 
})(); 

전 괜찮습니다. 후자는 상수 재정의 오류를 생성합니다 :

JSC_CONSTANT_REASSIGNED_VALUE_ERROR. constant test2 assigned a value more than once at /home/hbrown/tmp/closure-test/foo.js line 16 : 10 
BUILD FAILED: 1 error(s), 0 warning(s) 

이 구조를 허용하기 위해 plovr/closure 컴파일러를 강요하는 방법이 있습니까? 나는 주변을 둘러 보았고 아무 것도 발견하지 못했습니다.


나중에 : closure/plovr이 test2를 상수로 생각하는 이유는 무엇입니까? goog.provide가 호출 될 때 plovr/closure의 test2에 대한 네임 스페이스 생성과 관련이 있다고 생각합니다. 오류를 생성 할 때 작업중인 중간 양식을 확인하는 것이 좋습니다.

+0

클로저 컴파일러는 기능 수준의 래퍼 내에 정의 된 개체와 다른 방식으로 전역 수준 개체 정의를 처리합니다. 래퍼 클로저 안에 있지 않을 때 훨씬 더 많은 최적화를 수행합니다. 귀하의 경우 goog.provide와 test1의 정의가 붕괴되므로 오류가 발생하지 않습니다. –

+0

함수 클로저 내부에 test2라는 전역 생성자를 선언 할 이유가 있습니까?정말로 var test2일까요? 형식이 조금 혼란스럽고 실수로 이어질 수 있습니다. 이 어색한 구문을 해결하면 클로저 컴파일러 문제가 해결 될 가능성이 높기 때문에이를 언급합니다. –

+0

@Chris Moschini : 네, 정말 그런 식으로되어 있습니다. – hughdbrown

답변

0

코드에 대한 의견이 끔찍하기 때문에 이것을 추측 일지라도 답변으로 입력하겠습니다.

test2 = (function() { 
    /** 
    * @constructor 
    */ 
    function inner_test2() { 
     this.x = 10; 
     this.y = 13; 
    }; 

    // ... 

    return inner_test2; 
})(); 

나는 그 익명 함수가 크고 복잡한 경우에 특히 편리 리팩토링의 제안 않겠지 만 흥미 (정렬의) 것 :

당신은 이런 식으로 뭔가를 시도 그것이 컴파일러를 혼란스럽게하는지 알기 위해서입니다.

+0

이 이디엄을 사용하는 ~ 900 개의 파일이 있습니다. 나는 개발의이 단계에서 많은 양의 코드를 변경하는 것보다 closure/plovr를 구성하는 방법을 찾기가 쉽지 않다. – hughdbrown

+0

예, 제가 말했듯이 나는 실험의 관점에서 생각하고있었습니다. 그 밖의 것이 없다면 좋은 버그 보고서를 작성하는 데 도움이 될 것입니다 :-) 아마 커뮤니티 Wiki에서 "대답"을해야합니다. – Pointy

0

당신은 익명 함수가 필요한 이유에 따라, 당신이 그것을 할당하지 않고 goog.scope 함수 클로저 외부

http://closure-library.googlecode.com/svn/docs/closure_goog_base.js.html

+0

이전에 코드를 변경했을 때했던 주석을 되풀이하는 것이 적절하다고 생각합니다. "이 이디엄을 사용하는 ~ 900 개의 파일이 있습니다.이 코드에서 많은 코드를 변경하는 것보다 closure/plovr를 구성하는 방법을 찾기가 훨씬 쉬울 것입니다. 개발 단계. " 저쪽에, 나는 이것이 나의 문제를 어떻게 다루는 지 알지 못한다. 그리고 모든 폐쇄 라이브러리에서 goog.scope의 용도는 없습니다. – hughdbrown

+0

goog.scope를 사용하거나 다른 변경 사항을 적용하지 않으려면 버그/기능 요청을 제출하는 것이 가장 좋습니다. http://code.google.com/p/closure-compiler/issues/list 즉시 익명 폐쇄라는 형식 선언을 인식하고 goog.provide'd 이름 공간을 일정하게 유지하는 것은 비교적 최근의 변화입니다. 최근에 변경된 동작이 있는지 확인하려면 트리 맨 위의 컴파일러 버전을 확인하는 것이 좋습니다. – John

0

선언 테스트 2와 익명 함수를 대체하려고 할 수 있습니다

var test2; 

(function() { 
    test2 = function(... 

나는 이것이 당신이 원한 것처럼 클로저 컴파일러 구성 변경이 아니라는 것을 알고 있지만, 코드 가독성을 개선하고 클로저 컴파일러의 이의를 해결할 것입니다.

Closure Compiler를 사용하면 실제로 Google 내부 자바 스크립트 코드 가이드 라인을 사용할 수 있습니다. 따라서 예를 들어 with 문은 정책을 위반하기 때문에 사용할 수 없습니다. 일반 사용자가 코드를 축소하기 만하고 회사의 with 문을 허용하는 정책을 가지고있을지라도.

그렇긴해도, 글로벌 클로우즈를 함수 클로저로 선언하는 것이 합법적 인 자바 스크립트 라 할지라도 필자는 최선의 방법이라고 생각한다. 그리고 /(\w[\w\d-]+) = function/을 찾고 주위에있는 var로 선언하는 스크립트를 작성하는 것은 그리 어렵지 않을 것입니다. 그리고 아마 모든 파일이 주어진 파일에 새로운 코더에 의해 분석되기 쉬운 방식으로 수정 될 것입니다.

나머지 옵션은 오픈 소스 폐쇄 컴파일러 코드를 수정하여 Google JS 정책 위반에 대한 오류 대신 경고합니다.