Closure Compiler는 JavaScript를 더 빠르게 다운로드하고 실행하는 도구입니다. JavaScript의 진정한 컴파일러입니다. 소스 언어에서 기계 코드로 컴파일하는 대신 JavaScript에서 더 나은 JavaScript로 컴파일됩니다. JavaScript를 구문 분석하고, 분석하고, 죽은 코드를 제거하고, 다시 쓰고 남은 것을 최소화합니다. 또한 구문, 가변 참조 및 유형을 확인하고 일반적인 JavaScript 함정에 대해 경고합니다.
ADVANCED
이외의 편집 모드는 항상 나중에 생각했으며 우리는 이러한 모드를 사용하지 않았습니다. 우리는 다른 도구가 비 ADVANCED
모드에서 비슷하게 성능을 발휘하며 더 넓은 JS 생태계에 더 잘 통합되어 있다고 생각합니다.
클로저 컴파일러는 임의의 JavaScript에 적합하지 않습니다. ADVANCED
모드가 작동하는 JavaScript를 생성하려면 입력 JS 코드를 Closure-Compiler를 염두에두고 작성해야합니다.
클로저 컴파일러는 "전 세계"최적화기입니다. 모든 전 세계 또는 수출 된 변수의 가능한 모든 사용 및 모든 속성 이름의 모든 사용에 대한 정보를 직접 보거나받을 것으로 예상됩니다.
출력 코드를 최대한 작게 만들기 위해 변수 및 속성을 적극적으로 제거하고 이름을 바꿉니다. 글로벌 변수 또는 속성의 사용이 숨겨져있는 경우 출력 JS가 끊어집니다.
Custom Externs 파일을 작성하여 컴파일러에 일부 이름이 변경되지 않도록 지시하여 컴파일의 일부가 아닌 코드로 안전하게 액세스 할 수 있지만, 이는 종종 관리하기가 어렵습니다.
Closure Compiler Property Renaming을 사용하려면 obj[p]
또는 obj.propName
이있는 속성에 지속적으로 액세스해야하지만 둘 다 아닙니다.
정사각형 괄호 (예 : obj[p]
)가있는 속성에 액세스하거나 let {p} = obj;
이것은 컴파일러에서 참조되는 속성의 문자 이름을 숨 깁니다. obj.propName
obj[p]
와 동일한 속성을 지칭하는지 알 수 없습니다. 경우에 따라이 문제를 발견하고 오류로 컴파일을 중지합니다. 다른 경우에는이 문제를 알아 차리지 않고 propName
더 짧은 것으로 바꾸어 출력 JS 코드가 깨졌습니다.
클로저 컴파일러는 전 세계 변수에 대한 전역 변수를 적극적으로 인출하고 전 세계 변수 (예 : myFoo.some.sub.property
> myFoo$some$sub$property
)에 대한 속성 이름을 평평하게합니다.
이 작업을 수행하지 않거나 오류가 발생하면 js 출력이 깨진 경우 오류로 중단하려고하지만 문제를 인식하지 못하고 경고없이 깨진 JS를 생성하는 경우가 있습니다. 이것은 클로저 컴파일러를 염두에두고 명시 적으로 작성되지 않은 코드에서 발생할 가능성이 훨씬 높습니다.
클로저 컴파일러 및 기본적으로 사용하는 외부는 대상 환경이 웹 브라우저 창이라고 가정합니다.
웹 워크 사람들도 지원되지만 실제로 웹 워크 사람이 사용할 수없는 기능을 사용하려고하면 컴파일러가 경고하지 않을 것입니다.
일부 외부 파일과 기능은 NodeJS 환경을 지원하기 위해 Closure Compiler에 추가되었지만 적극적으로 지원되지 않으며 결코 잘 작동하지 않습니다.
goog.module()
및 goog.require()
에서 base.js
()을 사용하지 않는 JavaScript는 선언 및 사용 모듈을 잘 지원하지 않습니다.
ECMAScript import
및 export
구문은 2015 년까지 존재하지 않았습니다. Closure Compiler and closure-library
모듈을 선언하고 사용하기위한 자체 수단을 개발했으며, 이는 모듈을 정의하는 유일한 지원 방법입니다.
이 컴파일러는 ECMAScript 모듈에 대한 이해를 구현하지만 새로운 구문을 사용하도록 Google 프로젝트를 변경하면 변경 비용의 가치가있는 이점을 제공 한 적이 없습니다. Google의 TypeScript 코드는 ECMAScript 모듈을 사용하지만 Closure-Compiler를보기 전에 goog.module()
구문으로 변환됩니다. 따라서 효과적으로 ECMAScript 모듈 지원은 Google 내에서 사용되지 않습니다. 즉, ECMAScript 모듈을 지원하는 데 버그를 알아 차리거나 수정하지 않을 것임을 의미합니다.
입력으로서 CommonJS 모듈에 대한 지원은 과거에 추가되었지만 Google 내에서 사용되지 않았으며 2024 년에 언젠가 완전히 제거 될 가능성이 높습니다.
Closure Compiler는 Google 프로젝트에서 다음을 사용합니다.
매우 큰 JavaScript 응용 프로그램의 코드 크기를 크게 줄입니다.
JS 코드에 오류 및 일반 및/또는 프로젝트 별 모범 사례를 준수하는지 확인하십시오.
사용자가 가시 메시지를 정의하여 해당 버전을 번역 된 버전으로 바꾸어 현지화 된 애플리케이션 버전을 생성 할 수 있습니다.
Transpile Newer JS는 해당 기능에 대한 지원이 부족한 브라우저에서 실행되는 양식으로 기능합니다.
출력 응용 프로그램을 필요에 따라 개별적으로로드 할 수있는 청크로 나눕니다.
참고 :이 청크는 평범한 JavaScript 스크립트입니다. ECMAScript import
및 export
구문을 사용하지 않습니다.
이러한 목표를 달성하려면 폐쇄 컴파일러는 입력에 많은 제한 사항을 제한합니다.
모듈을 선언하고 사용하려면 goog.module()
및 goog.require()
사용하십시오.
ES6에 추가 된 import
및 export
구문에 대한 지원은 적극적으로 유지되지 않습니다.
주석에 주석을 사용하여 유형 정보를 선언하고 컴파일러가 일부 코드 패턴 (예 : @nocollapse
및 @noinline
)을 중단하지 않기 위해 필요한 정보를 제공합니다.
Dot-Access (예 : object.property
) 만 사용하거나 동적 액세스 (예 : object[propertyName]
또는 Object.keys(object)
) 만 사용하여 특정 객체 유형의 속성에 액세스하십시오.
이것들을 혼합하면 컴파일러에서 속성의 일부 사용을 숨기고 속성 이름을 바꿀 때 출력 코드가 부러집니다.
일반적으로 컴파일러는 전체 애플리케이션을 단일 컴파일로 볼 수 있습니다. 컴파일 장치 외부의 코드와의 상호 작용을 허용하려면 인터페이스를 신중하고 명시 적으로 구성해야합니다.
컴파일러는 모든 변수와 속성의 모든 용도를 볼 수 있다고 가정하고 사용하지 않은 것처럼 보이면 자유롭게 이름을 바꾸거나 제거합니다.
외부 파일을 사용하여 변수 또는 속성을 제거하거나 이름을 바꾸지 말아야 할 변수 또는 속성을 컴파일러에게 알립니다.
표준 JS 및 DOM Global API를 선언하는 기본 외부 파일이 있습니다. 덜 일반적인 API를 사용하거나 컴파일중인 코드에서 API에 액세스하기 위해 외부 JavaScript 코드를 기대하는 경우 더 많은 Externs 파일이 필요합니다.
컴파일러를 설치하는 가장 쉬운 방법은 NPM 또는 원사입니다.
yarn global add google-closure-compiler
# OR
npm i -g google-closure-compiler
패키지 관리자는 바이너리를 연결하고 다음과 함께 컴파일러에 액세스 할 수 있습니다.
google-closure-compiler
이것은 인터랙티브 모드에서 컴파일러를 시작합니다. 유형:
var x = 17 + 25 ;
Enter
, 그런 다음 Ctrl+Z
(Windows) 또는 Ctrl+D
(Mac/Linux)를 누른 다음 다시 Enter
하십시오. 컴파일러는 컴파일 된 출력 (기본적으로 SIMPLE
모드 사용)으로 응답합니다.
var x = 42 ;
컴파일러의 사전 컴파일 된 릴리스도 Maven을 통해 제공됩니다.
클로저 컴파일러에는 파일에서 입력을 읽고, 파일에 출력을 쓰고, 코드 확인 및 최적화 실행을위한 많은 옵션이 있습니다. JS 프로그램 압축의 간단한 예는 다음과 같습니다.
google-closure-compiler --js file.js --js_output_file file.out.js
모든 소스 코드 (여러 스크립트 컴파일 참조)를 제공하면 ADVANCED
최적화를 사용할 수있게되면 컴파일러의 최대 이점을 얻습니다.
google-closure-compiler -O ADVANCED rollup.js --js_output_file rollup.min.js
참고 : 아래의 출력은 예제이며 최신 상태가 아닙니다. 플래그 및 옵션 위키 페이지는 각 릴리스에서 업데이트됩니다.
컴파일러의 모든 옵션을 보려면 다음을 입력하십시오.
google-closure-compiler --help
--flag | 설명 |
---|---|
--compilation_level (-O) | 사용할 컴파일 레벨을 지정합니다. 옵션 : BUNDLE , WHITESPACE_ONLY , SIMPLE (기본값), ADVANCED |
--env | 내장 외부 세트를로드 할 수 있습니다. 옵션 : BROWSER , CUSTOM . 기본값은 BROWSER 에 있습니다. |
--externs | JavaScript가 포함 된 파일은 외부입니다. 여러 가지를 지정할 수 있습니다 |
--js | JavaScript 파일 이름. 여러 가지를 지정할 수 있습니다. args는 기본적으로 파일로 해석되므로 플래그 이름은 선택 사항입니다. Minimatch 스타일의 글로벌 패턴을 사용할 수도 있습니다. 예를 들어, _test.js 에서 끝나지 않는 모든 JS 파일을 재귀 적으로 포함시키기 위해 --js='**.js' --js='!**_test.js' 사용하십시오. |
--js_output_file | 기본 출력 파일 이름. 지정되지 않은 경우 출력은 stdout에 기록됩니다. |
--language_in | 입력 소스가 준수 해야하는 언어 사양을 설정합니다. 옵션 : ECMASCRIPT3 , ECMASCRIPT5 , ECMASCRIPT5_STRICT , ECMASCRIPT_2015 , ECMASCRIPT_2016 ECMASCRIPT_NEXT ECMASCRIPT_2017 , ECMASCRIPT_2018 , STABLE , ECMASCRIPT_2019 |
--language_out | 출력이 준수 해야하는 언어 사양을 설정합니다. 옵션 : ECMASCRIPT3 , ECMASCRIPT5 , ECMASCRIPT5_STRICT , ECMASCRIPT_2015 , ECMASCRIPT_2016 , ECMASCRIPT_2017 , ECMASCRIPT_2018 , ECMASCRIPT_2019 , STABLE |
--warning_level (-W) | 사용할 경고 수준을 지정합니다. 옵션 : QUIET DEFAULT , VERBOSE |
google-closure-compiler
가져 오면 JS 프로그램의 컴파일러에 액세스 할 수 있습니다.
import closureCompiler from 'google-closure-compiler' ;
const { compiler } = closureCompiler ;
new compiler ( {
js : 'file-one.js' ,
compilation_level : 'ADVANCED'
} ) ;
이 패키지는 대부분의 경우 기본 Graal Binary에 대한 프로그램 액세스를 제공하며 그렇지 않으면 Java 버전으로 돌아갑니다.
여러 스크립트가있는 경우 하나의 컴파일 명령과 함께 모두 컴파일해야합니다.
google-closure-compiler in1.js in2.js in3.js --js_output_file out.js
Minimatch 스타일의 글로브를 사용할 수도 있습니다.
# Recursively include all js files in subdirs
google-closure-compiler ' src/**.js ' --js_output_file out.js
# Recursively include all js files in subdirs, excluding test files.
# Use single-quotes, so that bash doesn't try to expand the '!'
google-closure-compiler ' src/**.js ' ' !**_test.js ' --js_output_file out.js
클로저 컴파일러는 명령 줄에서 전달 된 순서대로 파일을 연결합니다.
Globs 또는 많은 파일을 사용하는 경우 스크립트 간의 종속성 관리에 문제가 발생할 수 있습니다. 이 경우 스크립트 간의 종속성을 시행하기위한 기능을 제공하는 포함 된 lib/base.js를 사용해야합니다 (즉, goog.module
및 goog.require
). 클로저 컴파일러는 입력을 자동으로 다시 주문합니다.
클로저 컴파일러는 Lib/Base.js로 릴리스되어 JavaScript 기능 및 클로저 컴파일러의 특정 기능을 가능하게하는 원시적 인 변수를 제공합니다. 이 파일은 곧 더 이상 사용되지 않은 폐쇄 라이브러리에서 동일하게 명명 된 base.js의 파생물입니다. 이 base.js
앞으로 클로저 컴파일러를 통해 지원되며 새로운 기능을받을 수 있습니다. 인식 된 핵심 부품 만 유지하도록 설계되었습니다.
컴파일러를 직접 구축하려면 다음이 필요합니다.
전제 조건 | 설명 |
---|---|
Java 11 이상 | 컴파일러의 소스 코드를 컴파일하는 데 사용됩니다. |
nodejs | Java 컴파일이 사용하는 리소스를 생성하는 데 사용됩니다 |
git | Bazel에서 의존성을 다운로드하는 데 사용됩니다. |
바젤 리스크 | 다양한 컴파일러 대상을 구축하는 데 사용됩니다. |
Bazelisk는 주어진 저장소에 대해 적절한 버전의 바젤을 동적으로로드하는 바젤 주변의 래퍼입니다. IT를 사용하면 잘못된 버전의 Bazel을 사용하여 컴파일러를 구축하여 발생하는 가짜 오류를 방지 할뿐만 아니라 다른 프로젝트에 다른 Bazel 버전을 쉽게 사용할 수 있습니다.
Bazelisk는 많은 패키지 관리자를 통해 제공됩니다. 가장 편한 사람을 자유롭게 사용하십시오.
Bazelisk 설치 지침.
$ bazelisk build //:compiler_uberjar_deploy.jar
# OR to build everything
$ bazelisk build //:all
테스트는 비슷한 방식으로 실행될 수 있습니다. 다음 명령은 Repo에서 모든 테스트를 실행합니다.
$ bazelisk test //:all
수백 가지의 개별 테스트 목표가 있으므로 이들 모두를 실행하는 데 몇 분이 걸립니다. 개발하는 동안 일반적으로 관심있는 정확한 테스트를 지정하는 것이 좋습니다.
bazelisk test //: $path_to_test_file
Bazel IDE 통합을 참조하십시오.
컴파일러가 구축되면 컴파일 된 JAR은 bazel-bin/
Directory에 있습니다. java -jar ...
또는 package.json 스크립트를 사용하여 호출하여 액세스 할 수 있습니다.
# java -jar bazel-bin/compiler_uberjar_deploy.jar [...args]
yarn compile [...args]
src/com/google/javascript/jscomp/CommandLineRunner.java
클래스를 열거 나 자신만의 확장 버전의 클래스를 만듭니다.그러나 당신은 공헌하기로 선택하고, 우리의 행동 강령을 따르십시오. 우리 지역 사회를 건강하고 환영하는 장소로 유지하십시오.
Copyright 2009 클로저 컴파일러 저자.
Apache 라이센스, 버전 2.0 ( "라이센스")에 따라 라이센스가 부여되었습니다. 라이센스를 준수하는 것 외에는이 파일을 사용할 수 없습니다. http://www.apache.org/licenses/license-2.0에서 라이센스 사본을 얻을 수 있습니다.
해당 법률에 의해 요구되거나 서면에 동의하지 않는 한, 라이센스에 따라 배포 된 소프트웨어는 명시 적 또는 묵시적 보증 또는 조건없이 "그대로"기준으로 배포됩니다. 라이센스에 따른 특정 언어 통치 권한 및 제한 사항에 대한 라이센스를 참조하십시오.
코드 경로 | src/com/google/javascript/rhino , test/com/google/javascript/rhino |
URL | https://developer.mozilla.org/en-us/docs/mozilla/projects/rhino |
버전 | 1.5R3, 심한 수정 |
특허 | Netscape Public License 및 MPL / GPL 듀얼 라이센스 |
설명 | Mozilla Rhino의 일부 사본. Mozilla Rhino는 JVM의 JavaScript 구현입니다. JavaScript Parse 트리 데이터 구조는 Google의 JavaScript 컴파일러에서 사용하기 위해 크게 추출하고 수정되었습니다. |
로컬 수정 | 패키지는 RenamePaced되었습니다. 구문 분석 트리와 관련이없는 모든 코드가 제거되었습니다. JSDOC 파서 및 정적 타이핑 시스템이 추가되었습니다. |
URL | http://args4j.kohsuke.org/ |
버전 | 2.33 |
특허 | MIT |
설명 | Args4J는 CUI 응용 프로그램에서 명령 줄 옵션/인수를 쉽게 구문 분석 할 수있는 작은 Java 클래스 라이브러리입니다. |
로컬 수정 | 없음 |
URL | https://github.com/google/guava |
버전 | 31.0.1 |
특허 | 아파치 라이센스 2.0 |
설명 | Google의 핵심 Java 라이브러리. |
로컬 수정 | 없음 |
URL | https://github.com/findbugsproject/findbugs |
버전 | 3.0.1 |
특허 | BSD 라이센스 |
설명 | 소프트웨어 결함 탐지를위한 주석. |
로컬 수정 | 없음 |
URL | http://junit.org/junit4/ |
버전 | 4.13 |
특허 | 일반적인 공개 라이센스 1.0 |
설명 | Java에서 자동 테스트를 작성하고 실행하기위한 프레임 워크. |
로컬 수정 | 없음 |
URL | https://github.com/google/protobuf |
버전 | 3.0.2 |
특허 | 새로운 BSD 라이센스 |
설명 | 프로토콜 버퍼를위한 라이브러리 지원, 구조화 된 데이터의 인코딩. |
로컬 수정 | 없음 |
URL | https://github.com/google/re2j |
버전 | 1.3 |
특허 | 새로운 BSD 라이센스 |
설명 | 선형 시간 자바에서 일치하는 정규 표현. |
로컬 수정 | 없음 |
URL | https://github.com/google/truth |
버전 | 1.1 |
특허 | 아파치 라이센스 2.0 |
설명 | Java 단위 테스트를위한 어설 션/제안 프레임 워크 |
로컬 수정 | 없음 |
URL | https://ant.apache.org/bindownload.cgi |
버전 | 1.10.11 |
특허 | 아파치 라이센스 2.0 |
설명 | 개미는 자바 기반 빌드 도구입니다. 이론적으로는 Make의 주름없이 "Make"와 같은 순수한 Java 코드의 완전한 휴대 성이 있습니다. |
로컬 수정 | 없음 |
URL | https://github.com/google/gson |
버전 | 2.9.1 |
특허 | 아파치 라이센스 2.0 |
설명 | JSON을 Java 개체로 변환하는 Java 라이브러리 및 그 반대로 |
로컬 수정 | 없음 |
코드 경로 | contrib/nodejs |
URL | https://github.com/dcodeio/node.js-closure-compiler-externs |
버전 | E891B4FBCF5F466C4307B0FA842A7D8163A073A |
특허 | Apache 2.0 라이센스 |
설명 | Nodejs API에 대한 계약을 유형하십시오 |
로컬 수정 | NPMCommandLinerUnner와 호환되도록 실질적인 변경. |