Blame view

public/gulpfile.js 4.97 KB
ccbikai authored
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/**
 * Yohobuy 构建脚本
 * @author: xuqi<qi.xu@yoho.cn>
 * @date: 2016/4/25
 */

'use strict';

const gulp = require('gulp');
const gutil = require('gulp-util');
const ftp = require('gulp-ftp');

const postcss = require('gulp-postcss');
const sourcemaps = require('gulp-sourcemaps');
const cssnano = require('gulp-cssnano');

const webpack = require('webpack');
xuqi authored
18
const WebpackDevServer = require('webpack-dev-server');
ccbikai authored
19 20 21 22 23 24 25 26 27
const webpackConfig = require('./webpack.config.js');

const env = {
    dev: Symbol('development'),
    pro: Symbol('production')
};

const config = require('../package.json');
const ftpConfig = {
毕凯 authored
28
    host: '218.94.75.58',
ccbikai authored
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    user: 'php',
    pass: 'yoho9646'
};
const distRoot = `dist/${config.name}`;
const dist = {
    js: `${distRoot}/${config.version}`,
    css: `${distRoot}/${config.version}`,
    assets: `${distRoot}/assets`,
    img: `${distRoot}/assets/img`,
    font: `${distRoot}/assets/font`
};

/**
 * postcss plugins for both dev and pro
 * @parem et Symbol
 */
const postcssPlugin = (et) => {
    var sprites = {
            spritesmith: {
                padding: 2
            },
            groupBy(file) {
                var group = file.url.split('/')[1];

                group = group === '' ? 'yo' : group;

                return group ? Promise.resolve(group) : Promise.reject(group);
            }
        },
        assets,
        plugins;

    // assets & sprites config in both dev and pro
    if (et === env.pro) {
        assets = {
毕凯 authored
64 65
            loadPaths: [dist.img, dist.font],
            relativeTo: dist.css
ccbikai authored
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
        };

        Object.assign(sprites, {
            basePath: dist.img,
            stylesheetPath: dist.css,
            spritePath: dist.img
        });
    } else if (et === env.dev) {
        assets = {
            loadPaths: ['img/', 'font/'],
            relativeTo: 'css/'
        };

        Object.assign(sprites, {
            basePath: 'img/',
            stylesheetPath: 'css/',
            spritePath: 'img/'
        });
    }

    plugins = [
        require('autoprefixer')({
            browsers: ['> 1%']
        }),
        require('precss'),
        require('postcss-sprites').default(sprites),
        require('postcss-assets')(assets),
        require('postcss-calc'),
        require('postcss-opacity'),

        // 可选
        require('postcss-use')({
            modules: ['postcss-clearfix', 'postcss-crip', 'postcss-short', 'postcss-center', 'postcss-position']
        })
    ];

    if (et === env.pro) {
        plugins.push(require('postcss-cachebuster')({
            imagesPath: `/${dist.img}`,
            cssPath: `/${dist.css}`
        }));
    }
    return plugins;
};

// default
李奇 authored
112
gulp.task('default', ['postcss-dev', 'postcss-watch', 'webpack-dev-server']);
ccbikai authored
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

// ge
gulp.task('ge', ['postcss', 'webpack']);

// dist
gulp.task('dist', ['ge'], () => {
    var ftpstream = ftp(ftpConfig);

    return gulp.src('dist/**/')
        .pipe(ftpstream)
        .pipe(gutil.noop());
});

// postcss compile in dev
gulp.task('postcss-dev', () => {
李奇 authored
128
    return gulp.src('scss/index.css')
ccbikai authored
129 130 131 132 133 134 135 136
        .pipe(sourcemaps.init())
        .pipe(postcss(postcssPlugin(env.dev)))
        .pipe(sourcemaps.write('.'))
        .pipe(gulp.dest('css/'));
});

// postcss file watch
gulp.task('postcss-watch', () => {
李奇 authored
137
    gulp.watch('scss/**/*.css', ['postcss-dev']);
ccbikai authored
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
});

// copy assets
gulp.task('assets', ['img', 'font']);

// copy img
gulp.task('img', () => {
    return gulp.src('img/**/*')
        .pipe(gulp.dest(dist.img));
});

// copy font
gulp.task('font', () => {
    return gulp.src('font/*')
        .pipe(gulp.dest(dist.font));
});

// postcss compile in pro
gulp.task('postcss', ['assets'], () => {
    return gulp.src('scss/index.css')
        .pipe(postcss(postcssPlugin(env.pro)))
        .pipe(cssnano())
        .pipe(gulp.dest(dist.css));
});

// webpack dev server
gulp.task('webpack-dev-server', () => {
    var devConfig = Object.assign({}, webpackConfig, {
        debug: true
    });
xuqi authored
169
    new WebpackDevServer(webpack(devConfig), {
ccbikai authored
170
        contentBase: '.',
biao authored
171
        publicPath: '//localhost:5002/',
ccbikai authored
172 173 174
        hot: true,
        stats: {
            colors: true
毕凯 authored
175 176 177
        },
        headers: {
            'Access-Control-Allow-Origin': '*'
ccbikai authored
178
        }
徐炜 authored
179
    }).listen(5002, '0.0.0.0', (err) => {
ccbikai authored
180 181 182
        if (err) {
            throw new gutil.PluginError('webpack-dev-server', err);
        }
毕凯 authored
183
        gutil.log('[webpack-serve]', 'http://localhost:5002/');
ccbikai authored
184 185 186 187
    });
});

// webpack compile in pro
毕凯 authored
188
gulp.task('webpack', (done) => {
ccbikai authored
189 190 191
    var proConfig = Object.assign({}, webpackConfig);

    proConfig.output.path = dist.js;
毕凯 authored
192 193
    proConfig.plugins.push(new webpack.optimize.UglifyJsPlugin({
        compress: {
yyq authored
194 195
            warnings: false,
            properties: false
yyq authored
196 197 198
        },
        output: {
            keep_quoted_props: true
毕凯 authored
199 200
        }
    }));
biao authored
201
    webpack(proConfig, (err, stats) => {
ccbikai authored
202 203 204
        if (err) {
            throw new gutil.PluginError('webpack', err);
        }
xuqi authored
205
        gutil.log('[webpack compile]:', stats.endTime - stats.startTime, 'ms');
毕凯 authored
206
        done();
ccbikai authored
207 208
    });
});