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

Post on 18-Dec-2014

796 Views

Category:

Engineering

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

おしながき

gulpのかんたんな説明

ゆるいハンズオン

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

自己紹介

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

知ってますか?

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

自動化したいこと

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

Gruntとの違い

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

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

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

diff to

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

今回やりたいこと

lessをcssに変換したい

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

これらを自動化したい

今回やりたいこと

lessをcssに変換したい

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

これらを自動化したい

準備

黒い画面を使います !

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

$ mkdir gulp_training$ cd gulp_training

準備(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>

準備(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(); }

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

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

$ npm init

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

gulpのインストール

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

$ npm install -g gulp

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

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

package.jsonについて

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

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

(補足)

gulpfile.jsを作る

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

$ atom gulpfile.js

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

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('./'));});

gulpfile.jsとは

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

(補足)

gulpを動かしてみる

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

$ 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

できたね!!!

lessをcssに変換したい

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

これらを自動化したい

じゃあ次にやりたいこと

lessをcssに変換したい

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

これらを自動化したい

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

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

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の結果

$ 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

できたね!!!!!!!

lessをcssに変換したい

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

これらを自動化したい

最後にやりたいこと

lessをcssに変換したい

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

これらを自動化したい

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'])});

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

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

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

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

これらを自動化したい

ハンズオンまとめ

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

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

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

APIの説明さっくりと

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'])});

タスクの作成

タスクの作成(2)

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

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

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

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

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

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'])});

ファイルの読み込み

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

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

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

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

gulp.src(globs [, options])

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を通す

pipeを通す(2)

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

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

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

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'])});

ファイルの書き出し

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

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

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

gulp.dest(path [, options])

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'])});

ファイルの監視

ファイルの監視(2)

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

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

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

API まとめ

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

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

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

Q&A何かありますか?

他にも学び方とか 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があるので、参考にするとよい

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

top related