解决项目前端静态资源版本更新与缓存--gulp-rev

第一步,cd 项目根目录,安装所需的包,用npm安装:

npm install gulp del gulp-rev run-sequence gulp-rev-collector --save-dev

第二步,在gulpfile.js文件中写上配置:

var gulp = require('gulp'),
    runSequence = require('run-sequence'), //同步执行任务
    rev = require('gulp-rev'),
    revCollector = require('gulp-rev-collector'), //版本数据
    del = require('del');//删除


//定义css、js源文件路径
var cssSrc = './css/*.css',
    jsSrc = './js/v2/*.js';

// 删除导出数据
gulp.task('clean', function (cb) {
    return del([
        // 我们不希望删掉这个文件,所以我们取反这个匹配模式
        'build/js/',
        'build/*.css',
        '!build/font'

    ], cb);
});

//CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射
gulp.task('revCss', function(){
    return gulp.src(cssSrc)
        .pipe(rev())
        .pipe(gulp.dest('./build'))
        .pipe(rev.manifest())
        .pipe(gulp.dest('./build'));
});

//JS生成文件hash编码并生成 rev-manifest.json文件名对照映射
gulp.task('revJs', function(){
    return gulp.src(jsSrc)
        .pipe(rev())                                //给文件添加hash编码
        .pipe(gulp.dest('./build/js/v2'))
        .pipe(rev.manifest())                       //生成rev-mainfest.json文件作为记录
        .pipe(gulp.dest('./build/js/v2'));
});

//生产环境Jsp模板css js文件替换
gulp.task('revJsp', function () {
    return gulp.src(['build/**/*.json','jsp/include/common_3.jsp'])
        .pipe(revCollector(
            {
                replaceReved: true,
                dirReplacements: { //路径替换
                    '${ctx}/css/': '${ctx}/build/',
                    '${ctx}/js/v2' : '${ctx}/build/js/v2'
                }
            }
        ))                         //替换html中对应的记录
        .pipe(gulp.dest('./jsp/include'));                     //输出到该文件夹中
});


//开发环境Jsp模板css js文件替换
gulp.task('dRevJsp', function () {
    return gulp.src(['css/*.json','js/v2/*.json','jsp/include/common_3.jsp'])
        .pipe(revCollector(
            {
                replaceReved: true,
                dirReplacements: {
                    '${ctx}/build/': '${ctx}/css/',
                    '${ctx}/build/js/v2' : '${ctx}/js/v2'

                }
            }
        ))                         //替换html中对应的记录
        .pipe(gulp.dest('./jsp/include'));                     //输出到该文件夹中
});

//开发环境构建
gulp.task('dev-d', function (done) {
    condition = false;
    //依次顺序执行
    return runSequence(
        'dRevJsp', //替换JSP模板
        done
    );
});

//生产环境构建
gulp.task('dev-p', function (done) {
    condition = false;
    //依次顺序执行
    return runSequence(
        'clean',
        ['revCss','revJs'],  //第二步替换静态资源
        ['revJsp'], //第三步替换JSP模板
        done
    );
});

第三步,打开cmd,切换到项目所在的目录,运行

gulp dev-p

备注:1、第三步也可以用 webstorm 直接在  dev 的命令行 右键==》Run ‘dev’

2、默认的,task 将以最大的并发数执行,也就是说,gulp 会一次性运行所有的 task 并且不做任何等待。如果你想要创建一个序列化的 task 队列,并以特定的顺序执行,这里用的是run-sequence 插件

3、虽然是顺序执行,测试如果如果del  clean命令模块 前面不加return,clean 后面的却不执行。

4、加上return  可以执行,不加return的话,task和里面的gulp流是异步执行的,就会出现先finished再编译的情况。

  

原文地址:https://www.cnblogs.com/lidongfeng/p/8884662.html