忍者ブログ

STEP UP BLOG

Home > ブログ > gulp

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

GulpでSass

少し間があいてしました。
前回はGulpでjavascript周りの処理を行いましたが、今回はCSSです。
Sassを使います。

前回
GulpでSass|gulp|STEP UP BLOG

$ cd project_dir
$ mkdir -p src/scss
$ mkdir -p public/assets/css
$ cat src/css/style.scss 
$bgcolor: #efefef;

body {
    background: $bgcolor;
}

$ cat gulpfile.js 
'use strict';

var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var es = require('event-stream');
var sass = require('gulp-sass');

gulp.task('script', function(callback) {
    var sc = gulp.src(['src/js/*.js'])
        .pipe(concat('all.js'))
        .pipe(uglify())
        .pipe(gulp.dest('public/assets/js'));
    var br = browserify({
            debug: true,
            entries: ['public/assets/js/all.js']
        }).bundle()
        .pipe(source('all.js'))
        .pipe(gulp.dest('public/assets/js'));
    return es.merge(sc, br);
});

gulp.task('style', function(callback) {
    return gulp.src(['src/scss/*.scss'])
        .pipe(sass())
        .pipe(gulp.dest('public/assets/css'));
});

gulp.task('hoge', function(callback) {
    console.log('hoge');
});

gulp.task('default', ['script', 'style']);

$ npm install --save-dev gulp-sass
$ gulp
$ cat public/assets/css/style.css
body {
  background: #efefef; }

出来ました!

jsに比して簡単すぎる。。
ということでもう少し手を加えていきます。
pleeeaseでベンダープレフィックスや圧縮も試してみましょう。
http://pleeease.io/
$ npm install --save-dev gulp-pleeease

$ cat src/scss/style.scss
$bgcolor: #efefef;

body {
    background: $bgcolor;
}

.box {
    display: flex;
}

$ cat gulpfile.js
...
var pleeease = require('gulp-pleeease');

...

gulp.task('style', function(callback) {
    return gulp.src(['src/scss/*.scss'])
        .pipe(sass())
        .pipe(pleeease())
        .pipe(gulp.dest('public/assets/css'));
});

…

pleeease追加前
$ cat public/assets/css/style.css
body {
  background: #efefef; }

.box {
  display: flex; }

pleeease追加後
$ cat public/assets/css/style.css
body{background:#efefef}.box{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}

こんな感じです。

参考URL
http://isee-web.net/?p=593
PR

Gulp入門

GulpというのがGruntに代わって流行っているそうです(結構前から)。所謂フロントエンドのタスクランナー。コンパイルしたり圧縮したり、記述次第でいろいろなことができます。
http://gulpjs.com/
といわけで手を動かさないと覚えられない私はとりあえず動かしてみます。
nodeとnpmはインストールされていること前提で進めます。
最初にディレクトリ作って、
$ cd project_dir
$ mkdir -p src/js
$ mkdir -p public/assets/js
gulpのインストール。
$ npm init
$ npm install --save-dev gulp
$ echo 'export PATH=$PATH:/hoge/www/project_dir/node_modules/.bin' >> ~/.bashrc
$ source ~/.bashrc
これで、
$ gulp -v
[22:00:00] CLI version 3.8.11
[22:00:00] Local version 3.8.11
OKですね。

まずは、gulpがちゃんと動くか確かめます。
$ cat gulpfile.js
'use strict';

var gulp = require('gulp');

gulp.task('hoge', function (callback) {
    console.log('hoge');
});

gulp.task('default', ['hoge']);
これで、
$ gulp
[22:05:00] Using gulpfile ~/www/project_dir/gulpfile.js
[22:05:00] Starting 'hoge'...
hoge
大丈夫ですね!

次に、src/js以下に作ったjsファイルを公開ディレクトリとして作ったpublic/assets/jsに出力するgulpfile.jsを作ってみます。
$ cat gulpfile.js
'use strict';

var gulp = require('gulp');

gulp.task('script', function (callback) {
    return gulp.src(['src/js/*.js'])
        .pipe(gulp.dest('public/assets/js'));
});

gulp.task('hoge', function (callback) {
    console.log('hoge');
});

gulp.task('default', ['script']);

$ cat src/js/a.js
(function(global) {
    'use strict';

    console.log('happy!');
})((this || 0).self || global);
これで、
$ gulp
$ ls public/assets/js/
.  ..  a.js
出力されています!

続いて複数のファイルをまとめてみましょう。
$ cat src/js/b.js 
(function(global) {
    'use strict';

    console.log('lucky!');
})((this || 0).self || global);

$ cat gulpfile.js 
'use strict';

var gulp = require('gulp');
var concat = require('gulp-concat');

gulp.task('script', function (callback) {
    return gulp.src(['src/js/*.js'])
        .pipe(concat('all.js'))
        .pipe(gulp.dest('public/assets/js'));
});

gulp.task('hoge', function (callback) {
    console.log('hoge');
});

gulp.task('default', ['script']);
連結用にgulp-concatをインストールします。
$ npm install --save-dev gulp-concat
$ gulp
$ ls public/assets/js/
.  ..  a.js  all.js
出来ました!
$ node public/assets/js/all.js
happy!
lucky!
d(^^)b

この調子で圧縮もしちゃいましょう。
$ cat gulpfile.js 
'use strict';

var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');

gulp.task('script', function (callback) {
    return gulp.src(['src/js/*.js'])
        .pipe(concat('all.js'))
        .pipe(uglify())
        .pipe(gulp.dest('public/assets/js'));
});

gulp.task('hoge', function (callback) {
    console.log('hoge');
});

gulp.task('default', ['script']);

$ npm install --save-dev gulp-uglify
$ gulp
$ cat public/assets/js/all.js 
!function(l){"use strict";console.log("happy!")}((this||0).self||global),function(l){"use strict";console.log("lucky!")}((this||0).self||global);
これくらいの小ささだとあまり圧縮の効果もありませんが。。

ここまできたらついでにjqueryも一緒にまとめられるのではと勢い込んできますよね。
やってみましょう。
そのためにまずbowerをインストールします。bowerはフロントエンドのパッケージマネージャです。
そしてブラウザ側スクリプトでrequireを使えるようにbrowserifyもインストールします。
$ npm install --save-dev bower
$ npm install --save-dev browserify
$ npm install --save-dev debowerify
$ npm install --save-dev vinyl-source-stream
$ npm install --save-dev event-stream
$ bower init
$ bower install --save jquery
package.jsonへ以下の記述を追加します。
"browserify": {
  "transform": [
    "debowerify"
  ]
}

$ cat src/js/a.js 
(function(global) {
    'use strict';

    var $ = require('jquery');

    $('#btn').click(function() {
        alert('happy!');
    });
})((this || 0).self || global);

$ cat gulpfile.js 
'use strict';

var gulp = require('gulp');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var browserify = require('browserify');
var source = require('vinyl-source-stream');
var es = require('event-stream');

gulp.task('script', function (callback) {
    var sc = gulp.src(['src/js/*.js'])
        .pipe(concat('all.js'))
        .pipe(uglify())
        .pipe(gulp.dest('public/assets/js'));
    var br = browserify({
            debug: true,
            entries: ['public/assets/js/all.js']
        }).bundle()
        .pipe(source('all.js'))
        .pipe(gulp.dest('public/assets/js'));
    return es.merge(sc, br);
});

gulp.task('hoge', function (callback) {
    console.log('hoge');
});

gulp.task('default', ['script']);

ちょっと作法に則ってないかもしれません。もう少しいい書き方があるはず。。
流れとしては、まとめたall.jsにbrowserifyをかけてます。source()が何故必要なのかはよくわかってません。
これでjquery込みのall.jsが作れます。

そもそも今更jqueryはどうなのよ、とか、jqueryぐらい別読み込みでいいよね、という意見もあると思いますが、そこはとりあえずbrowserifyを使ってみたかったということで。。
長くなってきたので今回はここまで!

参考URL
http://qiita.com/cognitom/items/4c63969b5085c90639d4
http://qiita.com/seanchas_t/items/96fbb63e5fe36f94a42e
http://akabeko.me/blog/2014/12/browserify/
http://takahashifumiki.com/web/programing/3512/

PAGE TOP