gulp 自动添加版本号
本文介绍利用 gulp-rev 和 gulp-rev-collector 进行版本管理
npm官网介绍使用后的效果如下:
1 2 3 | "/css/style.css" => "/dist/css/style-1d87bebe.css" "/js/script1.js" => "/dist/script1-61e0be79.js" "cdn/image.gif" => "//cdn8.example.dot/img/image-35c3af8134.gif" |
gulp-rev: 对目标文件进行MD5计算序列值,更改文件名,生成键值对json文件(manifest文件,如上)
gulp-rev-collector: 根据manifest文件的对应关系,替换目标文件内的引用链接,效果如下:
1 2 3 | <link rel= "stylesheet" href= "http://static.guojiang.tv/mobile/css/income.css" /> 替换后: <link rel= "stylesheet" href= "http://static.guojiang.tv/mobile/css/income-e25a4c9a0d.css" /> |
但这种更改文件名的方式 容易导致发布后由于种种原因导致某些文件找不到的问题。
所以我们想更改为如下的方式:
1 2 3 | "activity/channel/2.css" : "activity/channel/2.css?v=4ddaaeae28" "activity/christmas.css" : "activity/christmas.css?v=2d21a0c7ca" "activity/channel/1.jpg" : "activity/channel/1.jpg?v=c8571d8112" |
即在不更改文件名,在引用的文件名后加?v=hashVal的方式。
需要我们手动更改这两个插件的源代码,如下:
第一步:打开node_modules\gulp-rev\index.js 第144行
1 2 | /*manifest[originalFile] = revisionedFile;*/ manifest[originalFile] = originalFile + '?v=' + file.revHash; |
第二步:打开nodemodules\gulp-rev\nodemodules\rev-path\index.js 第10行
(如果找不到此文件,则找到路径nodemodules\rev-path\index.js 第10行进行修改)
1 2 | /*return filename + '-' + hash + ext;*/ return filename + ext; |
第三步:打开node_modules\gulp-rev-collector\index.js
第31行
1 2 3 4 5 6 7 | /*if ( !_.isString(json[key]) || path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' ) !== path.basename(key) ) { isRev = 0; }*/ if ( !_.isString(json[key]) || path.basename(json[key]).split( '?' )[0] !== path.basename(key) ) { isRev = 0; } |
第50行
1 2 3 4 | /*return pattern.replace(/[\-\[\]\{\}\(\)\*\+\?\.\^\$\|\/\\]/g, "\\$&");*/ var rp = pattern.replace(/[\-\[\]\{\}\(\)\*\+\?\.\^\$\|\/\\]/g, "\\$&" ); rp = pattern + "(\\?v=(\\d|[a-z]){8,10})*" ; return rp; |
第90行
1 2 3 4 5 6 7 8 9 | /*patterns.push( escPathPattern( (path.dirname(key) === '.' ? '' : closeDirBySep(path.dirname(key)) ) + path.basename(key, path.extname(key)) ) + opts.revSuffix + escPathPattern( path.extname(key) ) );*/ 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})*" ); |
OK,这样就得到了如下的结果:
1 2 3 4 5 | <img src= "/img/common/tuhao.png?v=ee283a76b9" > <link rel= "stylesheet" type= "text/css" href= "/css/forum.css?v=bf5de1c040" > <script type= 'text/javascript' src= "/js/component/flexible.js?v=e2afd4dade" ></script> css中: background: url(/img/all.png?v=d69570864e) no-repeat; |
可能出现的问题:
权限问题,建议删除node_modules文件夹,把gulp插件重新构建
1 | npm install |
如果不行,看下是否是windows下的gulp操作虚拟机中的文件,如果是,尝试在虚拟机中重新安装node npm gulp然后运行试试。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术