gulp-rev:项目部署缓存解决方案----gulp系列(六)

引言:

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

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

rev会做什么:

  根据静态资源内容,生成特定hash,打包出来的文件会加上唯一后缀名,同时生成一个json用来保存文件原名和生成的文件名。

替换html里静态资源的路径为带有hash值的文件路径。比较重要的一点:静态服务器需要配置静态资源的过期时间为永不过期。

达到什么效果:

  静态资源只需请求一次,永久缓存,不会发送协商请求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 分支<<<

时间: 2024-10-06 14:44:42

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

利用gulp解决微信浏览器缓存问题

做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问题.关于gulp大家可以去gulp官网去详细了解. 这篇文章主要参考于Gulp解决发布线上文件(CSS和JS)缓存问题和Gulp.js----比Grunt更易用的前端构建工具两篇文章,在这里先谢过原作者. 本文主要记录安装gulp以及使用.解决缓存问题的过程,以便日后方便查阅. 1.安装NodeJS

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

前言 文章 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 中,已经完成对 gulp 的安装,由于是window环境,文中特意提到了可以通过安装 gitbash 来代替 window 系统的 CMD 命令行工具.本节主要围绕 如何使用 Gulp 完成一个预编译 SASS 文件的任务 来逐步熟悉 Gulp . 本文地址:http://www.cnblogs.com/leonkao/p/4611102.html Gulp 概述 Gulp 是一个构建工具,通过自动化处理

一步步创建基于React+EF6+WebApi2+Gulp的项目(前端篇)

一.关于Gulp Q1: 为什么需要Gulp或Grunt? 1. 缓存问题,javascript和css都属于静态文件,因此当我们修改javascript文件时候,经常会遇到local没问题,但是部署到server时候,问题依旧存在,通常这就是缓存导致 2. Javascript和css等项目依赖关系 依赖的产生,会导致请求时间的延长,影响性能.其次,越来越多的js和cs文件,需要请求多次,而浏览器的请求每次请求是有限的,因此我们需要压缩js和cs文件,来减少请求次数,提高性能. Q2: 为什么

myeclipse无法将maven项目部署到tomcat的解决方案

如果myeclipse中项目没有报错且显示已部署成功,甚至运行时命令行也没出错 此时到tomcat目录中没有找到当前项目就只有一种可能: 那就是因为某种原因myeclipse认为的项目名不是你认为的项目名,然后把你项目的内容冒名顶替到某一个部署在tomcat的项目中 解决方案: 1.首先查看pom中指定的项目名称是否正确(如果出现了其他项目名就改回来并重新运行) 2.到workspace(直接从myeclipse中找不到)中找到当前项目的文件.mymetadata和.settings/org.e

用户 &#39;IIS APPPOOL\**&#39; 登录失败的解决方案(项目部署到本地IIS上打开网页出现报错)

为开发方便-将项目部署到本地IIS上打开网页出现报错 1.打开IIS管理 2.点击应用池 3.找到你部署的网站名,右键“高级设置”——>“进程模型”——>“标识”修改为localsystem,点击“确定”. 步骤见下截图: 用户 'IIS APPPOOL\**' 登录失败的解决方案(项目部署到本地IIS上打开网页出现报错)

Vue项目部署遇到的问题及解决方案

写在前面 Vue-Router 有两种模式,默认是 hash 模式,另外一种是 history 模式. hash:也就是地址栏里的 # 符号.比如 http://www.example/#/hello,hash 的值为 #/hello.特点:hash 虽然出现 URL 中,但不会被包含在 HTTP 请求中,对后端不会产生什么影响,改变 URL 不会重载页面. history:利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState()

windows下载的java项目部署到linux的各种解决方案

1.Java是跨平台的,在linux下有问题,主要一是文件读取权限:二检查下系统环境变量设置可正确!.profile JavaWeb_将Windows平台上开发的JavaWeb项目部署到Linux平台上 步骤: 1.在Windows平台上,通过MyEclipse的[File] -> [Export] -> 将项目打包成.war文件: 2.在Windows平台上,删除.war文件中与Linux平台上重复或冲突的.jar文件,一般会在项目的notes文件中说明: 3.通过浏览器访问Linux平台的

JDK版本会影响项目部署

最近在公司里面部署javaweb项目的时候,项目启动的时候报错,我使用了各种方法来寻找答案,将近花了很长的时间.就在今天我终于找到了问题的根源,我开始用的是JDK1.8的版本,换了一个1.7版本的JDK,问题迎刃而解了. 用JDK1.8版本的时候启动tomcat会报下面的错误: (1)java.lang.RuntimeException: java.io.IOException: invalid constant type: 15 我也在网上查询了解决的方案(见这篇博客详细介绍:http://b

项目部署过程中 解决页面乱码问题的经历

本文转载自http://blog.163.com/lucia_gagaga/blog/static/26476801920167256342858/ 项目部署完毕之后 数据库里面的数据读到页面上是乱码 就像这样子: 为 了解决这个乱码问题 花费了一周的时间 请教了好多老师同学同事最后是做了这么几件事才给搞好的:1. 借助 notepad++ 把 .sql 文件的编码格式改成 utf82. 替换 mysql 的 my.cnf 文件 并加入指定字符集的语句3. 使用终端命令重新导入 .sql 文件4