Webサイト制作に便利なGruntプラグイン（その2）

#Webサイト制作に便利なGruntプラグイン（その2）

[この記事](http://qiita.com/megurock/items/54872c26e45017cd36a1)の続きになります。

この記事では、個人的にWebサイト制作によく使っているGruntプラグインを、grunt-contrib以外から4つほど紹介しています。前回の記事の通り、設定例は雰囲気をつかむためのほんの一例になりますので、詳しい使い方につきましては、各々のプラグインのページを別途ご覧ください。

##load-grunt-tasks

[load-grunt-tasks](https://github.com/sindresorhus/load-grunt-tasks)

プラグインを追加する度に、

```js:package.json
grunt.loadNpmTasks('somePlugin');
```
を追記する必要がなくなります。

【 設定例 】
プロジェクト内のすべてのGruntプラグインを読み込みます。

```js:package.json
require('load-grunt-tasks')(grunt);
```

なお、このプラグインを使わない場合でも、以下のようなスクリプトを記述することにより、プラグインの読み込みをある程度簡略化することができます。

```js:package.json
var pkg = grunt.file.readJSON('package.json');
for (var taskName in pkg.devDependencies) {
  if (taskName.substring(0, 6) === 'grunt-') {
    grunt.loadNpmTasks(taskName);
  }
}
```


##grunt-usemin

[grunt-usemin](https://github.com/yeoman/grunt-usemin)

JavaScriptやCSSファイルを連結し、ミニファイした上で、HTMLに記述されているそれら外部ソースの読み込み部分の記述を書き換えてくれます。

【 設定例 】
src/cssディレクトリ内のreset.cssとmain.cssを、release/css/app.min.cssに、またsrc/jsディレクトリ内のplugins.jsとmain.jsをrelease/js/app.min.jsに、それぞれ連結・ミニファイします。`useminPrepare`と`usemin`の2つのタスクから構成されています。

```js:package.json
useminPrepare: {
  html: 'src/index.html',
  options: {
    root: 'src/',
    dest: 'release/'
  }
},
usemin: {
  html: 'src/index.html'
}
```

```html:src/index.html
<!-- build:css css/app.min.css -->
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/main.css">
<!-- endbuild -->

<!-- build:js js/app.min.js -->
<script src="js/plugins.js"></script>
<script src="js/main.js"></script>
<!-- endbuild -->
```

上記src/index.htmlは、タスク実行後、以下のような内容でreleaseディレクトリ配下に生成されます。

```html:release/index.html
<link rel="stylesheet" href="css/main.min.css"/>
<script src="js/app.min.js"></script>
```

また、スクリプトのミニファイについては、ライブラリ等に記載されているライセンスを残した状態で難読化をするのがマナーかと思いますが、grunt-useminの場合は、以下の記事に紹介されている方法で解決できます。

[grunt-useminでライセンス表記を残す](http://pirosikick.hateblo.jp/entry/2013/12/17/080106)

##grunt-text-replace

[grunt-text-replace](https://github.com/yoniholmes/grunt-text-replace)

ファイル内にある一部の文字列を書き換えてくれます。開発時とリリース時に任意の文字列を使い分ける必要がある場合等に利用しています。

【 設定例 】
src/index.html内の"development id"という文字列を"release id"に置換し、releaseディレクトリにコピーを生成します。

```js:package.json
replace: {
  example: {
    src: ['src/index.html'],
    dest: 'release/',
    replacements: [{
      from: "development id",
      to: "release id"
    }]
  }
}
```


`overwrite`プロパティを`true`にすると、元ファイル内の文字列を直接置換してくれます。

```js:package.json
replace: {
  example: {
    src: ['release/index.html'],
    overwrite: true,
    replacements: [{
      from: "development id",
      to: "release id"
    }]
  }
}
```

正規表現を使い、HTMLの任意のコメント間の文字列をまるごと置換する事などもできます。

```html:src/index.html
<!-- start header -->
<header>
	<h2>メインナビゲーション</h2>
	<ul>
		<li>メニュー1</li>
		<li>メニュー2</li>
	</ul>
</header>
<!-- end header -->
```

```js:package.json
replace: {
  example: {
    src: ['release/index.html'],
    dest: 'release/',
    replacements: [{
      from: /<!--\s*start header\s*-->[\s\S]*<!--\s*end header\s*-->/g,
      to: '<!--#include virtual="include/header.inc"-->'
    }]
  }
}

```
上記は実行後、以下のように置換されます。

```html:release/index.html
<!--#include virtual="include/header.inc"-->
```


##grunt-html-validation

[grunt-html-validation](https://github.com/praveenvijayan/grunt-html-validation)

HTMLの構文チェックをしてくれます。CSSやJSのリントは[grunt-contrib-csslint](https://github.com/gruntjs/grunt-contrib-csslint)や[grunt-contrib-jshint](https://github.com/gruntjs/grunt-contrib-jshint)のように、grunt-contrib-htmllintもあれば嬉しいのですが、[開発は検討中](https://github.com/gruntjs/grunt-contrib/issues/161)のようです。

【 設定例 】
src/index.htmlの構文チェックをします。relaxerrorに列挙しているエラーは無視します。

```js:package.json
validation: {
  options: {
    reset: grunt.option('reset') || true,
    stoponerror: false,
    relaxerror: [
      "Bad value X-UA-Compatible for attribute http-equiv on element meta."
    ]},
    files: {
      src: ['src/index.html' ]
    }
}

```

ただ、自分の環境だとこのプラグインがネットワークエラーで実行できないケースがわりと頻発します。構文チェックをまめに行うような方は、別のプラグインを探された方がいいかもしれません...。


###More Plugins!
人気のプラグインは、[本家サイト](http://gruntjs.com/plugins)でも検索できるので、「こんなのないかなぁ？」と思ったら、適当に検索してみると掘り出し物が見つかるかもしれません。