読者です 読者をやめる 読者になる 読者になる

私と私の猫の他は誰でも隠し事を持っている

野良プログラマ発、日々のアウトプット

Closure Compiler Service API を使って JS コード圧縮コマンドをサクッと作る

プログラミング

某ブロジェクト@おしごとで比較的まとまった量の JavaScript コードを書いたんですが、これってモバイルからの利用も想定してるし圧縮・最適化をかけた方がヨイよなー、ということでその方面のツール等を物色してみました。Web I/F 上で利用できる圧縮サービスは今まで多数見かけてきましたが、サービス保守サイクルでの効率を考えるとサーバ上で CLI で使えるのが欲しい。

で、これ最強ですね。Googleclosure-compilerJava で実装されているので jar を使ってのコマンドづくりも勿論できるんですが、サービス化されてて API が用意されているのが嬉しいです。当方某プロジェクトでは Java は使っておらず、この為だけに構成サーバそれぞれで Java 環境をインスコするのもアレなので、この API を使って圧縮用 PHP スクリプトをちゃちゃっと書いてみますた。こんな感じ。

<?php
define('USAGE', 'jsmin.php <JSファイル>');
define('API_URL', 'http://closure-compiler.appspot.com/compile');

if (! ($jsFile=@$argv[1]) || ! file_exists($jsFile)) {
	die(USAGE . "\n");
}

$param = array(
	'js_code' => '',
	'compilation_level' => 'SIMPLE_OPTIMIZATIONS',
	'output_format' => 'text',
	'output_info' => 'compiled_code',
);
$param['js_code'] = file_get_contents($jsFile);
$options = array(
	'http' => array(
		'method' => 'POST',
		'header' => "Content-type: application/x-www-form-urlencoded\r\n",
		'content' => http_build_query($param),
	)
);
$result = file_get_contents(API_URL, false, stream_context_create($options));
echo $result;

使う時は

php このスクリプト.php foo.js > foo.min.js

みたいな感じで。ちなみに、今回書いた JS コードは35%サイズに圧縮されました。いいね!

上記例では変換対象 JS コードに文法誤り等無いことを前提にしてますので、エラー処理やコンパイルレベルの指定等、ちゃんとしたコマンドっぽくされたい場合はここなどを参考に、適宜いぢってみて下さい。