UNPKG

generator-xweb

Version:

Scaffold out a front-end rest web app, user bower and npm at same time

217 lines (179 loc) 5.76 kB
var gulp = require('gulp'); var del = require('del'); var imagemin = require('gulp-imagemin'); var browserSync = require('browser-sync'); var config = require('config'); var jquery = require('jquery'); var browserify = require('browserify'); var source = require('vinyl-source-stream'); var replace = require('gulp-replace'); var changed = require('gulp-changed'); var httpProxy = require('http-proxy'); var uglify = require('gulp-uglify'); var buffer = require('vinyl-buffer'); var path = require('path'); var gulpif = require('gulp-if'); var argv = require('yargs').argv; var sftp = require('gulp-sftp'); var stripDebug = require('gulp-strip-debug'); var bowerResolve = require('bower-resolve'); var less = require('gulp-less'); var LessPluginCleanCSS = require('less-plugin-clean-css'); var cleancss = new LessPluginCleanCSS({ advanced: false }); var sourcemaps = require('gulp-sourcemaps'); /* ************************************** Extend browserify ************************************ */ browserify.prototype.requires = function(files) { var b = this; files.forEach(function(file) { b.require(file); }); return this; }; browserify.prototype.externals = function(files) { var b = this; files.forEach(function(file) { b.external(file); }); return this; }; /* ************************************** Tasks start ****************************************** */ var publicPath = path.resolve(__dirname, config.app.public); var imgPath = path.resolve(__dirname, config.app.public, 'img'); var cssPath = path.resolve(__dirname, config.app.public, 'css'); var jsPath = path.resolve(__dirname, config.app.public, 'js'); var packageJson = require('./package.json'); var dependencies = Object.keys(packageJson && packageJson.dependencies || {}); var bowerJson = require('./bower.json'); var bowerDeps = Object.keys(bowerJson && bowerJson.dependencies || {}); var isProduction = process.env.NODE_ENV === 'production'; /** * html */ gulp.task('html', function() { return gulp.src('app/index.html') .pipe(replace(/<%app_title%>/g, config.app.title)) .pipe(gulp.dest(publicPath)); }); /** * minify images */ gulp.task('img', function() { return gulp.src('app/images/**') .pipe(changed(imgPath)) .pipe(gulpif(isProduction, imagemin())) // Optimize .pipe(gulp.dest(imgPath)); }); /** * compile css */ gulp.task('css', function() { var plugin = isProduction ? [cleancss] : []; return gulp.src(['app/styles/**']) .pipe(gulpif(!isProduction, sourcemaps.init())) .pipe(less({plugin: plugin})) .pipe(gulpif(!isProduction, sourcemaps.write())) .pipe(gulp.dest(cssPath)); }); /** * compile javascripts */ gulp.task('js', function() { var entries = argv.online ? ["./app/scripts/main.js"] : ["./test/fakeServer.js", "./app/scripts/main.js"]; var bundler = browserify({ entries: entries, extensions: ['.js', '.hbs'], debug: !isProduction }); bowerDeps.forEach(function(id) { bundler.external(id); }); return bundler .externals(dependencies) .bundle() .pipe(source('main.js')) .pipe(gulpif(isProduction, buffer())) .pipe(gulpif(isProduction, uglify())) .pipe(gulpif(isProduction, stripDebug())) .pipe(gulp.dest(jsPath)); }); /** * browserify js for vendor js **/ gulp.task('vendor', function() { var bundler = browserify(); bowerDeps.forEach(function(id) { bundler.require(bowerResolve.fastReadSync(id), { expose: id }); }); return bundler .requires(dependencies) .bundle() .pipe(source('vendor.js')) .pipe(gulpif(isProduction, buffer())) .pipe(gulpif(isProduction, uglify())) .pipe(gulpif(isProduction, stripDebug())) .pipe(gulp.dest(jsPath)); }); /** * clean build **/ gulp.task('clean', function(cb) { del(['build'], cb); }); /* ****************************************Batch Commands******************************************** */ // ajax 转发后台的代理 var proxy = httpProxy.createProxyServer({ target: config.server.url }); proxy.on('error', function(ex) { console.log(ex); }); var proxyMiddleware = function(req, res, next) { try { if (req && req.url && req.url.indexOf('api') != -1) { proxy.web(req, res); } else { next(); } } catch (ex) { console.log(ex); } }; gulp.task('default', ['build'], function() { browserSync({ server: { baseDir: config.app.public, middleware: proxyMiddleware }, browser: config.browser }); // watch everything gulp.watch('app/*.html', ['html', browserSync.reload]); gulp.watch('app/styles/**', ['css', browserSync.reload]); gulp.watch('app/images/**', ['img', browserSync.reload]); gulp.watch(['app/scripts/**', 'app/templates/**'], ['js', browserSync.reload]); if(!argv.online) gulp.watch(['test/fakeServer.js', 'test/data/**'], ['js', browserSync.reload]); gulp.watch('package.json', ['vendor', browserSync.reload]); }); gulp.task('build', ['html', 'css', 'img', 'js', 'vendor'], function() { console.log(argv.online ? 'Be careful it is connected to the online server' : 'Running offline'); console.log('NODE_ENV: ' + process.env.NODE_ENV); }); gulp.task('deploy', ['build'], function() { return gulp.src(publicPath + '/**') .pipe(sftp({ host: config.deployment.host, port: config.deployment.port, user: config.deployment.user, remotePath: config.deployment.remotePath })); });