Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 594|回复: 0

解决前端静态资源版本更新与缓存的问题——通过gulp 在原html文件上自动化添加js、css、img版本号

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-4 17:50:54 | 显示全部楼层 |阅读模式

    原理

    1、执行gulp指令js、css和img内文件添加版本号,生成一个文件的唯一hash字符串

    2、更新js和css内代码,通过对js,css文件内容进行分析,如果文件修改则hash号会发生变化

    3、替换html中的js,css文件名,生成一个带版本号的文件名

    原html文件代码

    预期效果:在原目录结构下html文件代码

     

    具体操作方法如下: 

    1、首先安装nodejs和淘宝镜像

      从官网(https://nodejs.org/en/)下载nodejs,然后无脑下一步。

      安装淘宝镜像: 打开终端将如下代码贴进去回车,registry = https://registry.npm.taobao.org 

    2、安装gulp和gulp插件

      cnpm install gulp -g

    3、编写gulpfile.js(里面的路径更具个人项目而定)

    var gulp = require('gulp');
    var less = require('gulp-less');
    var sass = require('gulp-sass');
    var connect = require('gulp-connect');
    var concat = require('gulp-concat');
    var uglify = require('gulp-uglify');
    var rename = require('gulp-rename');
    var minifyCSS = require('gulp-minify-css');
    var imagemin = require('gulp-imagemin');
    var debug = require('gulp-debug');
    var changed = require('gulp-changed');
    var gulpif = require('gulp-if');
    var useref = require('gulp-useref');
    var rev = require('gulp-rev');  
    var revCollector = require('gulp-rev-collector'); 
    var fileinclude  = require('gulp-file-include');
    var gulpSequence = require('gulp-sequence');
    var plumber = require('gulp-plumber');
    var postcss = require('gulp-postcss');
    var px2rem = require('postcss-px2rem');
    var autoprefixer = require('gulp-autoprefixer');
    var htmlmin = require('gulp-htmlmin');
    
     
    gulp.task('copyhtml', function(){
      return gulp.src(['html/**/*html'],{base:"."})
        // .pipe(changed('../../dist/wap'))  
        .pipe(fileinclude({
          prefix: '@@',
          basepath: '@file'
        }))    
        .pipe(gulp.dest('../dist'))
        .pipe(debug({title: 'HTML文件:'}))
    });
    //压缩拷贝images
    gulp.task('images', function(){
      return gulp.src('img/**/*.{jpg,png,gif}',{base:"."})
        .pipe(changed('../dist'))  
        .pipe(rev())
        .pipe(imagemin())
        .pipe(gulp.dest('../dist'))
        .pipe(rev.manifest())
        .pipe(gulp.dest('rev/img'))    
        .pipe(debug({title: 'img文件:'}))
    });
    //拷贝data
    gulp.task('data', function(){
      return gulp.src('data/**/*')
             .pipe(changed('../dist/data'))      
             .pipe(rev())
             .pipe(gulp.dest('../dist/data'))
             .pipe(rev.manifest())
             .pipe(gulp.dest('rev/data'))   
             .pipe(debug({title: 'data文件:'}))
    
    });
    //拷贝font
    gulp.task('copyfont', function(){
      return gulp.src('font/**/*')
             .pipe(changed('../dist/font'))      
             .pipe(gulp.dest('../dist/font'))
             .pipe(debug({title: 'font文件:'}))
    });
    //拷贝music
    gulp.task('music', function(){
      return gulp.src('music/**/*')
             .pipe(changed('../dist'))
             .pipe(rev())
             .pipe(gulp.dest('../dist/music'))
             .pipe(rev.manifest())
             .pipe(gulp.dest('rev/music'))
             .pipe(debug({title: 'music文件:'}))
    });
    
    
     
    //压缩 单个 css
    gulp.task('css', function(){
        return gulp.src(['./**/*.css','!node_modules/**/*.css'],{base:"."})
        .pipe(changed('../dist'))
        .pipe(minifyCSS())
        .pipe(gulp.dest('../dist'))
        .pipe(debug({title: '拷贝CSS文件:'}))
    
    });
     
     
    //js
    gulp.task('js', function(){
        return gulp.src(['js/**/*.js','vendor/**/*.js'],{base:"."})
        .pipe(changed('../dist'))  
        .pipe(uglify().on('error', function (e) {
            console.log('错误:'+e)
        }))
        .pipe(gulp.dest('../dist'))
        .pipe(debug({title: 'JS文件:'}))
    
    });
    //合并页面资源
    gulp.task('useref',['copyhtml'],function(){
        return gulp.src('./html/**/*.html',{base:'.'})
        // .pipe(changed('../../develop/wap'))
        .pipe(useref())
        .pipe(gulpif('*.css',minifyCSS()))
        .pipe(gulpif('*.css',gulp.dest('../dist/css')))
        .pipe(gulpif('*.js',uglify()))
        .pipe(gulpif('*.js',gulp.dest('./../dist/js')))
        .pipe(gulpif('*.html',gulp.dest('../dist')))
        .pipe(debug({title: '合并文件:'}))    
    });
    
    gulp.task('cssHash',['useref'], function(){
        return gulp.src(['./../dist/**/*.css'],{base:"."})
        // .pipe(changed('../../dist/wap'))
        .pipe(rev())
        .pipe(gulp.dest('../dist'))
        .pipe(rev.manifest())
        .pipe(gulp.dest('rev/css'))
    });
    gulp.task('jsHash',['useref'], function(){
        return gulp.src(['./../dist/**/*.js','./../dist/vendor/**/*.js'],{base:"."})
        // .pipe(changed('../../dist/wap'))
        .pipe(rev())
        .pipe(gulp.dest('../dist'))
        .pipe(rev.manifest())
        .pipe(gulp.dest('rev/js'))
    });
    //替换HTML中的hash引用
    gulp.task('rev',function () {
        return gulp.src(['rev/**/*.json', './../dist/**/*.html'],{base:"."})
            .pipe(revCollector({replaceReved: true}))
            .pipe(gulp.dest('../dist'))
            console.log('加版本号...')        
    });
    gulp.task('htmlmin', function () {
        var options = {
            removeComments: true,//清除HTML注释
            collapseWhitespace: true,//压缩HTML
            collapseBooleanAttributes: true,//省略布尔属性的值 <input checked="true"/> ==> <input />
            removeEmptyAttributes: true,//删除所有空格作属性值 <input id="" /> ==> <input />
            removeScriptTypeAttributes: true,//删除<script>的type="text/javascript"
            removeStyleLinkTypeAttributes: true,//删除<style>和<link>的type="text/css"
            minifyJS: true,//压缩页面JS
            minifyCSS: true//压缩页面CSS
        };
    
    
    });
     
    gulp.task('default', ['copyhtml','css','js','images','data','copyfont','music','useref','cssHash','jsHash'], function(){
         gulp.run('rev')
         console.log('打包成功-------------------------------------');
    });
    gulp.task('test', ['copyhtml','css','js','images','data','copyfont','music'], function(){
         console.log('测试版打包成功-------------------------------------');
    });
    // gulp.task('default', ['build','watch']);
    // 1、拷贝HTML 到 dist  
    // 2、拷贝css 到 dist   加hash
    // 3、拷贝js 到 dist    加hash
    // 4、拷贝img 到 dist   加hash
    // 5、拷贝data 到 dist  加hash
    // 6、拷贝music 到 dist 加hash
    // 6、useref合并页面资源 到 dist 并加hash(使用时添加特定格式标签 不使用的话 不影响其他配置)

     

    4、到指定目录下执行cnpm install

    执行gulp指令后的结果

    很显然,结果并不是我们想要得到,需要我们继续看下去~

    5、去node_moduls找到gulp-rev和gulp-rev-collector进行更改

    打开node_modules\gulp-rev\index.js
    第144行 manifest[originalFile] = revisionedFile;
    更新为: manifest[originalFile] = originalFile + '?v=' + file.revHash;
    打开node_modules\gulp-rev\node_modules\rev-path\index.js
    10行 return filename + '-' + hash + ext;
    更新为: return filename + ext;
    打开node_modules\gulp-rev-collector\index.js
    40行let cleanReplacement =  path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' );
    更新为: let cleanReplacement =  path.basename(json[key]).split('?')[0];
    163行regexp: new RegExp( prefixDelim + pattern, 'g' ) 更新为: regexp: new RegExp( prefixDelim + pattern+'(\\?v=\\w{10})?', 'g' )

     

    好了再执行下gulp试下,我们非常完美的添加上了版本号

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-24 12:29 , Processed in 0.066354 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表