module.exports = function (gulp, config) { var util = require('util'), path = require('path'), es = require('event-stream'), gutil = require('gulp-util'), del = require('del'), filter = require('gulp-filter'), inject = require('gulp-inject'), htmlmin = require('gulp-htmlmin'), cssmin = require('gulp-cssmin'), uglify = require('gulp-uglify'), concat = require('gulp-concat'), runSequence = require('run-sequence'); /** bower files */ var bowerFiles = require('main-bower-files')(); /** filters pattern */ var pattern = { js: '**/*.js', css: '**/*.css', users: ['**', '!**/vendor/**'] }; /** production flag */ var isProduction = false; gulp.task('clean', function () { return del.sync([config.path.dest]); }); gulp.task('minify-html', function () { return gulp.src(path.join(config.path.dest, '**/*.html')) .pipe(htmlmin({removeComments: true, collapseWhitespace: true, keepClosingSlash: true})) .pipe(gulp.dest(config.path.dest)); }); gulp.task('minify-css', function () { // ユーザ CSS をミニファイ (画面ごとに使用するファイルが異なるため concat はしない) var userStream = gulp.src(path.join(config.path.src, '**/*.css')) .pipe(filter(pattern.users)) .pipe(cssmin()) .pipe(gulp.dest(config.path.dest)); // ライブラリの CSS をミニファイ (concat する) var vendorStream = gulp.src(bowerFiles) .pipe(filter(pattern.css)) .pipe(cssmin()) .pipe(concat('_vendor' + config.timeStamp + '.css')) .pipe(gulp.dest(path.join(config.path.dest, config.path.resources))); return es.merge(userStream, vendorStream); }); gulp.task('minify-js', function () { // ユーザ JavaScript をミニファイ (画面ごとに使用するファイルが異なるため concat はしない) var userStream = gulp.src(path.join(config.path.src, '**/*.js')) .pipe(filter(pattern.users)) .pipe(uglify({preserveComments: 'some'}).on('error', gutil.log)) .pipe(gulp.dest(config.path.dest)); // ライブラリの JavaScript をミニファイ (concat する) var vendorStream = gulp.src(bowerFiles) .pipe(filter(pattern.js)) .pipe(uglify({preserveComments: 'some'}).on('error', gutil.log)) .pipe(concat('_vendor' + config.timeStamp + '.js')) .pipe(gulp.dest(path.join(config.path.dest, config.path.resources))); return es.merge(userStream, vendorStream); }); gulp.task('inject-vendors', function () { var sources, ignorePath, destPath; if (isProduction) { sources = path.join(config.path.dest, '**/_vendor*'); ignorePath = path.join(config.path.dest, config.path.resources), destPath = config.path.dest; } else { sources = bowerFiles; ignorePath = path.join(config.path.src, config.path.resources), destPath = config.path.src; } return gulp.src(path.join(config.path.src, '**/*.html')) .pipe(filter(pattern.users)) .pipe(inject(gulp.src(sources, {read: false}), { name: 'vendor', ignorePath: ignorePath, selfClosingTag: true, transform: function (filepath, file, index, length, targetFile) { var ext = filepath.match(/[^\.]+$/)[0]; switch (ext) { case 'js': return util.format('', filepath, filepath); case 'css': return util.format('', filepath, filepath); } return ''; } })) .pipe(gulp.dest(destPath)); }); gulp.task('build', function () { isProduction = true; runSequence( 'clean', 'less', ['minify-css', 'minify-js'], 'inject-vendors', 'minify-html' ); }); };