引言:

  前端工程化部署比较重要考虑的一个问题是缓存 ,可以参考 变态的静态资源缓存与更新》

  使用gulp-rev解决的就是变态的静态资源缓存与更新》提出的问题。

rev会做什么:

  根据静态资源内容,生成md5签名,打包出来的文件名会加上md5签名,同时生成一个json用来保存文件名路径对应关系。

替换html里静态资源的路径为带有md5值的文件路径,这样html才能找到资源路径。有些人可能会做:静态服务器配置静态资源的过期时间为永不过期。

达到什么效果:

  静态资源只需请求一次,永久缓存,不会发送协商请求304

  版本更新只会更新修改的静态资源内容

  不删除旧版本的静态资源,版本回滚的时候只需要更新html,同样不会增加http请求次数

配置:

  在系列(五)代码的基础上,再进行扩展。

1.安装:

npm install --save-dev gulp-rev
npm install --save-dev gulp-rev-collector
npm install --save-dev gulp-sync

gulp-sync 处理任务异步

2.找到gulp->config.js,配置rev,配置css和js的revJson输出地址:

/* gulp命令会由gulpfile.js运行,所以src和build文件夹路径如下(根目录下) */
var src = './src';
var dest = './build'; module.exports = {
less: {
all: src + "/less/**/*.less", //所有less
src: src + "/less/*.less", //需要编译的less
dest: dest + "/css", //输出目录
rev: dest + "/rev/css",
settings: { //编译less过程需要的配置,可以为空 }
},
images: {
src: src + "/img/**/*",
dest: dest + "/img"
},
js: {
src: src + "/js/**/*",
dest: dest + "/js",
rev: dest + "/rev/js"
},
clean:{
src: dest
},
rev:{//use rev to reset html resource url
revJson: dest + "/rev/**/*.json",
src: "*.html",//root index.html
dest: ""
}
}

3.gulp->tasks里修改css和js任务,这里只贴js任务代码(css雷同):

var gulp = require('gulp');
var config = require('../config').js;
var rev = require('gulp-rev'); gulp.task('js', function(){
return gulp.src(config.src)
.pipe(rev()) //set hash key
.pipe(gulp.dest(config.dest))
.pipe(rev.manifest()) //set hash key json
.pipe(gulp.dest(config.rev)); //dest hash key json
});

在输出文件之前执行rev(),输出后的文件就会生成hash码,如图:

执行以下两句会生成一个json,里面存储的是文件原名和生成hash文件名的对应

.pipe(rev.manifest()) //set hash key json

.pipe(gulp.dest(config.rev)); //dest hash key json

4.gulp->tasks里新建rev任务:

var gulp = require('gulp');
var config = require('../config').rev;
var rev = require('gulp-rev');
var revCollector = require("gulp-rev-collector"); gulp.task('rev', function () {
return gulp.src([config.revJson, config.src])
.pipe( revCollector({
replaceReved: true,
}) )
.pipe( gulp.dest(config.dest) );
});

config.revJson 是js和css任务生成的文件名对应关系的json,config.src是所有html文件。

所以revCollector 就是根据文件名对应关系,遍历所有html,替换文件命名,替换后如下图:

至此rev任务就完成了。

5.加入gulp-sync:

  更优雅的同步处理任务还是得加上它。

把之前的deploy和default任务合并到combo.js里,并加入gulp-sync

当前这个rev任务,只是遍历html替换静态资源命名。

所有生成revJson的任务执行完之后,才能执行rev。

注意:使用这个缓存部署方式可以设置静态资源服务器缓存永远不会过期(非必要)

>>> github 地址,请选择 rev 分支<<<

gulp-rev:项目部署缓存解决方案----gulp系列(六)的更多相关文章

  1. express+gulp构建项目(三)gulp任务

    这次来看一看gulp是怎么工作的. tasks/paths.js paths.js文件里存放的是gulp任务中需要导入的文件的路径和导出的路径. /** * gulp.src 地址 * gulp.de ...

  2. .NET Core项目部署到Linux(Centos7)(六)发布.NET Core 项目到Linux

    目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...

  3. Docker环境下的前后端分离项目部署与运维(六)搭建MySQL集群

    单节点数据库的弊病 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 单节点MySQL的性能瓶领颈 2016年春节微信 ...

  4. Keil MDK STM32系列(六) 基于抽象外设库HAL的ADC模数转换

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  5. 使用gulp解决RequireJS项目前端缓存问题(一)

    1.前言 前端缓存一直是个令人头疼的问题,你有可能见过下面博客园首页的资源文件链接: 有没有发现文件名后面有一串不规则的东东,没错,这就是运用缓存机制,我们今天研究的就是这种东西. 先堵为快,猛戳链接 ...

  6. 使用gulp解决RequireJS项目前端缓存问题(二)

    1.前言 这一节,我们主要解决在上一节<使用gulp解决RequireJSs项目前端缓存问题(一)>末尾提到的几个问题: 对通过require-config.js引入的js文件修改后,没有 ...

  7. 前端静态资源版本更新与缓存之——gulp自动化添加版本号

    公司项目每次发布后,偶尔会有缓存问题,然后看了下gulp,发现gulp还能给js,css自动化添加版本号,可解决缓存的问题,所以自动化实现静态资源的版本更新才是正道.通过网上的资料试过了两种办法: 1 ...

  8. 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二)

    前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 ...

  9. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

随机推荐

  1. dbstart和dbshut启动、关闭数据库报错ORACLE_HOME_LISTNER is not SET解决办法

    dbstart启动数据库报错,如下: [oracle@wen ~]$ dbstartORACLE_HOME_LISTNER is not SET, unable to auto-start Oracl ...

  2. 跟visual studio 集成的git插件

    目前有三个,git extension,微软的 visual studio tools for git extension,还有git source control provider 经测试,最好用的 ...

  3. SqlServer2012 数据库的同步之发布+订阅

    文章参考了百度过的文章,因为版本不同,操作中也遇到了很多问题,现在整理一下,希望对各位朋友有所帮助. 发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在 ...

  4. Web Essentials之Markdown和自定义编辑器(Web Essentials完结)

    返回Web Essentials功能目录 本篇目录 功能 自定义编辑器 开源项目都会在项目的根目录放一个Readme.md文件来告诉读者一些重要的说明,那么就可以在VS中直接编辑Markdown文件. ...

  5. 解决Activator X for bundle Y is invalid 以及 Activator not found

    如果没有发现编译期异常(就是导航栏项目上有红叉,红感叹号),那么Activator X for bundle Y is invalid和Activator not found这两个异常通常发生在ecl ...

  6. 冲刺阶段 day12

    项目进展 周二我们将专业管理部分又继续做了完善,之前漏掉的几项功能也都在熟能生巧中编写的越来越顺畅,但还差最后一点数据库部分没能实现,我们会尽快完成. 存在问题 还是与数据库的连接上出现问题,部分不能 ...

  7. 开源中国(oschina)的Git托管

    一些废话 对于使用CVS/SVN出身的人来说,Git始终有点难上手(比如我),因为概念较多,一时理不清,尽管网上已经有很多教程,其实后来我发现,要掌握它的办法就是使用它,着手开始用它做源码管理,有问题 ...

  8. 浅谈Excel开发:三 Excel 对象模型

    前一篇文章介绍了Excel中的菜单系统,在创建完菜单和工具栏之后,就要着手进行功能的开发了.不论您采用何种方式来开发Excel应用程序,了解Excel对象模型尤其重要,这些对象是您与Excel进行交互 ...

  9. 怎样记住Integer的最大值(有趣的思维和搞笑的回答)

    前言 今天一个同事问我,数据库里面的某表如果用int做PK,那该表最多可以放多少记录,我说简单啊,就是2^31(正数),跟.NET的Int32.MaxValue一样,约等于20亿(正数)吧.同事说,那 ...

  10. 翻译-使用Spring调用SOAP Web Service

    原文链接: http://spring.io/guides/gs/consuming-web-service/ 调用SOAP web service 本指南将指导你使用Spring调用一个基于SOAP ...