Authored by xuqi

postcss build

  1 +/**
  2 + * Yohobuy 构建脚本
  3 + * @author: xuqi<qi.xu@yoho.cn>
  4 + * @date: 2016/4/25
  5 + */
  6 +
  7 +'use strict';
  8 +
  9 +const gulp = require('gulp');
  10 +const postcss = require('gulp-postcss');
  11 +const sourcemaps = require('gulp-sourcemaps');
  12 +const cssnano = require('gulp-cssnano');
  13 +
  14 +const env = {
  15 + dev: Symbol('development'),
  16 + pro: Symbol('production')
  17 +};
  18 +
  19 +const config = require('../package.json');
  20 +const ftpConfig = {
  21 + host: '218.94.75.50',
  22 + user: 'php',
  23 + pass: 'yoho9646'
  24 +};
  25 +const distRoot = `dist/${config.name}`;
  26 +const dist = {
  27 + js: `${distRoot}/${config.version}`,
  28 + css: `${distRoot}/${config.version}`,
  29 + assets: `${distRoot}/assets`,
  30 + img: `${distRoot}/assets/img`,
  31 + font: `${distRoot}/assets/font`
  32 +};
  33 +
  34 +/**
  35 + * postcss plugins for both dev and pro
  36 + * @parem et Symbol
  37 + */
  38 +const postcssPlugin = (et) => {
  39 + var sprites = {
  40 + spritesmith: {
  41 + padding: 2
  42 + },
  43 + groupBy(file) {
  44 + var group = file.url.split('/')[0];
  45 +
  46 + group = group === '' ? 'yo' : group;
  47 +
  48 + return group ? Promise.resolve(group) : Promise.reject(group);
  49 + }
  50 + },
  51 + assets,
  52 + plugins;
  53 +
  54 + // assets & sprites config in both dev and pro
  55 + if (et === env.pro) {
  56 + assets = {
  57 + loadPaths: [dist.img, dist.font],
  58 + };
  59 +
  60 + Object.assign(sprites, {
  61 + basePath: dist.img,
  62 + stylesheetPath: dist.css,
  63 + spritePath: dist.img
  64 + });
  65 + } else if (et === env.dev) {
  66 + assets = {
  67 + loadPaths: ['img/', 'font/'],
  68 + relativeTo: 'css/'
  69 + };
  70 +
  71 + Object.assign(sprites, {
  72 + basePath: 'img/',
  73 + stylesheetPath: 'css/',
  74 + spritePath: 'img/'
  75 + });
  76 + };
  77 +
  78 + plugins = [
  79 + require('autoprefixer')({
  80 + browsers: ['> 1%']
  81 + }),
  82 + require('precss'),
  83 + require('postcss-sprites').default(sprites),
  84 + require('postcss-assets')(assets),
  85 + require('postcss-calc'),
  86 + require('postcss-opacity'),
  87 +
  88 + //可选
  89 + require('postcss-use')({
  90 + modules: ['postcss-clearfix', 'postcss-crip', 'postcss-short', 'postcss-center', 'postcss-position']
  91 + })
  92 + ];
  93 +
  94 + if (et === env.pro) {
  95 + plugins.push(require('postcss-cachebuster')({
  96 + imagesPath: `/${dist.img}`,
  97 + cssPath: `/${dist.css}`
  98 + }));
  99 + }
  100 + return plugins;
  101 +};
  102 +
  103 +// postcss compile in dev
  104 +gulp.task('postcss-dev', () => {
  105 + return gulp.src('scss/index.css')
  106 + .pipe(sourcemaps.init())
  107 + .pipe(postcssPlugin(env.dev))
  108 + .pipe(sourcemaps.write('.'))
  109 + .pipe(gulp.dest('css/'));
  110 +});
  111 +
  112 +// postcss file watch
  113 +gulp.task('postcss-watch', () => {
  114 + gulp.watch('scss/**/*.css', ['postcss-dev']);
  115 +});
  116 +
  117 +// copy assets
  118 +gulp.task('assets', ['img', 'font']);
  119 +
  120 +// copy img
  121 +gulp.task('img', () => {
  122 + return gulp.src('img/**/*')
  123 + .pipe(gulp.dest(dist.img));
  124 +});
  125 +
  126 +//copy font
  127 +gulp.task('font', () => {
  128 + return gulp.src('font/*')
  129 + .pipe(gulp.dest(dist.font));
  130 +});
  131 +
  132 +// postcss compile in pro
  133 +gulp.task('postcss', ['assets'], () => {
  134 + return gulp.src('scss/index.css')
  135 + .pipe(postcssPlugin(env.pro))
  136 + .pipe(cssnano())
  137 + .pipe(gulp.dest(dist.css));
  138 +});