gulpを使うと彼女ができます - かんたんな紹介とハンズオン

49
gulpを使うと 彼女ができます かんたんな紹介とハンズオン

Upload: kohei-asai

Post on 18-Dec-2014

796 views

Category:

Engineering


0 download

DESCRIPTION

nodejsで動くビルドシステムヘルパー「gulp」の紹介とハンズオンを2014/09/30に社内で行った時のスライドです。

TRANSCRIPT

Page 1: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpを使うと 彼女ができますかんたんな紹介とハンズオン

Page 2: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

おしながき

gulpのかんたんな説明

ゆるいハンズオン

ハンズオンで使ったコードの解説しつつAPIの説明

Page 3: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

自己紹介

あさい こうへい UI / UX デザイン部 フロントエンドエンジニア 的なやつ 2014年 5月末 入社 nodeとexpressとangularで呼吸してる !Github : @axross Twitter : @axross_

Page 4: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

知ってますか?

Node.jsで動く ビルドシステムヘルパー(タスクランナーみたいなもん) フロントエンド開発での作業を自動化したりする Gruntみたいなやつ 既存のOSSプロジェクトのいくつかはgulpへ移行、 新規のものもgulpの採用例が増えている模様

Page 5: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

自動化したいこと

lessやSCSSのコンパイル CSSのベンダープリフィックスの追記や圧縮 CoffeeScriptやTypeScriptのコンパイル Javascriptの依存解決や軽量化・難読化 画像の最適化やbase64化してCSSへ埋め込む スタイルガイドの生成 テスト

Page 6: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

Gruntとの違い

よりnode (CommonJS) っぽい書き方 メタファイルがJSとして完結してたり Streamを利用して処理をしたり

メソッドチェインで処理を書いていく タスクランナーとしては抜群に書きやすい

直感的で最低限のAPI 後発なのでまだプラグインの数はGruntに及ばない

diff to

Page 7: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

実際にやってみようじゃあ

Page 8: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

今回やりたいこと

lessをcssに変換したい

それをminify(短縮化)したものを別に出力したい

これらを自動化したい

Page 9: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

今回やりたいこと

lessをcssに変換したい

それをminify(短縮化)したものを別に出力したい

これらを自動化したい

Page 10: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

準備

黒い画面を使います !

ディレクトリを作っておく 今後、このディレクトリの中で作業します

$ mkdir gulp_training$ cd gulp_training

Page 11: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

準備(2)雑にhtmlを書く index.html

<!DOCTYPE html><html lang="ja"><head> <meta charset="UTF-8"> <link rel="stylesheet" href="./style.min.css"></head><body> <div class="accept">はい</div> <div class="decline">いいえ</div> <div class="later">あとで</div></body>

Page 12: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

準備(3)雑にlessを書く style.less

@blue: #03a9f4;@orange: #ff5722;!.button(@color: #607d8b) { display: inline-block; padding: 8px 16px; border-radius: 4px; background: @color; box-shadow: darken(@color, 15%) 0 4px 0; color: #ffffff;}.accept { .button(@blue); }.decline { .button(@orange); }.later { .button(); }

Page 13: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

node.jsのインストールインストールされているか確認

$ node -v

インストールしていない人はnodebrewかnvmで入れてください$ curl -L git.io/nodebrew | perl - setup$ export PATH=$HOME/.nodebrew/current/bin:$PATH$ source ~/.bashrc$ nodebrew install-binary stable$ nodebrew use stable

Page 14: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

package.jsonを 作っておく利用(依存)するパッケージを記録・共有するために、package.jsonを作成しておく

$ npm init

ウィザードに対して、すべてEnterキー(Yes)でOK

Page 15: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpのインストール

CLIで使えるようにグローバルインストール

$ npm install -g gulp

Page 16: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpのプラグインの インストール今回はlessのコンパイルをしてみる gulp本体とgulp-lessを入れる

$ npm install --save-dev gulp gulp-less

Page 17: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

package.jsonについて

npm installのときに「--save」や「--save-dev」をつけると、package.jsonに記録される このpackage.jsonをgitなどで管理・共有すれば、 コミットしている他のメンバーは「npm install」だけで必要なパッケージをインストールできる 「-g」をつけたものは記録されない

プロジェクトではなく環境にインストールするため

(補足)

Page 18: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpfile.jsを作る

「gulpfile.js」という名前のファイルを作ります

$ atom gulpfile.js

普段使ってるエディタがある人は、sublだったりviだったり、 それぞれいい感じにやってください

Page 19: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpfile.jsを作るこんな感じに書きます gulpfile.js

var gulp = require('gulp');var less = require('gulp-less');!gulp.task('default', function() { return gulp.src('./style.less') .pipe(less({ paths: ['./'] })) .pipe(gulp.dest('./'));});

Page 20: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpfile.jsとは

gulpのタスクと処理を記述する 単体のjsファイルで、Javascriptを書く node.jsで普通に動くので環境変数なんかもイケる RubyのRakeでいうRakefileに近い gulpのrequireを除けば、ファイル単体がモジュールとして完結しているので、依存関係がわかりやすい

(補足)

Page 21: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpを動かしてみる

「gulp」コマンドでgulpを動かす

$ gulp

Page 22: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

こんな感じになりました?

gulpの結果

$ gulp [13:14:39] Using gulpfile ~/gulp-training/gulpfile.js[13:14:39] Starting 'default'...[13:14:39] Finished 'default' after 42 ms

「style.css」が生成されている

% ls gulpfile.js node_modules/ style.cssindex.html package.json style.less

Page 23: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

できたね!!!

lessをcssに変換したい

それをminify(短縮化)したものを別に出力したい

これらを自動化したい

Page 24: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

じゃあ次にやりたいこと

lessをcssに変換したい

それをminify(短縮化)したものを別に出力したい

これらを自動化したい

Page 25: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpのプラグインの 追加インストールCSSの圧縮と、分けて出すためにリネームをしたい gulp-cssoとgulp-renameを入れる

$ npm install --save-dev gulp-csso gulp-rename

Page 26: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpfile.jsに書き足すvar gulp = require('gulp');var less = require('gulp-less');var csso = require('gulp-csso');var rename = require('gulp-rename');!gulp.task('default', function() { return gulp.src('./style.less') .pipe(less({ paths: ['./'] })) .pipe(gulp.dest('./')) .pipe(csso()) .pipe(rename('style.min.css')) .pipe(gulp.dest('./'));});

Page 27: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

こんな感じになりました?

gulpの結果

$ gulp [13:32:16] Using gulpfile ~/gulp-training/gulpfile.js[13:32:16] Starting 'default'...[13:32:16] Finished 'default' after 68 ms

style.cssに加え、「style.min.css」が生成されている

% ls gulpfile.js node_modules/ style.css style.min.cssindex.html package.json style.less

Page 28: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

できたね!!!!!!!

lessをcssに変換したい

それをminify(短縮化)したものを別に出力したい

これらを自動化したい

Page 29: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

最後にやりたいこと

lessをcssに変換したい

それをminify(短縮化)したものを別に出力したい

これらを自動化したい

Page 30: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

gulpfile.jsに書き足すvar gulp = require('gulp');var less = require('gulp-less');var csso = require('gulp-csso');var rename = require('gulp-rename');!gulp.task('default', function() { return gulp.src('./style.less') .pipe(less({ paths: ['./'] })) .pipe(gulp.dest('./')) .pipe(csso()) .pipe(rename('style.min.css')) .pipe(gulp.dest('./'));});!gulp.task('watch', function() { return gulp.watch('./*.less', ['default'])});

Page 31: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

こんな感じになりました?

gulpの結果

$ gulp watch[13:38:51] Using gulpfile ~/gulp-training/gulpfile.js[13:38:51] Starting 'watch'...[13:38:51] Finished 'watch' after 6.38 ms

style.lessを編集して保存すると、勝手に「default」タスクが走る[13:39:09] Starting 'default'...[13:39:09] Finished 'default' after 62 ms

Page 32: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

できたね!!!!! すごいね!!!lessをcssに変換したい

それをminify(短縮化)したものを別に出力したい

これらを自動化したい

Page 33: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

ハンズオンまとめ

gulpをnpmでグローバルインストールする gulpプラグインをnpmでローカルインストールする

この時、--save-devしてpackage.jsonに記録すべき gulpプラグインはrequireして、.pipeに渡す

メソッドチェインで繋げて通せる gulp.watchっていうやつでファイルの監視ができる タスクや処理を書き足すのがすごい楽

Page 34: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

APIの説明さっくりと

Page 35: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

var gulp = require('gulp');var less = require('gulp-less');var csso = require('gulp-csso');var rename = require('gulp-rename');!gulp.task('default', function() { return gulp.src('./style.less') .pipe(less({ paths: ['./'] })) .pipe(gulp.dest('./')) .pipe(csso()) .pipe(rename('style.min.css')) .pipe(gulp.dest('./'));});!gulp.task('watch', function() { return gulp.watch('./*.less', ['default'])});

タスクの作成

Page 36: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

タスクの作成(2)

「gulp タスク名」のように実行するためのタスクを定義する nameは、タスク名をStringで指定する

「default」というタスク名は予約語、「gulp」のみで実行できる depsは、このタスクの前に実行させたいタスク名をArrayで指定できる

複数のタスクを1つのエントリポイントにまとめることができる なくてもよい

fnには、タスクの中身をFunctionとして渡す

gulp.task(name, [deps], fn)

Page 37: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

var gulp = require('gulp');var less = require('gulp-less');var csso = require('gulp-csso');var rename = require('gulp-rename');!gulp.task('default', function() { return gulp.src('./style.less') .pipe(less({ paths: ['./'] })) .pipe(gulp.dest('./')) .pipe(csso()) .pipe(rename('style.min.css')) .pipe(gulp.dest('./'));});!gulp.task('watch', function() { return gulp.watch('./*.less', ['default'])});

ファイルの読み込み

Page 38: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

ファイルの読み込み(2)

globsは、globとなるStringか、それらが格納されたArrayを指定する 複数渡した場合、以降のpipeはglobsすべてにかかる

optionsでフラグを立てるとbufferとして読み込んだり色々できる あまりやらないと思うので割愛、API参照 もちろんなくてもよい

Streamが返る pipe化したプラグインを通せる

gulp.src(globs [, options])

Page 39: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

var gulp = require('gulp');var less = require('gulp-less');var csso = require('gulp-csso');var rename = require('gulp-rename');!gulp.task('default', function() { return gulp.src('./style.less') .pipe(less({ paths: ['./'] })) .pipe(gulp.dest('./')) .pipe(csso()) .pipe(rename('style.min.css')) .pipe(gulp.dest('./'));});!gulp.task('watch', function() { return gulp.watch('./*.less', ['default'])});

pipeを通す

Page 40: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

pipeを通す(2)

gulp.srcで返ったStreamには、pipe化されたgulpのプラグインを通すことができる

さっきの例だと、gulp-lessやgulp-renameなどがそれにあたる pipeはそのまま継続してStreamを返すので、メソッドチェインして次々にpipeを通すことができる

gulp.src(...).pipe(pipedGulpPlugin)

Page 41: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

var gulp = require('gulp');var less = require('gulp-less');var csso = require('gulp-csso');var rename = require('gulp-rename');!gulp.task('default', function() { return gulp.src('./style.less') .pipe(less({ paths: ['./'] })) .pipe(gulp.dest('./')) .pipe(csso()) .pipe(rename('style.min.css')) .pipe(gulp.dest('./'));});!gulp.task('watch', function() { return gulp.watch('./*.less', ['default'])});

ファイルの書き出し

Page 42: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

ファイルの書き出し(2)

指定したpathにファイルを書き出す pathで指定できるのはディレクトリ名まで リネームしたい場合はgulp-renameをpipeで通す ディレクトリが存在しない場合は自動的に作られる

optionsでファイルのパーミッション指定したりできる gulp.dest自体がpipeで通せる

gulp.dest(path [, options])

Page 43: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

var gulp = require('gulp');var less = require('gulp-less');var csso = require('gulp-csso');var rename = require('gulp-rename');!gulp.task('default', function() { return gulp.src('./style.less') .pipe(less({ paths: ['./'] })) .pipe(gulp.dest('./')) .pipe(csso()) .pipe(rename('style.min.css')) .pipe(gulp.dest('./'));});!gulp.task('watch', function() { return gulp.watch('./*.less', ['default'])});

ファイルの監視

Page 44: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

ファイルの監視(2)

globにStringで指定されたファイルを監視する tasksにはgulp.taskで定義しているタスク名をArrayで指定する Gruntと同じように内部でgazeというパッケージを使っていて、 optionsのそのへんのAPIは同じ 第三引数(tasks)にArrayじゃなくてFunctionを渡すと、 cb的な感じにゴニョゴニョすることもできる

gulp.watch(glob [, options], tasks)

Page 45: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

こんだけですdocsにもこれしか載ってない

Page 46: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

API まとめ

gulp.taskでタスクを定義する これの前にこのタスクやってね、みたいなのカンタン

gulp.srcでファイルを読み込む gulp.srcしたものにpipeして、処理を通していく 出力するときはgulp.dest

gulp.dest自体もpipeに通すので、minifyする時とか楽

Page 47: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

Q&A何かありますか?

Page 48: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

他にも学び方とか pluginの探し方とか公式ドキュメント https://github.com/gulpjs/gulp/blob/master/docs/README.md !gulp.js その4 プラグイン一覧 http://qiita.com/oreo3@github/items/0f037e7409be02336cb9 !npmとかGitHubを定期的にwatchするとよい ドキュメントにrecipesがあるので、参考にするとよい

Page 49: gulpを使うと彼女ができます - かんたんな紹介とハンズオン

ご清聴ありがとう ございました