閉鎖コンパイラは、JavaScriptのダウンロードをより速く実行するためのツールです。 JavaScriptの真のコンパイラです。ソース言語からマシンコードにコンパイルする代わりに、JavaScriptからより良いJavaScriptにコンパイルします。 JavaScriptを解析し、分析し、死んだコードを削除し、書き直して残っているものを最小限に抑えます。また、構文、可変参照、およびタイプをチェックし、一般的なJavaScriptの落とし穴について警告します。
ADVANCED
以外のコンパイルモードは常に後付けであり、これらのモードを非難しました。他のツールは、非ADVANCED
モードに対して同等に機能し、より広いJSエコシステムによりよく統合されていると考えています。
閉鎖コンパイラは、任意のJavaScriptには適していません。 ADVANCED
Modeを使用して作業JavaScriptを生成するには、閉鎖コンパイラを念頭に置いて入力JSコードを記述する必要があります。
閉鎖コンパイラは、「全世界」オプティマイザーです。すべてのグローバルまたはエクスポートされた変数およびすべてのプロパティ名のすべての可能な使用に関する情報を直接見たり、少なくとも受け取ることを期待しています。
出力コードを可能な限り小さくするために、変数とプロパティを積極的に削除および名前変更します。これにより、グローバル変数またはプロパティの使用が隠されている場合、出力JSが破壊されます。
カスタムExternsファイルを作成して、コンパイラに変更されていないままにしておくようにコンパイラーに指示することができますが、コンパイルの一部ではないコードで安全にアクセスできるようになりますが、これはしばしば維持するのが面倒です。
閉鎖コンパイラプロパティの名前の名前を変更するには、 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を生成する場合があります。これは、閉鎖コンパイラを念頭に置いて明示的に記述されていないコードで発生する可能性がはるかに高くなります。
閉鎖コンパイラとデフォルトで使用する外部は、ターゲット環境がWebブラウザーウィンドウであると仮定します。
ウェブワーカーもサポートされていますが、コンパイラは、実際にはウェブワーカーが利用できない機能を使用しようとすると警告することに失敗する可能性があります。
nodejs環境をサポートするために閉鎖コンパイラにいくつかのExternsファイルと機能が追加されていますが、積極的にサポートされておらず、うまく機能しません。
base.js
からgoog.module()
およびgoog.require()
を使用してモジュールを宣言および使用するJavaScriptは十分にサポートされていません。
ECMAScript import
およびexport
構文は2015年まで存在しませんでした。閉鎖コンパイラとclosure-library
モジュールを宣言および使用するための独自の手段を開発しました。これは、モジュールを定義する唯一のサポートされている方法のままです。
コンパイラはECMAScriptモジュールのある程度の理解を実装していますが、新しい構文を使用するためにGoogleのプロジェクトを変更することは、変更のコストに見合う価値がある利点を提供することはありませんでした。 GoogleのTypeScriptコードはECMAScriptモジュールを使用しますが、閉鎖コンパイラが表示される前にgoog.module()
Syntaxに変換されます。したがって、効果的にECMAScriptモジュールサポートはGoogle内で使用されていません。これは、ECMAScriptモジュールのサポートでバグに気付いたり修正したりする可能性は低いことを意味します。
入力としてのCommonJSモジュールのサポートは過去に追加されましたが、Google内では使用されておらず、2024年に完全に削除される可能性があります。
閉鎖コンパイラは、Googleプロジェクトで使用されます。
非常に大きなJavaScriptアプリケーションのコードサイズを大幅に削減します
JSコードのエラーと、一般的および/またはプロジェクト固有のベストプラクティスへの適合については、確認してください。
ユーザー可視メッセージを定義して、翻訳されたバージョンに置き換えて、アプリケーションのローカライズされたバージョンを作成することを可能にします。
新しいJS機能は、これらの機能をサポートできないブラウザで実行されるフォームに導入します。
出力アプリケーションを、必要に応じて個別にロードできるチャンクに分割します。
注:これらのチャンクは、単純なJavaScriptスクリプトです。 ECMAScriptのimport
およびexport
構文を使用しません。
これらの目標を達成するために、閉鎖コンパイラはその入力に多くの制限を置きます。
goog.module()
とgoog.require()
を使用して、モジュールを宣言および使用します。
ES6に追加されたimport
およびexport
構文のサポートは積極的に維持されていません。
コメントで注釈を使用して、タイプ情報を宣言し、いくつかのコードパターン( @nocollapse
および@noinline
など)を壊すことを避けるためにコンパイラが必要とする情報を提供します。
DOT-Access( object.property
など)のみを使用するか、動的アクセス( object[propertyName]
またはObject.keys(object)
)のみを使用して、特定のオブジェクトタイプのプロパティにアクセスします。
これらを混合すると、コンパイラからプロパティの使用がいくつか隠れているため、プロパティの名前を変更すると出力コードが破壊されます。
一般に、コンパイラはアプリケーション全体を単一のコンパイルと見なすことを期待しています。コンパイルユニットの外側のコードとの相互操作を可能にするために、インターフェイスを慎重かつ明示的に構築する必要があります。
コンパイラは、すべての変数とプロパティのすべての使用を確認できると想定しており、使用されていないように見える場合は自由に名前を変更するか、削除します。
Externsファイルを使用して、削除または名前を変更してはならない変数またはプロパティをコンパイラに通知します。
標準のJSおよびDOMグローバルAPIを宣言するデフォルトのExternsファイルがあります。あまり一般的ではないAPIを使用している場合、またはコンパイルしているコードのAPIにアクセスする外部JavaScriptコードを期待する場合、より多くのExternsファイルが必要です。
コンパイラをインストールする最も簡単な方法は、NPMまたはYARNを使用することです。
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
注:以下の出力は単なる例であり、最新の状態に保たれません。フラグとオプションのWikiページは、リリースごとに更新されます。
コンパイラのすべてのオプションをすべて表示するには、次のように入力してください。
google-closure-compiler --help
--flag | 説明 |
---|---|
--compilation_level (-O) | 使用するコンピレーションレベルを指定します。オプション: BUNDLE 、 WHITESPACE_ONLY 、 SIMPLE (default)、 ADVANCED |
--env | ロードする外部外部のセットを決定します。オプション: BROWSER 、 CUSTOM 。デフォルトはBROWSER になります。 |
--externs | JavaScriptの外部を含むファイル。複数を指定できます |
--js | JavaScriptファイル名。複数を指定できます。 argsはデフォルトでファイルとして解釈されるため、フラグ名はオプションです。また、Minimatchスタイルのグローブパターンを使用することもできます。たとえば、use --js='**.js' --js='!**_test.js' _test.js で終わらないすべてのjsファイルを再帰的に含めるために |
--js_output_file | プライマリ出力ファイル名。指定されていない場合、出力はstdoutに書き込まれます。 |
--language_in | 入力ソースが適合する言語仕様を設定します。オプション: ECMASCRIPT3 、 ECMASCRIPT5 、 ECMASCRIPT5_STRICT 、 ECMASCRIPT_2015 ECMASCRIPT_NEXT ECMASCRIPT_2016 、 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'
} ) ;
このパッケージは、ほとんどの場合、ネイティブグラールバイナリへのプログラム的なアクセスを提供し、それ以外の場合はJavaバージョンに戻ります。
複数のスクリプトがある場合は、1つのコンパイルコマンドと一緒にコンパイルする必要があります。
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
閉鎖コンパイラは、コマンドラインで渡される順序でファイルを連結します。
グローブまたは多くのファイルを使用している場合、スクリプト間の依存関係の管理に関する問題に直面し始める可能性があります。この場合、スクリプト間で依存関係を施行するための関数を提供するLib/base.jsを使用する必要があります(つまり、 goog.module
とgoog.require
)。閉鎖コンパイラは、入力を自動的に再注文します。
閉鎖コンパイラは、閉鎖コンパイラの特定の機能を可能にするプリミティブとして機能するJavaScript関数と変数を提供するLIB/base.jsでリリースします。このファイルは、まもなく非推奨閉鎖ライブラリの同一に指定されたbase.jsの派生物です。このbase.js
、今後の閉鎖コンパイラによってサポートされ、新機能を受け取る可能性があります。知覚されたコアパーツのみを保持するように設計されています。
コンパイラを自分で構築するには、次のことが必要です。
前提条件 | 説明 |
---|---|
Java 11以降 | コンパイラのソースコードをコンパイルするために使用されます。 |
nodejs | Javaコンピレーションで使用されるリソースを生成するために使用されます |
git | Bazelが依存関係をダウンロードするために使用します。 |
バゼリスク | さまざまなコンパイラターゲットを構築するために使用されます。 |
Bazeliskは、特定のリポジトリに適切なバージョンのBazelを動的にロードするBazel周辺のラッパーです。それを使用すると、間違ったバージョンのBazelを使用してコンパイラを構築することに起因する偽のエラーを防ぎ、他のプロジェクトに異なるBazelバージョンを簡単に使用できるようにします。
Bazeliskは、多くのパッケージマネージャーを通じて利用できます。最も快適なものを自由に使用してください。
Bazeliskをインストールするための手順。
$ bazelisk build //:compiler_uberjar_deploy.jar
# OR to build everything
$ bazelisk build //:all
テストも同様の方法で実行できます。次のコマンドは、リポジトリですべてのテストを実行します。
$ 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の解析ツリーデータ構造は、GoogleのJavaScriptコンパイラが使用するために大幅に抽出および変更されました。 |
ローカルの変更 | パッケージは改名されています。解析ツリーに関連しないすべてのコードが削除されました。 JSDOCパーサーと静的タイピングシステムが追加されました。 |
URL | http://args4j.kohsuke.org/ |
バージョン | 2.33 |
ライセンス | mit |
説明 | Args4Jは、CUIアプリケーションでコマンドラインオプション/引数を簡単に解析できる小さなJavaクラスライブラリです。 |
ローカルの変更 | なし |
URL | https://github.com/google/guava |
バージョン | 31.0.1 |
ライセンス | Apacheライセンス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ライセンス |
説明 | Javaでの線形時間正規表現マッチング。 |
ローカルの変更 | なし |
URL | https://github.com/google/truth |
バージョン | 1.1 |
ライセンス | Apacheライセンス2.0 |
説明 | Javaユニットテストのアサーション/命題フレームワーク |
ローカルの変更 | なし |
URL | https://ant.apache.org/bindownload.cgi |
バージョン | 1.10.11 |
ライセンス | Apacheライセンス2.0 |
説明 | アリはJavaベースのビルドツールです。理論的には、Makeのしわのない「Make」のようなものであり、純粋なJavaコードの完全な移植性があります。 |
ローカルの変更 | なし |
URL | https://github.com/google/gson |
バージョン | 2.9.1 |
ライセンス | Apacheライセンス2.0 |
説明 | JSONをJavaオブジェクトに変換するJavaライブラリとその逆 |
ローカルの変更 | なし |
コードパス | contrib/nodejs |
URL | https://github.com/dcodeio/node.js-closure-compiler-externs |
バージョン | E891B4FBCF5F466CC4307B0FA842A7D8163A073A |
ライセンス | Apache 2.0ライセンス |
説明 | NodeJS APIの契約を入力します |
ローカルの変更 | それらをnpmcommandlinerunnerと互換性のあるものにするための大幅な変更。 |