저는 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에 대한 네임 스페이스 생성과 관련이 있다고 생각합니다. 오류를 생성 할 때 작업중인 중간 양식을 확인하는 것이 좋습니다.
클로저 컴파일러는 기능 수준의 래퍼 내에 정의 된 개체와 다른 방식으로 전역 수준 개체 정의를 처리합니다. 래퍼 클로저 안에 있지 않을 때 훨씬 더 많은 최적화를 수행합니다. 귀하의 경우 goog.provide와 test1의 정의가 붕괴되므로 오류가 발생하지 않습니다. –
함수 클로저 내부에 test2라는 전역 생성자를 선언 할 이유가 있습니까?정말로 var test2일까요? 형식이 조금 혼란스럽고 실수로 이어질 수 있습니다. 이 어색한 구문을 해결하면 클로저 컴파일러 문제가 해결 될 가능성이 높기 때문에이를 언급합니다. –
@Chris Moschini : 네, 정말 그런 식으로되어 있습니다. – hughdbrown