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);
});
相關文章
相關標籤/搜索