记--gulp自动化配置(解决浏览器缓存)

记–gulp自动化配置(解决浏览器缓存)

公司技术分享给我选了个自动化工具gulp,简单粗暴。写一下就当笔记了。。
前端自动化工具有很多 webpack grunk gulp ,gulp个人感觉是最简单的一个了。

4个API gulp.task() 、gulp.src() 、gulp.dest() 、 gulp.watch();

1、gulp.src() 获取文件流(并非原始文件流,而是储存着原始文件流信息的 虚拟文件流)
.pipe() 导入流
2、gulp.task(‘name’,function(){//新建任务 name->任务名
})
3、gulp.dest() //输出文件流
4、gulp.watch() //监听 任务的执行 | 监听文件的修改
gulp 执行 ==> 默认 gulp | | gulp.default

在新建的gulpfile.js 引入gulp 赋值给变量 —> var gulp = require(‘gulp’),//基础库
Npm 安装所需依赖 同样的方式引入

1、 Html 压缩 gulp-htmlmin

npm install gulp htmlmin —save -dev
var htmlmin = require(‘gulp-htmlmin’)
新建简单压缩任务

gulp.task(‘htmlmin’,function(){
		gulp.src(‘src/view/**/*.html’) //匹配需压缩文件
		.pipe(htmlmin()) //执行压缩依赖
		.pipe(gulp.dest(‘dist/view’))//输出路径
	})

也可根据htmlmin api. 添加压缩条件

gulp.task(‘htmlmin’,function(){
		var htmlData = {
				removeComments: true, // 清除HTML注释
				collapseWhitespace: true, // 压缩HTML
				removeEmptyAttributes: true, // 删除所有空格作属性值 <input id="" /> ==> <input />
				removeScriptTypeAttributes: true, // 删除<script>的type="text/javascript"
				removeStyleLinkTypeAttributes: true, // 删除<style>和<link>的type="text/css"
				ignoreCustomFragments: [/<%[\s\S]*?%>/, /<\?[\s\S]*?\?>/, /<\/body>/, /<\/html>/], // 正则表达式数组,匹配的标签将不被处理。 (如 <?php ... ?>, {{ ... }}。
				includeAutoGeneratedTags: false, // 插入 HTML 解析器自动生成的标签。
				minifyJS: true, // 压缩页面JS
				minifyCSS: true // 压缩页面CSS
		}
		gulp.src(‘src/view/**/*.html’) //匹配需压缩文件
		.pipe(htmlmin(htmlData)) //执行压缩依赖
		.pipe(gulp.dest(‘dist/view’))//输出路径
})

Css 压缩
npm install gulp-minify-css --save-dev
var cssmin = require(‘gulp-minify-css’),//css压缩

gulp.task('cssmin', function(){
	return gulp.src(‘src/css/*.css’)
	// .pipe(conCat('css/index.css')) //这句代码就是把所有的css文件压缩到一个css里面,但是这样的话会导致文件太大,引入很多其他页面的css,影响页面的性能,所以看情况是否需要引入
	.pipe(cssmin({
	advanced: false,//类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]
	compatibility: 'ie7',//保留ie7及以下兼容写法 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]
	keepBreaks: false,//类型:Boolean 默认:false [是否保留换行]
	keepSpecialComments: '*'//保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀
	}))    
	.pipe(gulp.dest('gulpmin/css')
});

Js 压缩
npm install gulp-uglify —save -dev
var jsmin = require(‘gulp-uglify’)

uglify —>压缩过后的文件 再次压缩会出现混乱 应避免
gulp.task('jsmin', function () {
	return gulp.src(['src/js/**/*.js','!src/js/commonjs/*.js'])
	// .pipe(conCat('js/index.js')) //这句代码就是把所有的js文件压缩到一个js里面,但是这样的话会导致文件太大,引入很多其他页面的js,影响页面的性能,所以看情况是否需要引入
	.pipe(babel())
	.pipe(uglify())
	.pipe(gulp.dest('gulpmin/js'))
}); 
注意 :gulp-uglify 压缩 需将es6代码转es5 
npm install  gulp-babel — save -dev (若报错 检查gulp版本和 babel版本)
高版本babel 不兼容可 npm install -D babel-loader@7 babel-core babel-preset-enva 回退版本

图片压缩
var imagemin = require(‘gulp-imagemin’),//图片压缩
pngquant = require(‘imagemin-pngquant’),//图片深入压缩
imageminOptipng = require(‘imagemin-optipng’),
imageminSvgo = require(‘imagemin-svgo’),
imageminGifsicle = require(‘imagemin-gifsicle’),
imageminJpegtran = require(‘imagemin-jpegtran’),

gulp.task('imagemin', function () {
	gulp.src('src/images/**/*.{png,jpg,gif,ico}')
	.pipe(cache(imagemin({     
		progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片          
		svgoPlugins: [{removeViewBox: false}],//不要移除svg的viewbox属性
		use: [pngquant(),imageminJpegtran({progressive: true}),
		 imageminGifsicle({interlaced: true}),imageminOptipng({optimizationLevel:3}), imageminSvgo()] //使用pngquant深度压缩png图片的imagemin插件          
	})))
	.pipe(changed('gulpmin/images')) // 对比文件是否有过改动(此处填写的路径和输出路径保持一致)
	.pipe(gulp.dest('gulpmin/images')) // 输出路径
	gulp.src('gulpmin/images/**/*.{png,jpg,gif,svg,ico}')
	.pipe(gulp.dest('gulpmin/images')  
});

==> 解决浏览器静态文件缓存问题
使用hash 文件名后加?v=版本号,或 文件名后md5拼接
所需依赖 gulp-rename 、gulp-rev 、gulp-rev-collector 、gulp-changed
打包时给静态文件名字拼接md5后缀,每次修改的文件重新修改后缀

安装引入依赖
2. 压缩时便历所有的css、js 文件。生成一个json文件,以键值对的方式储存。
3. 在html中匹配引入的文件对应的键 替换成 值。

图片rename 是 应考虑 css中引入时的图片
例如js压缩时

gulp.task('jsmin', function () {
        return gulp.src(['src/js/**/*.js','!src/js/commonjs/*.js'])
        // .pipe(conCat('js/index.js')) //这句代码就是把所有的js文件压缩到一个js里面,但是这样的话会导致文件太大,引入很多其他页面的js,影响页面的性能,所以看情况是否需要引入
        .pipe(babel())
        .pipe(uglify())
        .pipe(rev())//加md5后缀
        .pipe(gulp.dest('gulpmin/js'))
        .pipe(rev.manifest())// 生成一个rev-manifest.json文件,记录MD5的文件改名前后的对应关系
        .pipe(gulp.dest(‘gulpmin/rev/js')); // 输出遍历后的json
});

坑:gulp-rev 只能匹配 值 而如 多层文件 则不能替换

==> 解决浏览器静态文件缓存问题

使用hash 文件名后加?v=版本号,或 文件名后md5拼接
所需依赖 gulp-rename 、gulp-rev 、gulp-rev-collector 、gulp-changed
打包时给静态文件名字拼接md5后缀,每次修改的文件重新修改后缀

安装引入依赖
2. 压缩时便历所有的css、js 文件。生成一个json文件,以键值对的方式储存。
3. 在html中匹配引入的文件对应的键 替换成 值。

图片rename 是 应考虑 css中引入时的图片
例如js压缩时

gulp.task('jsmin', function () {
        return gulp.src(['src/js/**/*.js','!src/js/commonjs/*.js'])
        // .pipe(conCat('js/index.js')) //这句代码就是把所有的js文件压缩到一个js里面,但是这样的话会导致文件太大,引入很多其他页面的js,影响页面的性能,所以看情况是否需要引入
        .pipe(babel())
        .pipe(uglify())
        .pipe(rev())//加md5后缀
        .pipe(gulp.dest('gulpmin/js'))
        .pipe(rev.manifest())// 生成一个rev-manifest.json文件,记录MD5的文件改名前后的对应关系
        .pipe(gulp.dest(‘gulpmin/rev/js')); // 输出遍历后的json
});

坑:gulp-rev 只能匹配 值 而如 多层文件 则不能替换
如下图-红色可以替换,绿色多层则不可以替换
红色可以替换,绿色多层则不可以替换
需在gulp-rev 的modules包中修改源码
==>node_modules/gulp-rev/index.js ;根据项目添加
node_modules/gulp-rev/index.js
z我的项目css目录
==>每次打包需清空 build文件夹 (遍历json 不要清空。gulp-rev 只会更改修改文件的键值)
安装依赖 gulp-clean
clean = require(‘gulp-clean’),//清空文件夹

gulp.task(‘default’,[clean],function(){
		 gulp.start('cssmin','htmlmin','jsmin','imagemin');
	})

也可控制清空内容

gulp.task('clean',function(){
  return gulp.src(['gulpmin/css/**/*.css', 'gulpmin/js/**/*.js','gulpmin/images/**/*.images','gulpmin/view/**/*.html'], {read: false}).pipe(clean({force: true}))
});

{read:false} :是不读取文件 加快程序 ; clean({foece:true}) :强制删除文件

==>另需注意 gulp 的每个task 为异步进行 如若像同步 则不可省略return
若 使用gulp-rev 解决 浏览器缓存问题,需注意任务的进行顺序。需在json遍历生成后再,替换引入

可使用依赖包控制执行顺序 == > gulpSequence = require(‘gulp-sequence’)
—>使用

gulp.task('default',gulpSequence(
    'clean','imagemin','commoncss','commonjs','jsmin','cssmin','htmlmin'
));

gulpSequence(按顺序执行)

var gulp = require('gulp'),//基础库
    htmlmin = require('gulp-htmlmin'),//html压缩
    cssmin = require('gulp-minify-css'),//css压缩
    jshint = require('gulp-jshint'),//js检查
    uglify = require('gulp-uglify'),//js压缩
    imagemin = require('gulp-imagemin'),//图片压缩
    pngquant = require('imagemin-pngquant'),//图片深入压缩
    imageminOptipng = require('imagemin-optipng'),
    imageminSvgo = require('imagemin-svgo'),
    imageminGifsicle = require('imagemin-gifsicle'),
    imageminJpegtran = require('imagemin-jpegtran'),
    domSrc = require('gulp-dom-src'),
    cheerio = require('gulp-cheerio'),
    processhtml = require('gulp-processhtml'),
    Replace = require('gulp-replace'),
    cache = require('gulp-cache'),//图片压缩缓存
    clean = require('gulp-clean'),//清空文件夹
    conCat = require('gulp-concat'),//文件合并
    plumber=require('gulp-plumber'),//检测错误
    gutil=require('gulp-util');//如果有自定义方法,会用到
    babel = require('gulp-babel'),//es6转es5
    rename = require('gulp-rename'),//改名
    rev = require('gulp-rev'),
    revCollector = require('gulp-rev-collector'),
    changed = require('gulp-changed');
    gulpSequence = require('gulp-sequence')//顺序执行
 
function errrHandler( e ){
    // 控制台发声,错误时beep一下
    gutil.beep();
    gutil.log(e);
    this.emit('end');
}
gulp.task('htmlmin', ['cssmin', 'jsmin'], function () {
    var htmlData = {
        removeComments: true, // 清除HTML注释
        collapseWhitespace: true, // 压缩HTML
        removeEmptyAttributes: true, // 删除所有空格作属性值 <input id="" /> ==> <input />
        removeScriptTypeAttributes: true, // 删除<script>的type="text/javascript"
        removeStyleLinkTypeAttributes: true, // 删除<style>和<link>的type="text/css"
        ignoreCustomFragments: [/<%[\s\S]*?%>/, /<\?[\s\S]*?\?>/, /<\/body>/, /<\/html>/], // 正则表达式数组,匹配的标签将不被处理。 (如 <?php ... ?>, {{ ... }}。
        includeAutoGeneratedTags: false, // 插入 HTML 解析器自动生成的标签。
        minifyJS: true, // 压缩页面JS
        minifyCSS: true // 压缩页面CSS
    }
        return gulp.src(['gulpmin/rev/**/*.json', 'src/view/**/*.html'])
        .pipe(revCollector({
          replaceReved: true // 必须增加这个参数,否则更改了源文件之后不会热更新,设置replaceReved标识, 用来说明模板中已经被替换的文件是否还能再被替换,默认是false
        }))
        .pipe(htmlmin(htmlData))
        .pipe(gulp.dest('gulpmin/view'));//文件压缩后需要放到的地方
      
});
gulp.task('cssmin', function(){
     return gulp.src(['src/css/**/*.css','!src/css/commoncss/*.css'])
        // .pipe(conCat('css/index.css')) //这句代码就是把所有的css文件压缩到一个css里面,但是这样的话会导致文件太大,引入很多其他页面的css,影响页面的性能,所以看情况是否需要引入
        .pipe(plumber({errorHandler:errrHandler}))
        .pipe(cssmin({
            advanced: false,//类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]
            compatibility: 'ie7',//保留ie7及以下兼容写法 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]
            keepBreaks: false,//类型:Boolean 默认:false [是否保留换行]
            keepSpecialComments: '*'
            //保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀
        }))    
        // .pipe(rename(function (path) {
        //   path.basename += '.min'
        //   path.extname = '.css'
        // }))
        .pipe(rev()) // 文件名加MD5后缀
        .pipe(gulp.dest('gulpmin/css'))
        .pipe(rev.manifest()) // 生成一个rev-manifest.json文件,记录MD5的文件改名前后的对应关系
        .pipe(gulp.dest('gulpmin/rev/css')) // 将 rev-manifest.json 保存到 rev

        
         
});
gulp.task('jsmin', function () {
        // var jsData = {
        //     mangle: {
        //          except: ['require' , 'exports' , 'module' ]
        //     } // 排除混淆关键字
        // }
   return gulp.src(['src/js/**/*.js','!src/js/commonjs/*.js'])
        // .pipe(conCat('js/index.js')) //这句代码就是把所有的js文件压缩到一个js里面,但是这样的话会导致文件太大,引入很多其他页面的js,影响页面的性能,所以看情况是否需要引入
        .pipe(babel())
        .pipe(uglify())
        .pipe(rev())
        .pipe(gulp.dest('gulpmin/js'))
        .pipe(rev.manifest())
        .pipe(gulp.dest('gulpmin/rev/js'));

}); 

gulp.task('imagemin', function () {
   return gulp.src('src/images/**/*.{png,jpg,gif,ico}')
        // .pipe(plumber({errorHandler:errrHandler}))
        // .pipe(cache(imagemin({     
        //     progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片          
        //     svgoPlugins: [{removeViewBox: false}],//不要移除svg的viewbox属性
        //     use: [pngquant(),imageminJpegtran({progressive: true})
        //     , imageminGifsicle({interlaced: true}),imageminOptipng({optimizationLevel:3}), imageminSvgo()] //使用pngquant深度压缩png图片的imagemin插件          
        // })))
        // .pipe(changed('gulpmin/images')) // 对比文件是否有过改动(此处填写的路径和输出路径保持一致)
        // .pipe(gulp.dest('gulpmin/images')) // 输出路径
        // gulp.src('gulpmin/images/**/*.{png,jpg,gif,svg,ico}')
        // .pipe(gulp.dest('gulpmin/images'))
        .pipe(gulp.dest('gulpmin/images'))

});

gulp.task('commoncss',function(){
    return gulp.src('src/css/commoncss/*.css')
        .pipe(gulp.dest('gulpmin/css/commoncss'))
});
gulp.task('commonjs',function(){
    return gulp.src('src/js/commonjs/*.js')
        .pipe(gulp.dest('gulpmin/js/commonjs'))
})

//======>>build之前清空h5文件夹
gulp.task('clean',function(){
  return gulp.src(['gulpmin/css/**/*.css', 'gulpmin/js/**/*.js','gulpmin/images/**/*.images','gulpmin/view/**/*.html'], {read: false}).pipe(clean({force: true}))
    
});

// gulp.task('default',['clean'],function(){  
//     gulp.start('cssmin','jsmin','imagemin','htmlmin');
// });

gulp.task('default',gulpSequence(

    'clean','imagemin','commoncss','commonjs','jsmin','cssmin','htmlmin'

));
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老杨、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值