kwt-example
Version:
description
244 lines (223 loc) • 7.87 kB
JavaScript
var gulp = require('gulp'),
connectSSI = require('connect-ssi'),
open = require('open'),
path = require('path'),
fs = require('fs'),
browserify = require('browserify'),
source = require('vinyl-source-stream'),
buffer = require('vinyl-buffer'),
path = require('path'),
url = require('url'),
$ = require('gulp-load-plugins')();
var pkg = JSON.parse(fs.readFileSync('./package.json')),
name = pkg.name,
version = pkg.version;
var domain = {
dev: '/',
prd: '//st.haiziwang.com/static/pc/'
}
var opt = {
distFolder: './dist',
srcFolder: './src'
}
var manifest = gulp.src("./manifest.json");
function isRelease() {
var result = /release/.test(this.seq.slice(-1)[0]) ? true : false;
return result;
}
function folder() {
var obj = {};
obj.src = './src'
var release = /release/.test(this.seq.slice(-1)[0]) ? true : false;
if (!release) {
obj.dt = './dist';
obj.st = path.join(obj.dt)
} else {
obj.dt = './release'
obj.st = path.join(obj.dt, version)
}
return obj;
}
function replaceall(env, type) {
var name = path.parse(__dirname).name;
if (env == 'release') {
if (type == 'sinclude') {
return $.replace('{{:sinclude}}', '/static/pc/common/')
} else if (type == 'api') {
return $.replace('{{:api}}', domain.prd + 'api/')
} else if (type == 'vendor') {
return $.replace('{{:vendor}}', domain.prd + 'vendor/')
} else {
return $.replace('{{:static}}', domain.prd + name + '/' + version + '/')
}
} else {
if (type == 'sinclude') {
return $.replace('{{:sinclude}}', '../../common/')
} else if (type == 'api') {
return $.replace('{{:api}}', domain.dev + 'api/')
} else if (type == 'vendor') {
return $.replace('{{:vendor}}', domain.dev + 'vendor/')
} else {
return $.replace('{{:static}}', domain.dev + name + '/' + 'dist' + '/')
}
}
}
function resourceConcat($, file, type, attr) {
var srcArr = [];
var hostUrl = domain.prd;
var $ele = $(type);
var ver = parseInt(Date.now() / 10000);
if ($ele.length > 1) {
$ele.each(function(index, item) {
srcArr.push($(this).attr(attr).replace(new RegExp(hostUrl, 'g'), ''));
if (index !== 0) $(this).remove()
})
$ele.attr(attr, hostUrl + "??" + srcArr.join(','));
$ele.attr(attr, $ele.attr(attr) + '?' + ver)
} else if ($ele.length == 1) {
$ele.attr(attr, $ele.attr(attr) + '?' + ver)
}
}
function findFiles(dir) {
var dir = dir || __dirname;
var files = [];
function walk(dir, files) {
var f = fs.readdirSync(dir);
f.forEach(function(item) {
var tmpPath = path.join(dir, item),
stats = fs.statSync(tmpPath);
if (!stats.isDirectory()) {
files.push(item);
}
});
};
walk(dir, files);
return files;
}
gulp.task('res', function() {
var fd = folder.call(this)
gulp.src([fd.src + '/**/*.{png,gif,jpg}'])
.pipe(gulp.dest(fd.st))
});
gulp.task('sass', ['res'], function() {
var fd = folder.call(this)
var condition = isRelease.call(this)
gulp.src(fd.src + '/css/*.scss')
.pipe($.plumber())
.pipe(!condition ? $.sass() : $.sass({
outputStyle: 'compressed'
}))
.on('error', $.util.log)
.pipe($.autoprefixer({
browsers: ['last 5 versions'],
cascade: false
}))
.pipe(!condition ? replaceall('', 'api') : replaceall('release', 'api'))
.pipe(!condition ? replaceall('', 'sinclude') : replaceall('release', 'sinclude'))
.pipe(!condition ? replaceall('', 'static') : replaceall('release', 'static'))
.pipe(!condition ? replaceall('', 'vendor') : replaceall('release', 'vendor'))
.pipe(gulp.dest(fd.st + '/css'))
});
gulp.task('script', function() {
var files = findFiles(__dirname + '/src/js')
var fd = folder.call(this)
var condition = isRelease.call(this)
files.forEach(function(file, index) {
browserify({
entries: fd.src + '/js/' + file,
debug: condition ? false : true
})
.bundle()
.pipe($.plumber())
.pipe(source(file))
.pipe($.plumber())
.pipe(buffer())
.pipe($.plumber())
.pipe(!condition ? replaceall('', 'api') : replaceall('release', 'api'))
.pipe(!condition ? replaceall('', 'sinclude') : replaceall('release', 'sinclude'))
.pipe(!condition ? replaceall('', 'static') : replaceall('release', 'static'))
.pipe(!condition ? replaceall('', 'vendor') : replaceall('release', 'vendor'))
.pipe(condition ? $.util.noop() : $.sourcemaps.init({
loadMaps: true
}))
.pipe(!condition ? $.util.noop() : $.uglify())
.on('error', $.util.log)
.pipe(condition ? $.util.noop() : $.sourcemaps.write('./'))
.pipe(gulp.dest(fd.st + '/js'))
})
})
gulp.task('connect', function() {
$.connect.server({
root: path.resolve(__dirname, '../'),
port: 2000,
livereload: true,
middleware: function(connect, opt) {
var middlewares = [];
middlewares.push(connectSSI({
ext: '.html',
baseDir: path.resolve(__dirname, '../'),
payload: {
ENV_TYPE: 'dev',
https: false,
channel: '',
page: 'package.json'
}
}))
return middlewares;
}
});
});
gulp.task('build', ['sass', 'script'], function() {
var fd = folder.call(this)
var condition = isRelease.call(this)
gulp.src([fd.src + '/**/*.{html,hbs}'])
.pipe(!condition ? replaceall('', 'api') : replaceall('release', 'api'))
.pipe(!condition ? replaceall('', 'sinclude') : replaceall('release', 'sinclude'))
.pipe(!condition ? replaceall('', 'static') : replaceall('release', 'static'))
.pipe(!condition ? replaceall('', 'vendor') : replaceall('release', 'vendor'))
.pipe(!condition ? $.util.noop() : $.cheerio({
run: function($, file) {
resourceConcat($, file, "link[rel='stylesheet']", 'href')
resourceConcat($, file, 'script[type="text/javascript"]', 'src')
},
parserOptions: {
decodeEntities: false
}
}))
.pipe(gulp.dest(fd.dt))
});
gulp.task(':open', ['default'], function() {
open('http://localhost:2000/' + name + '/dist')
})
gulp.task('clean', function() {
var fd = folder.call(this)
gulp.src(fd.dt)
.pipe($.rimraf({
force: true
}))
})
gulp.task('clean:release', function() {
var fd = folder.call(this)
gulp.src(fd.dt)
.pipe($.rimraf({
force: true
}))
})
gulp.task('release', ['build'], function() {
// var exec = require('child_process').exec;
// exec('scp -r ./release/1.0.0 root@172.172.177.51:/data/static/static/pc/order/ && scp -r ./release/*.html root@172.172.177.51:/data/pcmall/order',
// function(err, out, stderr) {
// if (!err) {
// gulp.src("").pipe($.notify({
// title: 'gulp notify',
// message: "dev发布完成"
// }));
// } else {
// console.log(err)
// }
// })
})
gulp.task('default', ['build', 'connect'], function() {
var fd = folder.call(this)
gulp.watch([fd.src + '/**'], ['build']);
})