版本号用文件MD5生成

默认根据文件MD5生成,因此文件未发生改变,此版本号将不会变

所以当没有改变文件的时候,我们就不能用gulp来改变版本号了

需要安装的插件

  1. npm install --save-dev gulp
  2. npm install --save-dev gulp-rev
  3. npm install --save-dev gulp-rev-collector
  4. npm install --save-dev gulp-asset-rev
  5. npm install --save-dev run-sequence

gulpfile.js代码

  1. //引入gulp和gulp插件
  2. var gulp = require('gulp'),
  3. assetRev = require('gulp-asset-rev'),
  4. runSequence = require('run-sequence'),
  5. rev = require('gulp-rev'),
  6. revCollector = require('gulp-rev-collector');
  7.  
  8. //定义css、js源文件路径
  9. var cssSrc = 'css/*.css',
  10. jsSrc = 'js/*.js';
  11.  
  12. //为css中引入的图片/字体等添加hash编码
  13. gulp.task('assetRev', function(){
  14. return gulp.src(cssSrc) //该任务针对的文件
  15. .pipe(assetRev()) //该任务调用的模块
  16. .pipe(gulp.dest('src/css')); //编译后的路径
  17. });
  18.  
  19. //CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射
  20. gulp.task('revCss', function(){
  21. return gulp.src(cssSrc)
  22. .pipe(rev())
  23. .pipe(rev.manifest())
  24. .pipe(gulp.dest('rev/css'));
  25. });
  26.  
  27. //js生成文件hash编码并生成 rev-manifest.json文件名对照映射
  28. gulp.task('revJs', function(){
  29. return gulp.src(jsSrc)
  30. .pipe(rev())
  31. .pipe(rev.manifest())
  32. .pipe(gulp.dest('rev/js'));
  33. });
  34.  
  35. //Html替换css、js文件版本
  36. gulp.task('revHtml', function () {
  37. return gulp.src(['rev/**/*.json', 'View/*.html'])
  38. .pipe(revCollector())
  39. .pipe(gulp.dest('View'));
  40. });
  41.  
  42. //开发构建
  43. gulp.task('default', function (done) {
  44. condition = false;
  45. runSequence( //需要说明的是,用gulp.run也可以实现以上所有任务的执行,只是gulp.run是最大限度的并行执行这些任务,而在添加版本号时需要串行执行(顺序执行)这些任务,故使用了runSequence.
  46. ['assetRev'],
  47. ['revCss'],
  48. ['revJs'],
  49. ['revHtml'],
  50. done);
  51. });

3、更改gulp-rev和gulp-rev-collector

打开node_modules\gulp-rev\index.js

第144行 manifest[originalFile] = revisionedFile;

更新为: manifest[originalFile] = originalFile + '?v=' + file.revHash;

打开node_modules\rev-path\index.js

10行 return filename + '-' + hash + ext;

更新为: return filename + ext;

打开node_modules\gulp-rev-collector\index.js

31行 if ( !_.isString(json[key]) ||
path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' ) !== 
path.basename(key) ) {

更新为: if ( !_.isString(json[key]) || path.basename(json[key]).split('?')[0] !== path.basename(key) ) {

打开node_modules\gulp-assets-rev\index.js

78行 var verStr = (options.verConnecter || "-") + md5;

更新为:var verStr = (options.verConnecter || "") + md5;

80行 src = src.replace(verStr, '').replace(/(\.[^\.]+)$/, verStr + "$1");

更新为:src=src+"?v="+verStr;

4、继续更改gulp-rev-collector

打开node_modules\gulp-rev-collector\index.js

第107行 regexp: new RegExp( '([\/\\\\\'"])' + pattern, 'g' ),

更新为: regexp: new RegExp( '([\/\\\\\'"])' + pattern+'(\\?v=\\w{10})?', 'g' )

再次运行就能成功了

改变单个文件的内容,再次运行gulp,发现版本号又改变了

gulp给文件加版本号的更多相关文章

  1. gulp自动化压缩合并、加版本号解决方案

    虽然网上有很多的 gulp 构建文章,但是很多都已经随着 gulp 插件的更新无法运行了.因此,我写了这个比较简单的构建方案. 如果还不熟悉 gulp 的插件,可以阅读上一篇文章:精通gulp常用插件 ...

  2. gulp给文件后添加md5时间戳

    这里为总的方法,实际项目中拷贝出来的,底下有详细的总结以及只针对添加时间戳的方法 1 // 引入 gulp及组件 var gulp = require('gulp'), autoprefixer = ...

  3. spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号)

    spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号) 比如我原来有,spring-boot-user微服务,后台进行迭代更新,另外其了一个微服务: sprin ...

  4. ASP.NET MVC 扩展HtmlHelper类为 js ,css 资源文件添加版本号

    写在前面 在项目部署当中会需要更新 css 文件或 js 等资源文件,为了避免由于浏览器缓存的原因无法加载新的 css 或 js ,一般的做法是在资源文件的后面加上一个版本号来解决,这样浏览器就会去服 ...

  5. 在Js或者cess后加版本号 防止浏览器缓存

    在Js或者cess后加版本号 防止浏览器缓存 客户端浏览器会缓存css或js文件,从而减少加载次数,减少流量,提高网页的访问速度.为了使得每次修改js或者css能生效,可以通过改变版本号来使得客户端浏 ...

  6. scrapy cookies:将cookies保存到文件以及从文件加载cookies

    我在使用scrapy模拟登录新浪微博时,想将登录成功后的cookies保存到本地,下次加载它实现直接登录,省去中间一系列的请求和POST等.关于如何从本次请求中获取并在下次请求中附带上cookies的 ...

  7. 前端设计中关于外部js文件加载的速度优化

    在一般情况下,许多人都是将<script>写在了<head>标签中,而许多浏览器都是使用单一的线程来加载js文件的,从上往下,从左往右. 若是加载过程出错,那么网页就会阻塞,就 ...

  8. 简单粗暴的对android so文件加壳,防止静态分析

    转载自http://bbs.pediy.com/showthread.php?t=191649 以前一直对.so文件加载时解密不懂,不了解其工作原理和实现思路.最近翻看各种资料,有了一些思路.看到论坛 ...

  9. php基础知识(3)(文件加载include)

    文件加载 综述: 有4个文件加载的语法形式(注意,不是函数): include,  include_once,  require, require_once; 他们的本质是一样的,都是用于加载/引入/ ...

随机推荐

  1. VS2017的安装和配置

    VS2017专业版安装文件下载:链接:https://pan.baidu.com/s/1tJRYdj_9LzvTSDF5TkkMRg   提取码:tgh5    一些窗口:菜单栏--->视图 字 ...

  2. NOIP2018ty记

    前置传送门:noip2018前流水账 Day-inf~Day-3 写流水账里了 懒得再写了 Day-2~Day-1 做了些noip的原题 真是奇怪,我天天爱跑步和逛公园都是1A的,结果反而有些普及组的 ...

  3. luogu P1357 花园

    传送门 先考虑朴素dp,设\(f_{i,j}\)表示推了\(i\)次,前\(m\)个点的状态为二进制数\(j\)(这里记放C为1),转移的时候枚举下一位放什么,还要考虑是否满足C的个数\(\leq k ...

  4. python 入门基础21 --面向对象_多态、内置方法、反射

    内容: 1.接口思想 2.抽象类思想 3.多态 4.内置方法 5.反射 1.接口思想 建立关联的桥梁,方便管理代码 接口类:用来定义功能的类,位继承它的子类提供功能 该类的功能方法一般不需要实现体,实 ...

  5. Maven继承

    继承为了消除重复,可以把pom 中很多相同的配置提取出来:如:grouptId, version 等. 在使用的时候子工程直接继承父工程的依赖版本号,子工程中不再需要指定具体版本号,方便统一管控项目的 ...

  6. Maven安装配置操作

    1)下载maven安装包并解压: 2)环境变量配置: 3)编辑环境变量Path,追加%MAVEN_HOME%\bin; 4)maven安装配置后进行dos命令检查:在cmd中输入 mvn -v 5)配 ...

  7. SpringMVC使用Burlap发布远程服务

    参考这篇文章https://www.cnblogs.com/fanqisoft/p/10283156.html 将提供者配置类中的 @Bean public HessianServiceExporte ...

  8. Linux下查看文件或文件夹大小的命令df 、du、ls

    转自:http://www.cnblogs.com/benio/archive/2010/10/13/1849946.html 当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的 ...

  9. php- post表单 input name属性的问题

    <input type='text'  style='width: 99px' name='deptNo'></td> name为字符串的时候传递的是单个字符串 <inp ...

  10. How to scroll down with Phantomjs to load dynamic content

    page.open('http://example.com/?q=houston', function () { // Checks for bottom div and scrolls down f ...