利用gulp,当引入文件改动时,版本号自动更新~
gulp自动更新版本号
安装依赖
yarn add gulp-rev
yarn add gulp-rev-collector
本次依赖的版本号为:
"gulp": "^3.9.1"
"gulp-rev": "^8.0.0"
"gulp-rev-collector": "^1.1.1"
插件作用说明
gulp-rev
- gulp-rev:Static asset revisioning by appending content hash to filenames unicorn.css → unicorn-d41d8cd98f.css
- gulp-rev:静态资源更新,通过追加问价hash值到文件名之上,如:unicorn.css -> unicorn-d41d8cd98f.css
API
revFormat([options])
prefix
Type: string Default: "-"
Prefix appended to Hash.
(hash值的前缀)
suffix
Type: string Default: ""
Suffix appended to Hash.
(hash值的后缀)
lastExt
Type: boolean Default: false
Append formatted Hash just before last extension of a file.
(By default, gulp-rev and this plugin will append the formated Hash just before the first . of a filename)
If true, unicorn.ext1.ext2.css would become unicorn.ext1.ext2-d41d8cd98f.css
Note with default options, output is the same with gulp-rev: unicorn.css → unicorn-d41d8cd98f.css
gulp-rev-collector
- Static asset revision data collector from manifests, generated from different streams, and replace their links in html template
- 从manifests(清单)、各种流中收集静态资源信息,并在html之中替换该引用资源(用新的资源名)
使用方法:
- We can use gulp-rev to cache-bust several assets and generate manifest files for them. Then using gulp-rev-collector we can collect data from several manifest files and replace links to assets in html templates.
- 使用此插件必须基于gulp-rev生成的静态资源manifest,然后在html替换这些静态资源的引用。
实例分析
项目demo目录
- src
- css
- common.css
- img
- hsq.jpg
- js
- index.js
- index.html
- gulpfile.js
index.html代码
```html
Document
利用gulp自动添加版本号

```
gulpfile.js的配置如下
const gulp = require('gulp'),
rev = require('gulp-rev'),
revCollector = require('gulp-rev-collector');
gulp.task('css',function(){
return gulp.src('src/css/*.*')
.pipe(rev())
.pipe(gulp.dest('dist/css'))
.pipe(rev.manifest())
.pipe(gulp.dest('rev/css'))
})
gulp.task('js',function(){
return gulp.src("src/js/*.*")
.pipe(rev())
.pipe(gulp.dest("dist/js"))
.pipe(rev.manifest())
.pipe(gulp.dest('rev/js'))
})
gulp.task('rev',['css','js'],function(){
return gulp.src(['rev/**/*.json','src/*.html'])
.pipe(revCollector({
replaceReved: true
})).pipe(gulp.dest('dist'))
})
result:每次当文件变化的时候,那么该文件hash属性值就会变化,此时gulp-rev新形成新的json格式的manifest,当gulp-rev-collector读取json清单之后,就会在Html(任意视图文件)之中替换外部的链接。
新的Html文件为:
```html
Document
利用gulp自动添加版本号

```
但这样的结果并不是我们想要的,理由如下:
- 增加了一些无语义的字符
- 修改了本地的文件,导致文件的新旧不分,不知哪个是最终版本,需要手动删除(或许可以通过node删除,但无用功,因为新文件的hash值与原来不一样,当利用svn这样的工具时候,会需要全部上传,才能取消文件改动通知,不友好),然后再编译。
解决方案:不修改被引用资源的文件名,在模板之中,其请求链接之上改为 *.js?v=hash。
解决方案
手动修改这两个插件
gulp-rev:node_modules\gulp-rev\index.js
manifest[originalFile] = revisionedFile;/*( line 134 ) =>*/
manifest[originalFile] = originalFile + '?v=' + file.revHash;
rev-path:node_modules\rev-path\index.js
return filename + '-' + hash + ext;/*( line 10 )=>*/
return filename + ext;
gulp-rev-collector: node_modules\gulp-rev-collector\index.js (注意:gulp-rev-collector升级后会有变化)
if ( !_.isString(json[key]) || path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' ) !== path.basename(key) ) {
isRev = 0;
}
/*(line 30)=>*/
if ( !_.isString(json[key]) || path.basename(json[key]).split('?')[0] !== path.basename(key) ) {
isRev = 0;
}
return pattern.replace(/[\-\[\]\{\}\(\)\*\+\?\.\^\$\|\/\\]/g, "\\$&");
/*(line 50)=>*/
var rp = pattern.replace(/[\-\[\]\{\}\(\)\*\+\?\.\^\$\|\/\\]/g, "\\$&");
rp = pattern + "(\\?v=(\\d|[a-z]){8,10})*";
return rp;
patterns.push( escPathPattern( (path.dirname(key) === '.' ? '' : closeDirBySep(path.dirname(key)) ) + path.basename(key, path.extname(key)) )
+ opts.revSuffix
+ escPathPattern( path.extname(key) )
);
/*(line(90)=>)*/
patterns.push( escPathPattern( (path.dirname(key) === '.' ? '' : closeDirBySep(path.dirname(key)) ) + path.basename(key, path.extname(key)) )
+ opts.revSuffix
+ escPathPattern( path.extname(key) ) + "(\\?v=(\\d|[a-z]){8,10})*"
);
如此便达到目标了。
结果html如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="./css/common.css?v=2289731958">
</head>
<body>
<p> 利用gulp自动添加版本号 </p>
<img src="./img/hsq.jpg" alt="">
</body>
<script src="./js/index.js?v=8b50a3f85f"></script>
</html>
最后为方便使用,已经把修改好的文件发布到npm之上了;
到时候只需要下载下来直接替换个包的index.js文件即可;
yarn add gulp-rev-hu
yarn add rev-path-hu
yarn add gulp-rev-collector-hu
注意:下载我上传的文件之后,需要将官方版本的js文件进行替换,切记不要替换package,json文件
利用gulp,当引入文件改动时,版本号自动更新~的更多相关文章
- 利用gulp把本地文件移动到指定待发布文件夹
一.目标 把本地的文件移动到待发布的文件中,把static_grab文件中file.txt所列文件列表移动到beta对应文件夹中: 二.实现 var gulp = require('gulp'), w ...
- 图片上传利用request.getInputStream()获取文件流时遇到的问题
图片上传功能是我们web里面经常用到的,获得的方式也有很多种,这里我用的是request.getInputStream()获取文件流的方式.想要获取文件流有两种方式,附上代码 int length = ...
- Git添加文件改动时出错
原来的主文件夹中替换了3个子文件夹,每个子文件夹有若干同名文件,总共替换了大概200多个文件吧. 然后在git主文件夹中使用git add .指令出现如下错误: apple@kissAir: iOS$ ...
- Jenkins使用四:Jenkins创建任务,实现代码有改动时,自动构建
新建任务 指定在哪台节点运行 添加要监控的git地址和使用账号,此账号为设置节点时配置公私钥时设置的ssh登录账号 设置检查代码是否有变更的频率,每三分钟检查一次,如果检查到有变更就构建 修改文件再提 ...
- git 利用hook 实现服务器自动更新代码
如何利用git的hook实现提交代码后自动更新? 因为个人开发经常需要提交代码,每次都需要连接服务器去pull代码,重启服务器就显得十分繁琐,因此github提供了一个时间钩子,用户push代码后可以 ...
- 利用gulp解决前后端分离的header/footer引入问题
在我们进行前后端完全分离的时候,有一个问题一直是挺头疼的,那就是公共header和footer的引入.在传统利用后端渲染的情况下,我们可以把header.footer写成两个单独的模板,然后用后端语言 ...
- Gulp 给所有静态文件引用加版本号
在juqery和easyui 盛行的年代许多项目采用纯静态页面去构建前端框架从而实现前后端分离的目的.项目开发周期内往往会频繁修改更新某个文件,当你将文件更新到服务器后客户端由于缓存问题而出现显示异常 ...
- 利用struts2上传文件时,如果文件名中含有-符号,那么会出错
利用struts2上传文件时,如果文件名中含有-符号,那么会出错 报错如下: HTTP Status 500 - C:\Program Files\Apache Software Foundation ...
- 利用Gulp优化部署Web项目[长文慎入]
Gulp Gulp是一款项目自动化的构建工具,与Grunt一样可以通过创建任务(Task)来帮助我们自动完成一些工作流的内容.当然,今天我们的内容并不是讨论这二者的区别,仅仅是介绍介绍如何利用Gulp ...
随机推荐
- Chrome启动后打开第一个网页很慢的解决方案
Chrome启动后打开第一个网页很慢的解决方案 Chrome/Chromium以速度快著称,最近每当打开chrome的时候,打开第一个页面都非常慢,往往需要数十秒的时间,经分 析,应该是卡在了域名解析 ...
- mysql性能优化之数据库级别优化--优化sql语句
一 优化SELECT语句 1.1 WHERE子句优化 本文暂时只讨论可以处理WHERE子句的优化,下面的一些实例使用SELECT语句,但是相同的优化同样适用DELETE和UPDATE语句中的WHER ...
- 编辑器开发之 Selection 对象的学习
上一篇,介绍了 range 对象的一些属性和方法,了解了一些基本操作,现在来介绍另外一个重要的对象:selection 对象: MDN 的解释是:Selection 对象表示用户选择的文本范围或插入符 ...
- 在Linux(Centos7)上使用Docker运行.NetCore
在上一篇中我们写了如何在windows中使用docker运行.netcore,既然我们了解了windows下的运行发布,我们也可以试试linux下使用docker运行.netcore项目,那么今天我们 ...
- 【带着canvas去流浪(6)】绘制雷达图
目录 一. 任务说明 二. 重点提示 三. 示例代码 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文 ...
- 基于vue-cli快速构建
基于vue-cli快速构建 https://www.jianshu.com/p/2769efeaa10a Vue是近两年来比较火的一个前端框架(渐进式框架吧),与reactjs和angularjs ...
- layUI框架中文件上传前后端交互及遇到的相关问题
下面我将讲述一下我在使用layUI框架中文件上传所遇到的问题: 前端jsp页面: <div class="layui-form-item"> <label cla ...
- 阿里巴巴矢量图标库(Iconfont)-利于UI和前端的搭配
前端时间,做一个小网站的时候,需要用到很多小图标,UI设计好之后不知道如何使用,如果使用图片那会很麻烦,相信一些前端更喜欢iconfont这样的标签直接调用,这样包括颜色和大小以及使用都更方便快捷,于 ...
- java工作流引擎Jflow父子流程demo
关键字 驰骋工作流引擎 流程快速开发平台 workflow ccflow jflow .net开源工作流 定义 一个流程A的一个节点,因工作的需要调起另外的流程B,A就叫父流程,B就叫子流程.如果流 ...
- 服务器二:epoll
#include <unistd.h> #include <sys/types.h> #include <fcntl.h> #include <sys/soc ...