Makeを利用したJavaScriptファイルの結合・圧縮

ある程度の規模のJavaScriptプログラミングでは、モジュール毎に、複数のファイルに分割してプログラミングするのが普通である。これは、ファイルの大きさが適度な方が編集作業が容易なのと、モジュールの別プロジェクトへの再利用性を高めるためである。

しかし、ブラウザ・アプリケーションでは、複数ファイルを1つのファイルに結合する方が望ましい。なぜならば、複数ファイルへの分割は、サーバへの多数のHTTPコネクションの発生を意味し、応答性が低下する。そのため、例えば、Google Mapsでは、多数のコードが100kbを超える1つのJavaScriptファイルにまとめられている。

また、ユーザの利便性を高める意味では、JavaScriptファイルの圧縮も重要である。JavaScriptの文法的な意味は保存したまま、ファイルサイズを圧縮することにより、ダウンロード時間を短くできる。また、圧縮により、JavaScriptファイルの可読性が低下するので、他人がコードを読みにくくなる。

このようなJavaScriptファイルの結合・圧縮は、ユーザの利便性を高める上では重要な処理にもかかわらず、意外と実行されていない。これは、結合・圧縮が、ソースの修正毎に必要なため、手続きの面倒さが嫌われているのだと思う。

ソースの修正毎に発生する作業を自動化するにはGNU makeが便利である。例えば、次の2つのファイルtest1.js、test2.jsがあるとしよう。

//test1.js
function MyClass(){
    this.foo = function(argument1, argument2){
        var addedArgs = parseInt(argument1)+parseInt(argument2);
        return addedArgs;
    }

    var anonymousInnerFunction = function(){
        // do stuff here!
    }
}

function MyFunc(){
    // this is a top-level function
}

// we've got multiple lines of whitespace here
//test2.js
function MyClass2(){
    this.bar = function(argument1, argument2){
        var addedArgs = parseInt(argument1) * parseInt(argument2);
        return addedArgs;
    }
}

Makefileに次のように記述する。

$ cat Makefile 
SRC = test1.js test2.js
COMB = test.js
COMP = small_test.js
all: $(COMP)
$(COMB): $(SRC)
        cat $(SRC) > $(COMB)
$(COMP): $(COMB)
        java -jar custom_rhino.jar -c $(COMB) > $(COMP)

そして、makeを実行する。

$ make
cat test1.js test2.js > test.js
java -jar custom_rhino.jar -c test.js > small_test.js

この結果、small_test.jsが得られ、その内容は次となる。

function MyClass(){
this.foo=function(_1,_2){
var _3=parseInt(_1)+parseInt(_2);
return _3;
};
var _4=function(){
};
}
function MyFunc(){
}
function MyClass2(){
this.bar=function(_5,_6){
var _7=parseInt(_5)*parseInt(_6);
return _7;
};
}

2つのjsファイルが1つにファイルにまとめられ、また、ファイルサイズも549byteから238byteと、約半分にまで圧縮されている。
makeを用いる利点は、いずれかのコードが修正された場合のみ、コードが圧縮・修正される点である。同様な処理はシェルスクリプトなどでも実現できるが、標準技術であるmakeを利用した方が汎用性が高いと思う。

なお、JavaScriptファイルの圧縮にはDojo's Compressorを用いた。Makefile中のcustom_rhino.jarがそうである。Dojo's Compressorでは日本語文字列はうまく扱えないようなので、日本語文字列は別ファイルに記述する必要がある。また、Windows環境でmakeを利用するには、cygwinの導入が簡単だと思う。