My gulpfile.coffee (Early 2015) でSassのコンパイルとか

公開

gulpでSassのコンパイルやlivereloadなどを試してみた」の記事を書いて早一年。普段Gruntを使っているのでgulpの情報はほとんど追っていないのですが、プラグイン等がよくアップデートされているような雰囲気を感じます。

最近JavaScriptとその動作サンプルファイルを書いているのですが、たまにはgulpを使ってみようかと思ってgulpfileを書いたので、2015年版gulpfileとして記録しておこうと思います。

Note

  • HTTPサーバーとLivereloadは、BrowserSyncで実現してみました。gulp-connectブラックリストに入っているし(まぁ使っても良いのだけれど)、かといってconnectモジュールを直接使おうとすると、結構手間だったので...。
  • Sassのコンパイルは、普段Rubyで実装されたSass(gulpだとgulp-ruby-sassプラグイン)を利用していますが、今回はSassをCで実装したLibsassを使うgulp-sassプラグインを利用してみました。コンパイルが速いですね。どちらのプラグインが良いかは悩むところ。
  • gulp-notifyを採用し、SassのコンパイルやJSHintでエラーが出た際にデスクトップ通知が出るようにしました。
  • 昨年も書いたけど、gulp-plumberが無くても、タスクが終了したり止まったりすることは無いようなのですが...。

gulpfile.coffeeの例

gistにも入れておきました。(package.jsonも入れておいたので、ダウンロードしてお試し頂けます。)

'use strict';

# Settings
BASEPATH = './htdocs/'
PATHS =
    STATIC:
        SRC: BASEPATH
    SCRIPTS:
        SRC: BASEPATH + 'common/js/'
    STYLES:
        SRC: BASEPATH + '_scss/'
        DEST: BASEPATH + 'common/css/'
PORT = '3501'
AUTOPREFIXER_BROWSERS = [
    'last 2 versions'
    'IE >= 8'
    'Firefox ESR'
    'Android >= 4.1'
]

# Load Modules
gulp = require 'gulp'
path = require 'path'
plugins = require('gulp-load-plugins')()
browserSync = require 'browser-sync'
reload = browserSync.reload
jshintStylish = require 'jshint-stylish'

# Tasks
gulp.task 'serve', ->
    browserSync
        server:
            baseDir: BASEPATH
        port: PORT
        browser: "google chrome"
    return

gulp.task 'styles', ->
    gulp.src(PATHS.STYLES.SRC + '*.scss')
        .pipe plugins.sourcemaps.init()
        .pipe plugins.sass
            onError: (err) ->
                plugins.notify().write err
        .pipe plugins.autoprefixer
            browsers: AUTOPREFIXER_BROWSERS
        .pipe plugins.sourcemaps.write('.')
        .pipe gulp.dest(PATHS.STYLES.DEST)

gulp.task 'jshint', ->
    gulp.src PATHS.SCRIPTS.SRC + '*.js'
        .pipe plugins.jshint()
        .pipe plugins.jshint.reporter(jshintStylish)
        .pipe plugins.notify((file) ->
            # http://stackoverflow.com/questions/22787673/gulp-sass-error-with-notify#answer-23115547
            if file.jshint.success
                # Don't show something if success
                return false
            errors = file.jshint.results.map((data) ->
                if data.error
                    return '(' + data.error.line + ':' + data.error.character + ') ' + data.error.reason
                return
            ).join('\n')
            file.relative + ' (' + file.jshint.results.length + ' errors)\n' + errors
        )

gulp.task 'watch', ->
    gulp.watch PATHS.STATIC.SRC + '**/*.html', browserSync.reload
    gulp.watch PATHS.STYLES.SRC + '*.scss', ['styles', browserSync.reload]
    gulp.watch PATHS.SCRIPTS.SRC + '*.js', ['jshint', browserSync.reload]
    return

gulp.task 'default', [
    'serve'
    'watch'
]