JavaScriptを高速化するgoogle-closure-compilerの使い方

google-closure-compilerとは

google-closure-compilerはJavaScript のダウンロードと実行を高速化するためのツールです。

このライブラリは、JavaScript を解析して分析し、不要なコードを削除して書き換え、残りの部分を最小限に抑えます。

google-closure-compilerの使い方

以前はClosure Compiler のオンラインサービスがあったのですが、2025年1月13日に終了しました。

Closure Compiler Webservice Turndown - 2025 #4199

そのため、Closure Compilerを利用するにはJava版かnpm版を使用する必要があります。

この記事では使用者が多いnpm版の使い方について解説します。

まず、プロジェクトにgoogle-closure-compilerをインストールします。

npm i -D google-closure-compiler

次に以下のようにnpxを使ってコンパイルします。

npx google-closure-compiler --js index.js --js_output_file index.min.js

例えば以下のようなindex.jsをコンパイルすると…

index.js
(() => {
  function add(a, b) {
    return a + b
  }
  console.log(add(1, 2))
})()

以下のようにコンパイルされます。

前述の処理の結果は必ず「3」になるため、console.log(3) となります。

index.js
(()=>{console.log(3)})();

もし、以下のように結果がランダムの関数の場合は…

dice.js
(() => {
  function dice() {
    return Math.floor(Math.random() * 6) + 1
  }
  console.log(dice())
})()

以下のようにfunctionがない以下のコードになります。

dice.min.js
(()=>{console.log(Math.floor(6*Math.random())+1)})();

ちなみに複数のjsファイルを1つにまとめたい場合は、--js に *.js を指定します。

npx google-closure-compiler --js *.js --js_output_file bundle.js

3つの最適化レベル

google-closure-compilerでは「--compilation_level=」で3つの最適化レベルが指定できます。

指定しない場合は「SIMPLE」で最適化されます。

レベル最適化内容
WHITESPACE_ONLYコメント・空白除去のみ
SIMPLE安全な範囲での最適化
ADVANCED高度な最適化(副作用あり)

前述のindex.jsをそれぞれの最適化レベルでコンパイルすると、以下の結果になります。

WHITESPACE_ONLYの場合

npx google-closure-compiler --js index.js --js_output_file index.min.js --compilation_level=WHITESPACE_ONLY
index.min.js
(()=>{function add(a,b){return a+b}console.log(add(1,2))})();

SIMPLEの場合

npx google-closure-compiler --js index.js --js_output_file index.min.js --compilation_level=SIMPLE
index.min.js
(()=>{console.log(3)})();

ADVANCEDの場合

npx google-closure-compiler --js index.js --js_output_file index.min.js --compilation_level=ADVANCED
index.min.js
console.log(3);

3つ目のADVANCEDだと3つの中で一番コード量が少なくなりますが、即時実行関数を消してしまっており、副作用が大きく、コンパイル後にコードが動作しなくなることがあるため、使用はオススメしません。

Node.js API から使う方法

Node.js からプログラム的に呼び出すこともできます。

JavaScript
const closureCompiler = require('google-closure-compiler').compiler
const compiler = new closureCompiler({
  js: 'src/index.js',
  js_output_file: 'dist/bundle.js',
  compilation_level: 'SIMPLE'
})

compiler.run((exitCode, stdOut, stdErr) => {
  if (exitCode === 0) {
    console.log('Success:', stdOut)
  } else {
    console.error('Error:', stdErr)
  }
})

古い環境でJavaScriptのコンパイルによる圧縮がいまいちなときは、こちらのコードによる圧縮の処理を追加すると良いでしょう。