[php] javascript minify

개요

자바스크립트는 압축해주는 minifier는 다양하게 출시되어 있고 온라인에서 제공되는 서비스들이 많고 특히 api를 제공해주는 곳도 많이 있습니다.
하지만 해당 온라인서비스가 죽어버리거나 오작동하면 빌드시에 곤란한 일을 겪게 됩니다.

베이스코드

회사에서 기본으로 사용하고 있던 javascript-minifier.com/raw가 작동하지 않아 내제화할 결심을 하게 되었습니다.
검색을 해보니 mrclay가 만든 php용 minifier가 여기저기서 추천되고 있었습니다. 공식홈페이지는 다음과 같습니다.

https://github.com/mrclay/minify

(아저씨 블로그 가보면 이것저것 재밌는 얘기도 많고 저장소에도 쓸모있는 소스들이 공개되어있습니다)

하지만 이 저장소는 종합적인 minifier로 css를 포함하여 js와 함께 전체적으로 소스를 병합하여 줄여주는 통합적인 기능을 제공하는 대규모 소스입니다.
제가 필요한건 오직 자바스크립트를 줄일 수만 있으면 되기 때문에 이 아저씨의 다른 저장소로부터 소스를 내려받았습니다.

https://github.com/mrclay/jsmin-php/blob/master/src/JSMin/JSMin.php

실제사용

일단 이 php가 확보되면 그 뒤로는 매우 간단합니다.

//파일을 열어 js를 읽어들임
$js = '';
$f = fopen('test.js', 'r');
while($part = fread($f, 4096)) $js .= $part

//JSMin.php를 불러들임
require_once dirname(__FILE__).'/JSMin.php';

//이 코드가 최소화시키는 코드
$min = JSMin::minify($js);

//최소화된 js를 씀
$f = fopen( 'min.js', "w+" );
flock( $f, LOCK_EX );
fwrite( $f, $v );
flock( $f, LOCK_UN );
fclose($f);

JavaScriptMinifier ??

근데 더 검색하다보면 JSMin이 느리고 실제로 패킹된 js도 패킹전 js에 비해 성능이 떨어지도록 패킹된다는 보고서가 상당합니다.
더 엄격하고 정교하게 그리고 더 빨리 압축하는 JavaScriptMinifier라는 넘이 있어서 이 넘도 사용해봤습니다.

https://git.wikimedia.org/blob/mediawiki%2Fcore.git/HEAD/includes%2Flibs%2FJavaScriptMinifier.php

압축된 크기는 거기서 거기지만 압축하는 속도는 보다 빠르네요 ^^
위의 코드에서 바뀌는 부분은 다음 정도입니다.

//JSMin.php를 불러들임
require_once dirname(__FILE__).'/JavaScriptMinifier.php';

//이 코드가 최소화시키는 코드
$min = JavaScriptMinifier::minify($js);