Gulpを導入しよう

# インストール手順
## 1　node.jsをインストール
まずはnode.jsが必要なのでインストールする。下記サイトを参考にしてインストールした。
npm(node package managerの略。nodeのパッケージ管理ツールという認識)も導入される。
http://www.hirooooo-lab.com/entry/development/install-node

## 2　Gulpの導入
参考サイト
- https://liginc.co.jp/web/tutorial/117900
- https://h2ham.net/gulp-basic

### 2-1 pacakge.json生成
pacakge.jsonとはnpmのパッケージファイルを管理するjsonフォーマット。まずはこちらを生成する。

1.gulpを導入したいプロジェクトのディレクトリに移動
2.移動したら`package.json`を作成するコマンド`npm init`を入力。コマンド入力すると、以下のような質問が聞かれるので任意の値を入力。全部の質問に回答すると`package.json`が生成される。

```
{
  "name": "package", // プロジェクト名(必須項目)
  "version": "1.0.0", // プロジェクトバージョン(必須項目)
  "description": "paractice", // プロジェクト概要(npmとかで公開するなら書いた方がいいかも)
  "homepage": "https://", //プロジェクトのURL
  "main": "index.js", //最初に読み込まれるファイル
  "repository": {
    // バージョン管理システムの情報. gitとか.
    "type": "git",
    // リポジトリのURL.
    "url": "git://github.com/xxx/xxx.git"
  },
  // npmで公開する時とかで使われるキーワードというかタグというか.
  "keywords": {
    "word1", "word2"
  },
  "scripts": {
  	// npm xxx で実行されるスクリプト一覧
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": {
  	//作者情報
    "name": "xxxx",
    "email": "xxxx@xxx.xxx"
  }, 
  "private": true, //オンラインで公開しないプロジェクト(プライベートもの)の際は、必ずこちらの記述を入力
  "license": "ISC" //ライセンス情報
}
```


### 2-2 Gulpのインストール
- グローバルインストール
グローバルインストールを行うことで、PC全体で共通で使える機能としてパッケージをインストールできる。
一回入れてしまえば、他のプロジェクトでインストールする必要がなくなるというメリットがあるが、PC全体のgulpファイルに問題をおよぼしてしまうという大きなデメリットを孕んでいる。

```
npm install -g gulp //-gをつけるとグローバルインストール
```

- package.jsonにgulpのバージョンを記録してgulpをインストール(ローカルインストール)
package.jsonにインストールしたgulpのバージョンの情報が残る
 
```
npm install --save-dev gulp
```

こんなかんじにgulpのバージョンが明記される。

```
"private": true,
"license": "xxx",
"devDependencies": {
	"gulp": "^3.9.1"
}
```

gulpをインストールをしたディレクトリには、 `node_modules`というフォルダが出来上がり、その中にnpmでインストールされる様々な機能のファイルが格納される。

### 2-3 gulpfile.jsを作成
gulpで自動化するタスクを記述するファイル`gulpfile.js`を用意することでgulpを利用できる。
`gulpfile.js`にタスクを追加していく。

```
//簡単なコード
var gulp = require('gulp');

gulp.task('default', function() {
  console.log('テスト表示です');
});
```

ターミナルで`gulp`と入力することでgulpを実行。上記のコードだと、入力後にターミナルに以下のような表示がされる。

```
[10:50:35] Starting 'default'...
テスト表示です
[10:50:35] Finished 'default' after 113 μs
```

## 3 gulpにタスクを導入
### 3-1.追加手順(Sassのコンパイルを例に)
まずは、npmにコンパイル用のプラグインを導入

```
npm install gulp-sass --save-dev
```

プラグインを導入したら`gulpfile.js`にSassをコンパイルするタスクを記述する。

```
var gulp = require('gulp');
var sass = require("gulp-sass");

//sassコンパイル
gulp.task("default", function() {
    gulp.src("sass/**/*.scss")
        .pipe(sass())
        .pipe(gulp.dest("./css"));
});

//gulp.task("タスクの名前","実行する関数")：タスクの登録
//gulp.src("MiniMatchパターン")：読み出したいファイル(gulpを適応させるファイル)を指定
//pipe(おこないたい処理)：srcで取得したファイルに処理を施す
//gulp.dest(“出力先”)：出力先に処理を施したファイルを出力
//.pipe：処理をつなぐ。連続的な処理を記述する際に利用。
```

また、`gulpfile.js`を記述する際はdefaultの指定が必ず必要。`gulpfile.js`の一番下に以下のように記述してデフォルト処理を指定。
デフォルト内に記したタスク名に該当するタスクはターミナルで`gulp`と入力するだけで実行してくれる。

```
gulp.task("default",["sass","sass"]); //gulp.task("default",["タスク名"]);
```

### 3-2 MiniMatchパターンの指定の仕方
- “sass/style.scss”：sass/style.scssだけヒット
- “sass/*.scss”：sassディレクトリ直下にあるすべての.scssがヒット(直下のディレクトリ内のみ)
- “sass/**/*.scss”：sassディレクトリ以下にあるすべての.scssがヒット(直下だけではなく、sassディレクトリ以下全ディレクトリとファイルを扱うとき)
- [“sass/**/.scss”,”!sass/sample/**/*.scss]：sass/sample以下にあるscssを除くsassディレクトリ以下のscssがヒット(!は除外を意味する)

## 4 gulpに様々なタスクを追加しよう。
参考
- https://liginc.co.jp/web/tutorial/117900

### 4-1 ベンダープレフィックス付与の自動化
gulp-autoprefixerを使用

```npm追加
npm install gulp-autoprefixer --save-dev
```

```gulpにタスク追加
var autoprefixer = require("gulp-autoprefixer");　

(autoprefixer({
	 // ☆IEは9以上、Androidは4以上、iOS Safariは8以上
	 // その他は最新2バージョンで必要なベンダープレフィックスを付与する設定
    browsers: ["last 2 versions", "ie >= 9", "Android >= 4","ios_saf >= 8"],
    cascade: false
}))

```

```追加後
var gulp = require('gulp');
var sass = require("gulp-sass");
var autoprefixer = require("gulp-autoprefixer");　//追加分

gulp.task("sass", function() {
    gulp.src("sass/**/*.scss")
        .pipe(sass())
        .pipe(autoprefixer({
            browsers: ["last 2 versions", "ie >= 9", "Android >= 4","ios_saf >= 8"],
            cascade: false
		 }))
        .pipe(gulp.dest("./css"));
});
```

### 4-2 CSSの圧縮とリネーム
```
npm install gulp-cssmin --save-dev //css圧縮
npm install gulp-rename --save-dev //ファイルリネーム(.min.cssみたいなやつ)
```

```
var cssmin = require('gulp-cssmin');
var rename = require('gulp-rename');

gulp.task("sass", function() {
    gulp.src(["sass/**/*.scss"])
        .pipe(plumber({
        	errorHandler: notify.onError("Error: <%= error.message %>")
        }))
        .pipe(sass())
        .pipe(autoprefixer())
        .pipe(cssmin()) //追加(CSS圧縮)
        .pipe(rename({ extname: '.min.css' }))　//追加
        .pipe(gulp.dest("./css"))
        .pipe(gulp.dest("./css/min")) //圧縮したファイルの出力先を指定
        .pipe(browser.reload({stream:true}));
});
```

### 4-3 JavaScriptの圧縮を自動化
jsファイルが正常に動作する環境が整ったら導入しよう。

```npm追加
npm install gulp-uglify --save-dev
```

```gulpにタスク追加
var uglify = require("gulp-uglify");

gulp.task("js", function() {
    gulp.src(["js/**/*.js","!js/min/**/*.js"])
        .pipe(uglify())
        .pipe(rename({ extname: '.min.js' }))
        .pipe(gulp.dest("./js/min"));
});
```

### 4-4 ファイルの変更の監視
いちいちgulpコマンドを入力するのがめんどくさい。そこでファイルが変更されたら逐一gulpのタスクが実行されるようにしよう。

```gulpにタスク追加
// watch
gulp.task('watch', function(){
  gulp.watch("sass/**/*.scss",["sass"]); //gulp.watch("監視するファイル",["実行したいタスクの名前"]);
});

//defaultにタスクを追加
gulp.task("default",['sass','watch']);
```

`gulp`コマンドを入力したら監視を開始する。監視中はファイルを変更するたびに逐一`default`に指定したタスクを実行してくれる。
監視を解除したいときは`Ctrl + C`。

### 4-5 ファイルを更新したらブラウザも自動更新するやつ
browser-syncを使用。

``` npm追加
npm install browser-sync --save-dev
```

```gulpにタスク追加
var browser = require("browser-sync"); //require追加

gulp.task("sass", function() {
    gulp.src("sass/**/*.scss")
        .pipe(plumber({
        	errorHandler: notify.onError("Error: <%= error.message %>")
        }))
        .pipe(sass())
        .pipe(autoprefixer())
        .pipe(gulp.dest("./css"))
        .pipe(browser.reload({stream:true})); //各タスクの末に更新時にブラウザをリロードする処理を記述。
});

// watch
gulp.task('watch', function(){
  gulp.watch(['./**/*.html', './**/*.htm'], ['browser-reload']); //タスクを追加
  gulp.watch("sass/**/*.scss",["sass"]); 
});


//追加
gulp.task('browser-reload', function(){
  browser.reload(); 
});

//gulpコマンド入力時にローカルサーバーを立ち上げる処理
gulp.task("server", function(){
	browser({
		server: {
			baseDir: './',
      		directory: true //ディレクトリを表示
		},
		open: "external"　//IPアドレスで発行
	});
});

gulp.task("default",['sass','watch','server']); //defaultにタスク追加

```


### 4-6 エラー時に監視を止めない
```npm追加
npm install gulp-plumber --save-dev
```

各タスクの先頭に.pipe(plumber())を追加

```gulpにタスク追加
gulp.task("sass", function() {
    gulp.src(["sass/**/*.scss"])
    	 //plumberを追加
        .pipe(plumber({
        	errorHandler: notify.onError("Error: <%= error.message %>")
        }))
});
```