[この記事は Sam Thorogood、デベロッパー プログラム エンジニアによる Google Developers Blog の記事 "Closure Compiler in JavaScript" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]

Closure Compiler は、2009 年に元は Java でリリースされました。本日は、まったく同じ Closure Compiler がピュア JavaScript で Java を使わずに利用できることになったことをお知らせします。この仕組みは NodeJS 環境で実行するように設計されており、いくつかのよく使われているビルドツールをサポートしています。

初めて聞く方のために説明すると、Closure Compiler は JavaScript の最適化、トランスパイル、タイプチェックを行うツールです。これを使うと、コードを高パフォーマンスでサイズが縮小されたコードにコンパイルすることができます。この仕組みは Google のほとんどのウェブ フロントエンドで使われており、できる限りサイズが小さく高速なコードを提供しています。

let、const、アロー関数などの ES2015 の新機能をサポートしており、まだすべてではサポートされていない ES2015 メソッドの polyfill も提供しています。メンテナンス性や拡張性の高い優れたコードを書けるよう、Closure Compiler は構文チェック、タイプの使用法の訂正、さまざまな JavaScript における注意点についての警告も行ってくれます。チュートリアルなど、Closure Compiler の詳細は、Google Developers をご覧ください。

動作の仕組み

これは、JavaScript 用に Closure Compiler を書き換えたものではなく、Node や古いブラウザでも実行できるように Java ソースを JS にコンパイルしたものです。Closure Compiler についてのすべての投稿やリソースは、このバージョンにも適用されます。

Closure Compiler の内部についての詳細は、Google の Closure チームの一員である Dimitris によるこの投稿Closure Tools ブログの投稿、Closure についての説明やそれがどのようにプロジェクトに役立つかを説明した 2016 年の投稿をご覧ください。

なお、JS 版は試験運用版であることにご注意ください。まだネイティブ Java 版とは同じように動作しない可能性がありますが、私たちはコンパイラー ファミリーへの興味深い追加機能であると考えています。Closure チームは今後も改善とサポートを継続する予定です。

使用方法

JS 版の Closure Compiler をプロジェクトに含めるには、NPM を使ってプロジェクトに依存性を追加する必要があります。
npm install --save-dev google-closure-compiler-js

次に、Gulp でコンパイラーを使用するために、次のようなタスクを追加します。
const compiler = require('google-closure-compiler-js').gulp();
gulp.task('script', function() {
  // select your JS code here
  return gulp.src('./src/**/*.js', {base: './'})
      .pipe(compiler({
          compilation_level: 'SIMPLE',
          warning_level: 'VERBOSE',
          output_wrapper: '(function(){\n%output%\n}).call(this)',
          js_output_file: 'output.min.js',  // outputs single file
          create_source_map: true
        }))
      .pipe(gulp.dest('./dist'));
});

google-closure-compiler(動作には Java が必要です)から移行する場合、gulp.src() またはそれに代わる機能を使ってコンパイル前に JavaScript を読み込む必要があります。

詳細については、使用方法サポートされているフラグデモ プロジェクトをご確認ください。現在利用可能な試験運用版では、Java リリースのすべてのフラグがサポートされているわけではありませんが、何か見逃していることがあった場合には、このコンパイラーが例外を通して教えてくれるでしょう。


Posted by Eiji Kitamura - Developer Relations Team