Gulp解决发布线上文件(CSS和JS)缓存问题

本文的缘由:目前经常线上发布文件后要不断的刷新页面及过很长时间,页面上的CSS和JS文件才能生效,特别对于目前做微信商城的时候,微信内置的浏览器缓存非常的严重,之前我们经常是在文件后面加上时间戳的方式来解决线上发布后的缓存问题,但是在微信浏览器内并不生效;因此我们需要改变文件名的方式来解决缓存的问题,因此使用后缀名加上MD5一连串的字符串来解决缓存的问题;

我们先可以考虑这么一个功能,我在页面上引用css文件如下:

./css/xx.css

./js/xx.js

我现在想通过使用MD5重新命名css文件,在页面上自动变为如下文件

./css/xx-34f3902a35.css

一:首先我们需要安装gulp插件;安装教程如下:

http://www.cnblogs.com/tugenhua0707/p/4069769.html

下面我们需要来看看我整个目录结构如下:

如上目录,在src文件夹是存放所有css文件和JS文件的,gulp.html按道理是根目录下的,但是在打包之前,我是把他们放在src文件夹下,作为源文件,根目录下可以先把他删掉或者放在那边也没有关系;也就是说 把所有的html文件备份一份放在src文件夹下作为源文件;

下面是gulp.html的源代码如下:

二:安装插件

  1. 在项目根目录下 运行npm init 后 执行一些操作会在根目录下生存一个 package.json文件夹;
  2. 进入项目的根目录后,执行命令安装如下插件:

npm install –save-dev gulp gulp-concat gulp-minify-css  gulp-rev  gulp-rev-collector

现在我的package.json 变成如下:

{
  "name": "rev",
  "version": "1.0.0",
  "description": "\"test package\"",
  "main": "index.js",
  "scripts": {
    "test": "\"a common\""
  },
  "keywords": [
    "rev"
  ],
  "author": "tugenhua",
  "license": "ISC",
  "devDependencies": {
    "gulp": "^3.9.0",
    "gulp-concat": "^2.6.0",
    "gulp-jshint": "^2.0.0",
    "gulp-less": "^3.0.5",
    "gulp-minify-css": "^1.2.1",
    "gulp-rename": "^1.2.2",
    "gulp-rev": "^6.0.1",
    "gulp-rev-collector": "^1.0.2",
    "gulp-uglify": "^1.5.1",
    "jshint": "^2.8.0"
  }
}

如上;如果不想安装的话,可以直接在项目的根目录下新建一个package.json文件;直接把上面的package.json代码复制进行即可;最关键的是 devDependencies 依赖项,其他的可以自己根据自己的需要更改即可~ 然后进入项目的根目录下 执行命令 npm install 即可在根目录下生存 node_modules模块插件;

三:在项目的根目录下新建 Gulpfile.js文件配置

所有配置代码如下:

var gulp = require(‘gulp‘);
var concat = require(‘gulp-concat‘);                    //- 多个文件合并为一个;
var minifyCss = require(‘gulp-minify-css‘);               //- 压缩CSS为一行;
var rev = require(‘gulp-rev‘);                          //- 对文件名加MD5后缀
var revCollector = require(‘gulp-rev-collector‘);           //- 路径替换

gulp.task(‘concat‘, function() {                        //- 创建一个名为 concat 的 task   gulp.src([‘./src/css/*.css‘])
//- 需要处理的css文件,放到一个字符串数组里
//.pipe(concat(‘wrap.min.css‘))               //- 合并后的文件名
    .pipe(minifyCss())                         //- 压缩处理成一行
    .pipe(rev())                              //- 文件名加MD5后缀
    .pipe(gulp.dest(‘./dist/css‘))                //- 输出文件本地
    .pipe(rev.manifest())                     //- 生成一个rev-manifest.json
    .pipe(gulp.dest(‘./rev‘));                  //- 将 rev-manifest.json 保存到 rev 目录内
});

gulp.task(‘rev‘, function() {
    gulp.src([‘./rev/*.json‘, ‘./src/*.html‘])
    //- 读取 rev-manifest.json 文件以及需要进行css名替换的文件
    .pipe(revCollector())
    //- 执行文件内css名的替换
    .pipe(gulp.dest(‘./‘));
    //- 替换后的文件输出的目录
});
gulp.task(‘default‘, [‘concat‘, ‘rev‘]);

如上配置,配置完成后,进入根目录执行命令如下:

先执行 gulp concat 这个任务 生成一个rev-mainfest.json文件;

然后再运行rev这个任务,把html文件中的css文件替换掉,执行完后,项目的目录结构变成如下:

对比之前的结构 已经在根目录下生成rev这个文件,该文件下 有一个rev-manifest.json文件,我们可以看看该文件的代码如下:

{
  "gulp.css": "gulp-34f3902a35.css"
}

把gulp.css 文件名 需要改成该生存后有MD5的后缀名的文件;

然后再调用rev这个任务,先读取src下面的所有html的源文件,需要把gulp.css替换成我们生成后的文件,我们现在再来看看生成的根目录下的gulp.html源码变为如下:

可以看到已经替换成带有MD5后缀名的文件了;

注意:为什么一刚开始的时候,我们需要把项目根目录下的所有html文件需要备份一份到src目录下呢? 那是因为每次进行打包的时候,MD5的一连串的字符串会跟着改的,我们需要一个对比的源文件,我们需要把gulp.css 替换成 生成带有MD5一连串的css文件;不管MD5字符串如何更改,我们只需要把gulp.css后缀加上生成的MD5字符串即可~ 那如果我们不备份的话,使用你们的大脑试想下,每次打包一下,根目录下源文件会覆盖一下;并且rev文件夹下 的 rev-manifest.json 代码会变成如下:

{

"gulp.css": "gulp-57f9aab029.css",

"gulp-57f9aab029.css": "gulp-57f9aab02922222.css",

"gulp-57f9aab02922222.css": "gulp-57f9aab0292222aaaaaaa.css",

........

}

每次打包一下,他都会找到页面上的源文件(冒号左侧代表现在的源文件,冒号右边的代表需要替换的新文件的名字);如此循环下来;如果我们备份一下的html文件的话,那么rev-manifest.json永远就是一个替换文件;如下这样的:

{

"gulp.css": "gulp-57f9aab029.css"

}

因为它永远找到的是 源文件上的gulp.css 然后替换成生成新的带有MD5后缀名的文件名;当然如果你觉得不备份的话,在manifest.json生存多少个建值对的都没有关系的话,你也可以不备份,看个人需要;如上只是演示css文件了,当然JS文件也是一样的配置;

github上demo:https://github.com/tugenhua0707/gulp-rev-collector

时间: 2024-10-14 00:58:02

Gulp解决发布线上文件(CSS和JS)缓存问题的相关文章

nginx图片、css、js缓存

开始的时候搭建nginx环境,以为单单是为了负载均衡,实现分布式集群.现在发现可以使用nginx的缓存机制来优化相应速度.下面介绍一下nginx图片.css.js的缓存. #图片缓存时间设置 location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { expires 8d; } #JS和CSS缓存时间设置 location ~ .*.(js|css)?$ { expires 2h; } 可以看出通过设置过期时间,减少后台的访问负担. nginx图片.css.js缓存

解决教学平台上文件中存在无扩展名BUG的办法

Jfinal中添加过滤器声明 public void configHandler(Handlers me) { me.add(new XssHandler()); } 过滤器 package com.demo.common.config; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; impo

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

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

解决修改css或js文件,浏览器缓存更新问题。

在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css.js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css.js等,而不必从你的服务器读取,这样在一定程度上加快了网站的打开速度,又可以节约一下你的服务器流量. 问题 现在问题来了,.htaccess设置的css.js缓存都有一个过期时间,如果在访客的浏览器中已经缓存了css.js,在这些css.js缓存未过期之前,浏览器只会从缓存

css和js带参数v或version

1 <span style="font-size:14px;">css和js带参数(形如.css?v=与.js?v= 或 .css?version=与.js?version= ) 2 3 <script type=”text/javascript” src=”jb51.js?version=1.2.6″></script> 4 <link rel=’stylesheet’ href=’base.css?version=2.3.3′ type=’

使用gulp自动化打包合并前端静态资源(CSS、JS文件压缩、添加版本号)

现在正在做的项目更新迭代比较频繁,会经常对前端代码打包部署,手动整合代码文件很麻烦并且浪费时间,所以决定使用gulp来代替手工完成这项工作. 前端静态资源在发版更新时会面临客户端浏览器缓存的问题(可参考这篇文章),解决这个问题可以采用两类方法:覆盖方法(引用资源时加版本号,不修改资源文件名).非覆盖方法(修改资源文件名),本篇文章主要采用的是第一种加版本号的方式,主要用gulp给静态资源自动加版本号和压缩CSS.JS. 原理:通过对JS,CSS文件内容进行Hash运算,生成一个文件的唯一Hash

[转]通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题

转:http://blog.csdn.net/zhengwish/article/details/51602059 通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题: 用nginx来做webserver的时,上传大文件时需要特别注意client_max_body_size这个参数,否则会中断在nginx的请求中,在php中是无法记录到访问的. 一般上传大文件流程: 首先修改php.ini文件: 参数 设置 说明 file_uploads on 是

Loadrunner上传文件解决办法(大文件)

Loadrunner上传文件解决办法(大文件) 最近再做一个跟海量存储相关的项目测试,需要通过LR模拟用户大量上传和下载文件,请求是Rest或Soap,同时还要模拟多种大小尺寸不一的文件 通常情况下,都是使用简单的post协议即可: 方法一: web_submit_data("importStudent.do", "Action=https://testserver/console/importStudent.do", "Method=POST"

java配置ueditor中解决“未找到上传文件”错误提示

ueditor是一个功能十分强大的在线文本编辑器,但是在ssh框架中,确切的说实在struts2中由于其拦截器需要对request,session对象进行重新封装,这个过程中会把request对象中保存的一些内容清空,所以会导致ueditor的上传功能获取不到需要上传的内容导致“未找到上传文件”的错误! 参考网上资料和自己实验,最终的解决思路是,重写struts2中的一个转换的类,然后配置struts2使用我们重写的这个类.由于我们的工程中可能会有其他的上传等功能,为了不影响其他功能的时候,还需