gulp自动化构建(css、js文件压缩以及版本修改)

引言

众所周知,在前端开发过程中,在文件版本更新之时,会面临恼人的缓存问题(关于缓存相关问题说明可以参考这篇文章https://www.cnblogs.com/lyzg/p/5125934.html )。在更新版本时,最常见的解决由于缓存所引发的工程问题的方法不外乎两种,一种是覆盖式方法,一种是非覆盖式方法。
所谓覆盖式就是指更新js或者css文件时直接用待发布版本文件替换已发布版本文件,这种方法比较简单,适用于在系统用户量较少的情况下,而且在版本更新时还必须尽量在系统闲置期间进行操作。如每次更新css、js文件时不修改文件名,而是在html引用目录中添加版本号,如......./js/index.js?v=12345678。
而非覆盖式方法,是在版本更新时不直接用待发布版本替换已发布版本,而是每次都对待发布的文件修改文件名,并对html的引用目录进行修改。这种方法稍微繁琐,但是相对来讲更加安全可靠。本文所介绍之方法即属于这一种。

目的

本文目的是基于gulp自动化构建工具,实现一种非覆盖式的js、css文件自动压缩以及版本修改的方法。

构建前

原文件目录结构:


源文件目录.png

原html文件

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <title>测试</title>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="stylesheet" href="css/index.css">
</head>
<body>
<article>
    这里是测试.....
</article>
<script src="../js/jquery-1.12.3.min.js"></script>
<script src="js/index.js"></script>
</body>
</html>
构建后

构建生成目录结构:


构建生成目录.png

css版本更新中间文件

{
  "index.css": "index_d41d8cd98f.min.css"
}

js版本更新中间文件

{
  "index.js": "index_d41d8cd98f.min.js"
}

版本更新后html文件

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <title>测试</title>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="stylesheet" href="css/index_d41d8cd98f.min.css">
</head>
<body>
<article>
    这里是测试.....
</article>
<script src="js/jquery-1.12.3.min.js"></script>
<script src="js/index_d41d8cd98f.min.js"></script>
</body>
</html>

实现过程

gulp是基于node.js,node.js以及gulp的安装配置过程比较简单,这里就不多说了。直接上gulp构建文件gulpfile.js如下:

/*
 非覆盖式自动化构建,静态文件修改之后,修改其文件名,并更新html中对静态文件的引用路径
 Created by fasily on 2017-03-13
 */
var gulp = require('gulp'),
    rev = require('gulp-rev'),
    revC = require('gulp-rev-collector'),
    RevAll = require('gulp-rev-all'),
    cssMin = require('gulp-csso'),
    rename = require('gulp-rename'),
    uglify = require('gulp-uglify'),
    clearAll = require('del'),
    runSequence = require('run-sequence');

// 开发js、css打版本入口
gulp.task('default', ['clearAll','dev']);

//开发构建
gulp.task('dev', function (done) {
    runSequence(
        ['revCss'],
        ['revJs'],
        ['cssPathUpdate'],
        ['jsPathUpdate'],
        ['revHtml'],
        done);
});

//定义css、js、html源文件路径
var cssSrc = 'src/html/css/index.css',
    jsSrc = 'src/html/js/index.js',
    htmlSrc = 'src/html/test.html';

// css打版本
gulp.task('revCss', function() {
    return gulp.src(cssSrc)       //指定获取到src下的所有css文件。
        .pipe(cssMin())     //执行压缩操作
        .pipe(RevAll.revision({ hashLength: 10 }))
        .pipe(rename({     //重命名
            suffix: '.min'
        }))
        .pipe(gulp.dest('./dist/css'));//生成目标压缩css文件
});

//生成css版本修改中间文件
gulp.task('cssPathUpdate', function() {
    return gulp.src(cssSrc)       //指定获取到src下的所有css文件。
        .pipe(cssMin())     //执行压缩操作
        .pipe(rev())
        .pipe(rev.manifest())
        .pipe(gulp.dest('./dist/css'));
});

// js打版本
gulp.task('revJs',function () {
    return gulp.src(jsSrc)        //指定获取到src下的所有js文件。
        .pipe(uglify())         //执行压缩操作
        .pipe(RevAll.revision({hashLength: 10 }))
        .pipe(rename({
            suffix: '.min'
        }))
        .pipe(gulp.dest('./dist/js'));//生成目标压缩js文件
});

//生成js版本修改中间文件
gulp.task('jsPathUpdate', function() {
    return gulp.src(jsSrc)       //指定获取到src下的所有js文件。
        .pipe(uglify())        //执行压缩操作
        .pipe(rev())
        .pipe(rev.manifest())
        .pipe(gulp.dest('./dist/js'));
});

//Html替换css、js引用文件版本
gulp.task('revHtml', function () {
    return gulp.src(['dist/**/*.json', htmlSrc])
        .pipe(revC())
        .pipe(gulp.dest('dist'));
});

//清空dist文件夹
gulp.task('clearAll', function () {
    clearAll('./dist/*');
});

另外需要修改gulp-rev-all目录下revisioner.js文件第333行,修改为

filename = filename + '_' + file.revHash.substr(0, this.options.hashLength) + ext;

修改/rev-path/index.js第10行,修改为

return filename + '_' + hash + '.min' + ext;

修改gulp-rev-collector/index.js第11行,修改为

revSuffix: '_[0-9a-f]{8,10}-?.min'

总结

本文旨在通过介绍基于gulp的css、js文件压缩以及版本修改来解决前端文件版本更新时所遇到的更新失效问题,由于时间关系,难免有不当或不细支出,望您提出宝贵意见和建议。

参考文章

https://www.zhihu.com/question/20790576
http://www.jb51.net/article/100652.htm

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容