gulpfile.js demo

var config = require("./build.config")   //获取build.config.js文件里的内容
var gulp = require("gulp")         //获取gulp模块
var sass = require('gulp-sass');          //gulp-sass模块是用于把sass转成css
var path = require("path")
var babel = require("gulp-babel"); //gulp-babel模块用于把es6转成es5
var postcss = require("gulp-postcss")    //项目中把scss文件转化成css文件
var autoprefixer = require('autoprefixer')    //autoprefixer根据当前浏览器的普及度以及属性支持提供给你前缀:
var postasset = require("postcss-assets")  //postcss-assets 插件用来处理图片和 SVG。在 CSS 声明中引用图片时,可以使用 resolve 加上图片路径的形式,如“resolve(‘logo.png’)”。https://www.ibm.com/developerworks/cn/web/1604-postcss-css/
var cssnano = require('cssnano')      //css文件压缩
var imagemin = require('gulp-imagemin');  //压缩图片文件
var pngquant = require('imagemin-pngquant');  //使用pngquant深度压缩png图片的imagemin插件
var uglify = require('gulp-uglify');         //压缩javascript文件
var cache = require('gulp-cache');          //静态资源缓存
var sourcemaps = require('gulp-sourcemaps');   //简单说,Source map就是一个信息文件,里面储存着位置信息。也就是说,转换后的代码的每一个位置,所对应的转换前的位置
var browserify = require('gulp-browserify');
var changed = require('gulp-changed');     //该插件能够实现只编译或打包改变过文件,大大加快了gulp task的执行速度。
var runSequence = require('run-sequence');    //让gulp任务,可以相互独立,解除任务间的依赖,增强task复用
livereload = require('gulp-livereload');     //不用F5了,实时自动刷新页面来开发
var rev = require('gulp-rev')                 //对文件加md5后缀
var revCollector = require('gulp-rev-collector');   //文件路径替换
var log = console.log.bind(console);
var prefix = require('gulp-prefix');   //给引用了静态资源的的HTML文件替换引用和加CDN前缀
require('shelljs/global')

gulp.task('d', function () {
    livereload.listen();
    gulp.watch('src/**/*.*', function (file) {   //关查src下的所有文件
        log("File " + file.path + " changed!");
        if (file.path.endsWith(".scss")) {    //如果文件后缀是.scss
            gulp.run("css")
        } else if (file.path.endsWith(".jsx")) {   //如果文件后缀是.jsx
            gulp.run("js") 
        } else {
            livereload.changed(file.path);
        }
    })
    log("     ***** Watching " + "[crtl+c to stop.] ******     ");
});

gulp.task('r', function (callback) {
    rm('-rf', config.distRoot)
    runSequence(["js:r", "css:r"], "revCss", "revJs", callback)
});
css()
css(":r")
js()
js(":r")
gulp.task("default", ["r"]);

function js(type) {
    gulp.task("js" + (type || ""), function () {
        var stream = gulp.src(config.jsSrc)
            .pipe(changed(config.jsDist))
            .pipe(sourcemaps.init())
            .pipe(babel({
                presets: ['es2015']
            }))
            .pipe(browserify({
                debug: false
            }))
        if (type == ":r") {
            stream = stream.pipe(uglify({compress: {warnings: true}}))
                .pipe(sourcemaps.write("./sources_maps"))
                .pipe(rev())
                .pipe(gulp.dest(config.jsDist))
                .pipe(rev.manifest())
                .pipe(gulp.dest('./rev/js'))
        } else {
            stream.pipe(gulp.dest("./src/static/js"))
        }
        return stream;
    });
}
function css(type) {
    var processors = [
        postasset,
        autoprefixer({
            browsers: ['last 2 versions', 'Android >= 4.1'],
            cascade: true,
            remove: true
        })
    ];
    var depend = [];
    if (type == ":r") {   // 如果是打包线上版本
        processors.push(cssnano());  压缩css
        depend[0] = "img"
    }
    gulp.task('css' + (type || ""), depend, function () {
        var stream = gulp.src(config.cssSrc)
            .pipe(changed(config.cssDist))
            .pipe(sass())
            .pipe(postcss(processors))
        //.pipe(rename(function (path) {
        //    path.extname = ".css"
        //}))

        if (type == ":r") {
            stream.pipe(rev())
                .pipe(gulp.dest(config.cssDist))
                .pipe(rev.manifest())
                .pipe(gulp.dest('./rev/css'));
        } else {
            stream.pipe(gulp.dest("./src/static/css"))
        }
    });
}


gulp.task('img', function () {
    gulp.src(config.imgSrc)
        .pipe(cache(imagemin({   //缓存压缩图片
            progressive: true,
            svgoPlugins: [{removeViewBox: false}],
            use: [pngquant()]
        })))
        .pipe(gulp.dest(config.imgDist));
});

gulp.task('revCss', function () {
    return gulp.src(['./rev/css/*.json', './src/*.html'])   //读取rev下面的.json文件,来替换html里面对应的文件名字
        .pipe(revCollector())                         //替换html中对应的记录
        .pipe(gulp.dest(config.distRoot));
});

gulp.task('revJs', function () {
    return gulp.src(['./rev/js/*.json', config.distRoot+"*.html"])
        .pipe(revCollector())
        .pipe(gulp.dest(config.distRoot));
});

gulp.task('prefix', function(){
    gulp.src(config.distRoot+"*.html")
        .pipe(prefix(config.cdnUrl, null, '{{'))
        .pipe(gulp.dest(config.distRoot));
});

gulp.task('img:clear', function (done) {  //清除图片缓存
    return cache.clearAll(done);
});
原文地址:https://www.cnblogs.com/myzy/p/7162034.html