Gulp开发:Gulp自动添加版本号

STM32 USB-CAN适配器WINUSB免驱改造实战:Win11即插即用 USB-CAN适配器是汽车电子与工业控制中关键的总线调试工具,其核心能力依赖于稳定、低延迟的USB通信机制。传统CDC虚拟串口方案常因驱动冲突、系统兼容性差(尤其Win11)及DFU模式识别失败而失效。WINUSB作为一种用户态直通协议,通过严格遵循USB设备类规范(bInterfaceClass=0xFF等),将驱动逻辑前移至固件层,实现真正零INF文件、免管理员权限的即插即用体验。该技术路径不仅规避了Windows内核驱动开发复杂度,更赋予开发者对CAN帧收发全链路的字节级控制权,广泛应用于ECU报文抓 阅读详情

推荐使用gulp-rev + gulp-rev-collector是比较方便的方法,结果如下:

"/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"

但是由于公司发布系统限制,如果用上面方法实现,每次更新都会积压过多过期无用的文件,我们预期效果是:

"/css/style.css" => "/dist/css/style.css?v=1d87bebe"
"/js/script1.js" => "/dist/script1.js?v=61e0be79"
"cdn/image.gif"  => "//cdn8.example.dot/img/image.gif?v=35c3af8134"

怎么破?改上面两个Gulp插件是最高效的方法了。

  1. 安装Gulp
    npm install --save-dev gulp

  2. 分别安装gulp-rev、gulp-rev-collerctor
    npm install --save-dev gulp-rev
    npm install --save-dev gulp-rev-collector

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

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

  4. 打开node_modules\gulp-rev\node_modules\rev-path\index.js

    10行 return filename + '-' + hash + ext;
    更新为: return filename + ext;

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

    31行 if ( path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' ) !== path.basename(key) ) {
    更新为: if ( path.basename(json[key]).split('?')[0] !== path.basename(key) ) {

  6. 配置gulpfile.js, 可参考下面gulpfile.js代码

  7. 结果达到预期,如下:

    Css
     background: url('../img/one.jpg?v=28bd4f6d18');
     src: url('/fonts/icomoon.eot?v=921bbb6f59');
    Html
     href="css/main.css?v=885e0e1815"
     src="js/main.js?v=10ba7be289"
     src="img/one.jpg?v=28bd4f6d18"

目录

├── package.json
├── gulpfile.js
├── src/
│   ├── css/
│   │   ├── main.less
│   │   └── normalize.less
│   ├── js/
│   │   ├── xx.js
│   │   └── xx.js
│   ├── img/
│   │   ├── xx.jpg
│   │   └── xx.png
│   ├── fonts/
│   │   ├── xx.svg
│   │   └── xx.ttf
│   ├── rev/
│   ├── index.html  

package.json:

{
  "devDependencies": {
    "apache-server-configs": "2.14.0",
    "archiver": "^0.14.3",
    "del": "^1.1.1",
    "glob": "^5.0.5",
    "gulp": "^3.8.11",
    "gulp-autoprefixer": "^2.1.0",
    "gulp-changed": "^1.2.1",
    "gulp-csslint": "^0.1.5",
    "gulp-header": "^1.2.2",
    "gulp-if": "^1.2.5",
    "gulp-jshint": "^1.11.2",
    "gulp-less": "^3.0.3",
    "gulp-load-plugins": "^0.10.0",
    "gulp-minify-css": "^1.2.0",
    "gulp-minify-html": "^1.0.4",
    "gulp-rev": "^5.1.0",
    "gulp-rev-collector": "^1.0.0",
    "gulp-uglify": "^1.2.0",
    "gulp-util": "^3.0.6",
    "jquery": "1.11.3",
    "jshint": "^2.8.0",
    "jshint-stylish": "^2.0.1",
    "mocha": "^2.2.4",
    "normalize.css": "3.0.3",
    "run-sequence": "^1.0.2"
  },
  "engines": {
    "node": ">=0.10.0"
  },
  "h5bp-configs": {
    "directories": {
      "archive": "archive",
      "dist": "dist",
      "src": "src",
      "test": "test"
    }
  },
  "homepage": "",
  "license": {
    "type": "MIT",
    "url": ""
  },
  "name": "gulp-auto-version",
  "private": true,
  "scripts": {
    "build": "gulp build",
    "test": ""
  },
  "version": "1.0.0",
  "dependencies": {}
}

gulpfile.js

var gulp = require('gulp'),
    runSequence = require('run-sequence'),
    gulpif = require('gulp-if'),
    uglify = require('gulp-uglify'),
    less = require('gulp-less'),
    csslint = require('gulp-csslint'),
    rev = require('gulp-rev'),
    minifyCss = require('gulp-minify-css'),
    changed = require('gulp-changed'),
    jshint = require('gulp-jshint'),
    stylish = require('jshint-stylish'),
    revCollector = require('gulp-rev-collector'),
    minifyHtml = require('gulp-minify-html'),
    autoprefixer = require('gulp-autoprefixer'),
    del = require('del');


var cssSrc = ['main.less', 'layer-box.less', 'tag.less'],
    cssDest = 'dist/css',
    jsSrc = 'src/js/*.js',
    jsDest = 'dist/js',
    fontSrc = 'src/fonts/*',
    fontDest = 'dist/font',
    imgSrc = 'src/img/*',
    imgDest = 'dist/img',
    cssRevSrc = 'src/css/revCss',
    condition = true;

function changePath(basePath){
    var nowCssSrc = [];
    for (var i = 0; i < cssSrc.length; i++) {
        nowCssSrc.push(cssRevSrc + '/' + cssSrc[i]);
    }
    return nowCssSrc;
}

//Fonts & Images 根据MD5获取版本号
gulp.task('revFont', function(){
    return gulp.src(fontSrc)
        .pipe(rev())
        .pipe(gulp.dest(fontDest))
        .pipe(rev.manifest())
        .pipe(gulp.dest('src/rev/font'));
});
gulp.task('revImg', function(){
    return gulp.src(imgSrc)
        .pipe(rev())
        .pipe(gulp.dest(imgDest))
        .pipe(rev.manifest())
        .pipe(gulp.dest('src/rev/img'));
});

//检测JS
gulp.task('lintJs', function(){
    return gulp.src(jsSrc)
        //.pipe(jscs())   //检测JS风格
        .pipe(jshint({
            "undef": false,
            "unused": false
        }))
        //.pipe(jshint.reporter('default'))  //错误默认提示
        .pipe(jshint.reporter(stylish))   //高亮提示
        .pipe(jshint.reporter('fail'));
});

//压缩JS/生成版本号
gulp.task('miniJs', function(){
    return gulp.src(jsSrc)
        .pipe(gulpif(
            condition, uglify()
        ))
        .pipe(rev())
        .pipe(gulp.dest(jsDest))
        .pipe(rev.manifest())
        .pipe(gulp.dest('src/rev/js'));
});

//CSS里更新引入文件版本号
gulp.task('revCollectorCss', function () {
    return gulp.src(['src/rev/**/*.json', 'src/css/*.less'])
        .pipe(revCollector())
        .pipe(gulp.dest(cssRevSrc));
});

//检测CSS
gulp.task('lintCss', function(){
    return gulp.src(cssSrc)
        .pipe(csslint())
        .pipe(csslint.reporter())
        .pipe(csslint.failReporter());
});


//压缩/合并CSS/生成版本号
gulp.task('miniCss', function(){
    return gulp.src(changePath(cssRevSrc))
        .pipe(less())
        .pipe(gulpif(
            condition, minifyCss({
                compatibility: 'ie7'
            })
        ))
        .pipe(rev())
        .pipe(gulpif(
                condition, changed(cssDest)
        ))
        .pipe(autoprefixer({
            browsers: ['last 2 versions'],
            cascade: false,
            remove: false       
        }))
        .pipe(gulp.dest(cssDest))
        .pipe(rev.manifest())
        .pipe(gulp.dest('src/rev/css'));
});

//压缩Html/更新引入文件版本
gulp.task('miniHtml', function () {
    return gulp.src(['src/rev/**/*.json', 'src/*.html'])
        .pipe(revCollector())
        .pipe(gulpif(
            condition, minifyHtml({
                empty: true,
                spare: true,
                quotes: true
            })
        ))
        .pipe(gulp.dest('dist'));
});

gulp.task('delRevCss', function(){
    del([cssRevSrc,cssRevSrc.replace('src/', 'dist/')]);    
})

//意外出错?清除缓存文件
gulp.task('clean', function(){
    del([cssRevSrc ,cssRevSrc.replace('src/', 'dist/')]);
})

//开发构建
gulp.task('dev', function (done) {
    condition = false;
    runSequence(
         ['revFont', 'revImg'],
         ['lintJs'],
         ['revCollectorCss'],
         ['miniCss', 'miniJs'],
         ['miniHtml', 'delRevCss'],
    done);
});

//正式构建
gulp.task('build', function (done) {
    runSequence(
         ['revFont', 'revImg'],
         ['lintJs'],
         ['revCollectorCss'],
         ['miniCss', 'miniJs'],
         ['miniHtml', 'delRevCss'],
    done);
});


gulp.task('default', ['build']);
gulp管理版本号 gulp管理版本号,安装过程和使用过程介绍 gulp管理版本号,安装过程和使用过程介绍 立即下载

相关推荐

gulp JS CSS html 压缩优化 及 JS CSS 自动添加版本号

gulp JS CSS html 压缩优化 及 JS CSS 自动添加版本号 以便浏览器刷新缓存 让用户及时无需任何操作即可体验到最新内容 省去缓存的烦恼

Gulp自动添加版本号

转载自:http://www.cnblogs.com/givebest/ 推荐使用gulp-rev+gulp-rev-collector是比较方便的方法,结果如下: "/css/style.css" => "/dist/css/style-1d87bebe.css" "/js/script1.js" => "/dist/script1-61e0be79.js...

weixin_30539625的博客 153

解决微信浏览器弹出 Download: Null 问题的终极指南(附阿里云 OSS 配置详解)

微信内置浏览器点击下载链接时弹出 "Download: Null" 的问题,是开发者常遇到的痛点。本篇文章全面解析其原因,包括 iOS 文件下载限制、Content-Disposition 响应头的重要性,以及阿里云 OSS 默认配置的影响。通过详细教程,教你如何在阿里云 OSS 中设置 Content-Disposition 元数据(attachment;filename=xxx.pdf),有效解决该问题。同时,拓展介绍微信浏览器的文件下载限制、跨平台兼容性优化以及 CDN 配置注意事项。

楠搏万的博客 3992

Gulp 给所有静态文件引用加版本号

在juqery和easyui 盛行的年代许多项目采用纯静态页面去构建前端框架从而实现前后端分离的目的。项目开发周期内往往会频繁修改更新某个文件,当你将文件更新到服务器后客户端由于缓存问题而出现显示异常的情况,这时候你会经常让客户清楚缓存,然后开始了漫长的教学过程,,, 我们也会尝试在静态资源后面加上 ”index.html?v=“ new Date().getTime(); 来解决这个问题,效果也...

weixin_30666401的博客 244

2025年三级等保新规实战:从零开始搭建企业安全防护体系(附完整配置清单)

本文详细解析2025年三级等保新规的核心变化,提供从零开始搭建企业安全防护体系的实战指南。重点介绍动态防护能力、实战化攻防验证和全链路数据保护等关键要求,并附完整配置清单,帮助企业高效合规。

weixin_30836759的博客 468

PyTorch版Unet训练后别只看loss:手把手教你计算并可视化多类别语义分割的mIoU(附完整代码)

本文详细介绍了在PyTorch中使用Unet模型进行多类别语义分割后,如何计算和可视化mIoU(mean Intersection over Union)以全面评估模型性能。通过完整的代码示例和实用技巧,帮助开发者从loss优化转向更精准的区域分割评估,特别适用于医学图像分析等关键场景。

weixin_30906185的博客 435

gulp4.0构建项目(文件压缩、版本号、热加载)

gulp使用1、首先安装node2、全局安装gulp3、创建项目4、创建的好的项目中 因为公司后台项目前端使用layui框架,并且原有的代码没有进行打包,所以选择gulp对项目进行构建。 1、首先安装node 检测node是否安装成功 2、全局安装gulp npm install -g gulp 查看是否安装成功 3、创建项目 npm init 4、创建的好的项目中 ...

qq_44724176的博客 723

工业场景落地:Java+PaddleOCR实现高性能OCR文字识别的终极方案

本文深度解析基于Java的高性能工业级OCR实现方案,集成PP-OCRv5深度学习模型,提供: ✅ 多场景支持:手写体、竖排文本、票据表格的精准识别 ✅ 工业级性能:毫秒级响应,支持GPU加速与高并发处理 ✅ 开箱即用:通过Maven快速集成,5行代码完成文字识别 ✅ 完整技术栈:覆盖文本检测、方向校正、识别后处理全流程 附可运行示例代码,助您快速构建企业级OCR系统!

deng775747758的博客 3611

转战gulp,实现前端静态资源的压缩,加MD5戳,替换引用,加CDN前缀

相信前端er在发布自己的代码时如果不使用前端一些构建工具的话,对频繁上线的项目来说,自己手动压缩打包替换CDN前缀那是一件多么恐怖的事情!所以采用gulp前端构建工具是一个非常明智的选择。 首先来说说发布项目时前端需要进行哪些操作: 1.对静态资源的压缩合并 2.对js,css,img等资源加MD5戳 3.对引用了以上加MD5戳的HTML文件进行替换文件内的引用。 4.为HTML文件内的引用加CDN前缀

cczhumin的博客 9022

FOC:【1】浅析SVPWM算法(七段式)以及MATLAB仿真验证

最近的科研项目需要使用到SVPWM算法,网上相关的原理介绍很多。对于纯应用的需求来说,或许有些内容上的冗余。 本文的目的就是简要并且明确的给出具体的计算步骤,可以帮助快速上手。同时利用MATLAB进行了简单算法验证。.....................

Alex的技术博客 1万+

奥顺居PHP测算引流SEO程序_八字风水_起名解梦_星座生肖综合门户源码

奥顺居PHP测算引流SEO程序_八字风水_起名解梦_星座生肖综合门户源码 S30新框架适合多种奥顺插件。

xl1407的博客 1750

Gulp使用

流文件:流=> 一种文件传输的格式=> 一段段的文件传输流格式:流=> 从头到尾的一个过程=> 需要从源开始一步一 步加工gulp是基于流格式的一种打包构建工具。

pacong的博客 1178

9、 量子支持向量机:从经典到量子的跨越

本文详细介绍了量子支持向量机(QSVM)的基本原理及其在PennyLane和Qiskit框架中的实现方法。从经典SVM的基础知识出发,逐步深入到量子领域的应用,包括如何定义量子核函数、与scikit-learn集成以及在模拟器和实际量子计算机上的训练和评估过程。最后通过表格和流程图总结了不同框架下的实现要点,为未来量子机器学习的研究提供了参考。

weixin_42433737的博客 183

gulp实现开发生产版本,自动添加版本号为参数格式

gulpfile.js //引入gulp及各种组件; 'use strict'; var gulp = require('gulp'), uglify = require('gulp-uglify'), //压缩js minifyCSS = require('gulp-clean-css'), ...

相濡以沫的博客 1126

11、基于多阵列电极的表面肌电信号运动估计

本文介绍了一种基于多阵列电极的表面肌电信号运动估计技术,旨在实现对手腕和手指运动的高精度估计,解决传统人机接口在操控多自由度机器人时的局限性。通过多阵列电极系统采集前臂肌肉活动信号,结合独立成分分析(ICA)和非负矩阵分解(NMF)等信号处理方法,提取肌肉协同作用,进而生成运动指令以控制机器人或假肢手。文章对比了多阵列电极与传统电极的优势,展示了运动估计算法的整体流程,并以假肢手控制为例说明其实际应用。最后探讨了该技术在测量精度、应用拓展、智能化和便携化等方面的未来发展方向。该技术为假肢控制、康复训练和人机

ik678901234的博客 87

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

使用gulp进行自动在js文件后加版本号,使在更新的时候不必手动清理缓存

原理如果不是第一次访问这个网页,浏览器会留下js或css的缓存,这对开发人员发布新版本系统的时候会起到不利影响, 总会叫用户去清理缓存.解决方案是在js或css文件后面加版本号,如:<script src="src/components/$module.js?v=1.0.0"></script>当浏览器缓存中的文件问号后面的值和发布新系统的值不一样的话, 浏览器会认为他是该文件的某个版本,就会重新加

放开那个桃子的博客 5068

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

配置gulp进行es6开发,包括es6、压缩图片、编译less、压缩css、自动添加版本号,和热更新的功能...

百度了一圈,想要在PC端进行ES6开发,都没有找到相关的脚手架工具。后来想起还有gulp这样的东西,所以就动手配置了一个关于在gulp进行开发的自动化工具。这份配置文件包括了,es6、压缩图片、编译less、压缩css、自动添加版本号,和热更新的功能。 __注:项目地址: github.com/gentlefung/…这里有更详尽的用法 var gulp = require('gulp'), ...

weixin_34362991的博客 218

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

gulp 修改 html 引入,GitHub - 3113001457/gulp-version: 通过gulp在原html文件上自动化添加js、css版本号...

问题:1、当我们修改js和css文件时往往需要清除浏览器的缓存,否则有些效果就看不到更新过后的。2、通过对js,css文件内容进行hash运算,生成一个文件的唯一hash字符串(如果文件修改则hash号会发生变化)3、替换html中的js,css文件名,生成一个带版本号的文件名,这样加版本号的静态文件就不会存在缓存的问题了。解决:1、gulp有自动化添加版本hash的插件gulp-rev,它的效果...

weixin_35171513的博客 285

使用gulp工具自动给css和js批量添加版本号以解决缓存

网站开发时,每次css或js文件修改后,阅读器因有缓存而没法实时的出现最新的页面内容,很可能导致页面混乱。 处理办法: 方法一:可以通过js自动给html添加版本号 document.write(“href=’/css/layout.css?v=”+new Date().getTime()+"’>"); 方法二:若是jsp页面,可以使用java代码生成时间戳(若是jsp页面用方法一也行,但此...

toplanxue的博客 952

gulp的使用

gulp工具的使用

xccevol的博客 2413

node.js笔记——gulp

1、全局安装 npm install gulp -g 2、安装到具体目录,并安装相应的自动化插件 npm install -save-dev gulp gulp-concat gulp-minify-css gulp-rev gulp-rev-collector [concat] 文件合并 [minify-css] 压缩样式文件 [rev] 修改静态文件版本 [rev-collec...

weixin_30583563的博客 79

gulp3.9.1配置总结

点击详情 转载注明出处哦

GoldenLegs的博客 3445

gulp配置备份

// 引入 gulp var gulp = require('gulp'); // 引入组件 var clean = require('gulp-clean'); //- 清除 var sass = require('gulp-sass'); //- sass编译 var concat = require('gulp-concat'); //- 合并 var uglify =...

weixin_30505751的博客 111

glup自动化构建工具

实现的功能包括 js压缩,css文件合并压缩并在html加版本号,压缩html文件 1.安装gulp 建议参考官网就行http://www.gulpjs.com.cn/docs/getting-started/ npm install gulp --save -dev [注:将gulp安装到项目] npm init [注:根据提示一步一步创建package.json 最...

176

gulp插件功能总结

gulp插件功能 总结一下gulp插件的功能用法 1.gulp-less less转css功能; 2.gulp-autoprefixer 给css添加浏览器私有化前缀 3.gulp-cssmin加粗样式 压缩css,把注释换行消除; 4.gulp-rename 重命名文件名; 5.gulp-imagemin 图片压缩功能 6.gulp-uglify js压缩功能 7.gulp-concat 合并文...

qq_43485277的博客 199

Gulp真实项目用例

包括了less预编译,css压缩,html文件include引入,js混淆压缩,本地开发热刷新服务器,html压缩,版本号添加 github地址: gulpfile.js var gulp = require('gulp'), //基础库 imagemin = require('gulp-imagemin'), //图...

weixin_33750452的博客 118
上一篇: node开发:windows环境下npm Cannot find module 'semver'
下一篇: javascript开发:javascript面向对象、创建对象总结
Generon
博客等级 码龄11年 135粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值