Jakeを使ってみる
Jake - JavaScript build tool
JavaScript(CommonJS)で記述できるビルドツール
http://github.com/280north/jake
インストール
要Narwhal
% tusk install jake Updating catalog. . . . Done. % jake No Jakefile found (looking for: jakefile, Jakefile, jakefile.js, Jakefile.js, jakefile.j, Jakefile.j)
JakeはJakefile/Jakefile.jsを書いてタスクを処理させる。
Jakefile.js
var jake = require('jake'); jake.task('Hello', function() { print('Hello!'); });
とりあえず、"Hello!"を出力するだけですが
まず、jakeモジュールをインポートして"Hello"というタスクを作っています。
Jakefileができたらjakeにタスクの名前を渡して実行。
% jake Hello (in /path/to/project) Hello! Build took 21 millseconds
Jakefileにdefaultタスクを作っておくと引数無しで
jakeを実行した時に処理するタスクを指定できます。
var jake = require('jake'); jake.task('default', function() { print('default task!'); }); jake.task('Hello', function() { print('Hello!'); });
% jake (in /path/to/project) default task! Build took 1 millisecond
複数の.jsファイルを1ファイルにまとめて縮小する
実際に複数のファイルをまとめて、縮小しfoo.min.jsみたいなファイルを作ってみます。
// foo.js function foo() { alert('foo.js'); }
// bar.js function bar() { alert('bar.js'); }
// baz.js function baz() { alert('baz.js'); }
1.複数ファイル->1ファイル
まずは、複数ファイルを読み込んで、1ファイルにまとめるconcatタスクを作る。
//Jakefile.js var jake = require('jake'); var FILE = require('file'); jake.task('concat', function() { var out = ''; var target = ['foo.js', 'bar.js', 'baz.js']; // 各ファイルの中身をoutに代入 target.map(function(file) { out += FILE.read(file); }); if(!FILE.exists('build')) { // buildディレクトリ作成 FILE.mkdir('build'); } // build/foobarbaz.jsを作って // foobarbaz.jsにoutの内容(foo/bar/baz.jsの中身)を書き込む FILE.write(FILE.join('build/', 'foobarbaz.js'), out); });
JakefileはCommonJSで書きます。CommonJSの仕様は以下を参照。
http://www.commonjs.org/specs/
これで、jake concatを実行するとfoobarbaz.jsというファイルがbuildディレクトリに作られます。
% ls build/ foobarbaz.js % cat build/foobarbaz.js function foo() { alert('foo.js'); } function bar() { alert('bar.js'); } function baz() { alert('baz.js'); }
2.1ファイルにまとめたものを縮小する
ファイルの縮小にはcommonjs-shrinksafeというモジュールを使う事ができるので
http://github.com/280north/commonjs-shrinksafe
% tusk install shrinksafe
でインストール。
Jakefileにファイル縮小のタスクを追加します。
var minify = require('minify/shrinksafe'); jake.task('minify', function() { var min = minify.compress(FILE.read(FILE.join('build/', 'foobarbaz.js'))); FILE.write(FILE.join('build/', 'foobarbaz.min.js'), min); })
concatタスクを終えた後でminifyタスクを行えば、不要なインデントを取り除いたfoobarbaz.min.jsがbuildディレクトリに作成されますが、buildの様な複数タスクをやらせたいので、buildタスクを追加します。
jake.task()には引数に('タスク名', ['依存タスク1', '依存タスク2'...], 関数)を渡せるので、Jakefileに
jake.task('build', ['concat', 'minify']);
を追加。これで、buildタスク実行->concatタスク->minifyタスクの順で実行してくれます。
% jake build (in /path/to/project) Build took 445 millseconds % ls build/ foobarbaz.js foobarbaz.min.js % cat build/foobarbaz.min.js function foo(){ alert("foo.js"); }; function bar(){ alert("bar.js"); }; function baz(){ alert("baz.js"); };
JavaScriptで書けるというのが良いですねー。