タスクを並列超速化するgrunt-parallelizeを紹介するよ

この記事は Grunt Plugins Advent Calendar 2013 23日目の記事です。

Gruntタスクを並列で実行するプラグイン grunt-parallelize を紹介します。

ある程度プロジェクトが大きくなるとJavaScriptが1500ファイルとか超えてきてJSHintにくっそ時間かかるみたいなことがよくあります。JSHintを含む多くのNode製ツールはシングルプロセスなので、普通に実行しちゃうとマルチコアなCPUが遊んでてもったいないわけです。

そんなときにgrunt-parallelizeを使うと、指定のプロセス数にファイルリストを分割してマルチプロセスでタスクを実行してくれます。

まずはもとになるタスクのGruntfile.jsの定義。grunt-contrib-jshintを使った普通のタスクですね。

grunt.initConfig({
  jshint: {
    all: {
      src: './**/*.js'
    }
  }
});

普通に実行するとこうなる。1,640ファイルで36秒。 Before

次にgrunt-parallelizeの定義を追加します。対象のタスクと並列数4を指定するだけのシンプル設定。

grunt.initConfig({
  jshint: {
    all: {
      src: './**/*.js'
    }
  },
  parallelize: {
    jshint: {
      all: 4
    },
  },
});

実行すると並列化(410ファイル×4並列)されて14秒で終わった! Parallelize!

特徴としてはこんな感じ。

  • 元になる既存のタスク定義はそのまま残して、外から並列化タスクを定義できる。
  • 設定は並列数だけ。実行は元タスク名の頭に parallelize: を付けるだけ。シンプル。
  • Grunt標準のファイル指定方法 に従っていれば任意のタスクを並列化可能。

ここ3ヶ月ほど仕事のプロジェクトに実践投入して問題なさそうだったので、先ほど v1.0.0 をリリースしました。

ということで、超簡単にタスクを並列化できておすすめなのでぜひ使ってみてください。

補足

似たようなプラグインに grunt-concurrentgrunt-parallel というのもあるんですが、こいつらは複数の異なるタスクを並列に動かすもので、1つのタスクを分割して並列で処理する grunt-parallelize とは目的が異なります。