我爱工程化 之 gulp 使用(二)
上一篇 介绍了gulp的安装、环境等配置、基本使用,那么现在,我们快走进 速8,深入了解吧......
一、各种安装、环境配置、插件安装(参考上一篇文章)
二、项目基本目录结构
三、编写 gulpfile.js 文件
gulp通过gulpfile.js文件来完成相关任务
示例目录
gulpfile.js
//引入gulp及组件 var gulp = require('gulp'), //基础库 htmlmin = require('gulp-htmlmin'), //压缩html rev = require('gulp-rev-append'), //给页面的引用添加版本号,清除页面引用缓存 //autoprefixer = require('gulp-autoprefixer'), //根据设置浏览器版本自动处理浏览器前缀 //cssmin= require('gulp-minify-css'), //css压缩(已经作废) cssmin= require('gulp-clean-css'), //css压缩 cssver = require('gulp-make-css-url-version'), // css文件引用URL加版本号 jshint = require('gulp-jshint'), //js检查 jsmin = require('gulp-uglify'), //js压缩 concat = require('gulp-concat'), //合并文件 rename = require('gulp-rename'), //文件重命名 imagemin = require('gulp-imagemin'), //图片压缩 pngquant = require('imagemin-pngquant'), //深度压缩png图片 cache = require('gulp-cache'), //图片快取,只有更改过得图片会进行压缩 notify = require('gulp-notify'), //更动通知 clean = require('gulp-clean'); //清空文件夹 connect = require('gulp-connect'), //web服务 browserSync = require('browser-sync'), //浏览器同步 reload = browserSync.reload; //自动刷新 //配置开发和发布路径 var path = { //开发环境 src:{ html:'./src/*.html', css:['./src/css/*.css'], js:['./src/js/index.js'], //js:['./src/js/*.js','!./src/js/{zepto.min}.js'], //sass:'./src/sass', image:'./src/images/**/*' }, //发布环境 build:{ html:'./build', js:'./build/js', css:'./build/css', image:'./build/images' }, //不被处理的文件得复制 copy:[ {from:'./src/audio/*',to:'./build/audio'}, {from:['./src/js/*','!./src/js/index.js'],to:'./build/js'} ], clear:['./build/*.html', './build/css/main.css', './build/js/main.js', './build/images' ] }; /** * 建立任务 * */ // 定义web服务模块 gulp.task('webserver', function() { connect.server({ livereload: true, port: 8888 }); }); // 定义web服务模块,增加浏览器同步浏览 gulp.task('browser-sync', function() { browserSync({ server: { baseDir: '.' } }); }); //1.HTML压缩 /*注意:压缩时,textarea会出错,需要手动修改*/ gulp.task('html', 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" /*不要压页面中的JS和CSS容易出错*/ //minifyJS: true,//压缩页面JS //minifyCSS: true//压缩页面CSS }; gulp.src(path.src.html) .pipe(rev()) //.pipe(htmlmin(options)) .pipe(gulp.dest(path.build.html)) .pipe(reload({stream: true})) .pipe(notify({message:'Html task complete'})); }); //2.CSS压缩(基本使用) 合并之后,记得手动修改html中的引入路径 gulp.task('css', function () { gulp.src(path.src.css) // .pipe(autoprefixer({ // browsers: ['last 2 versions'], // //是否美化属性值 默认:true 像这样: // //-webkit-transform: rotate(45deg); // // transform: rotate(45deg); // cascade:true, // remove:true //是否去掉不必要的前缀 默认:true // })) .pipe(concat('index.css')) .pipe(cssver()) // CSS文件引用URl加版本号 .pipe(cssmin({ advanced: false,//类型:Boolean 默认:true [是否开启高级优化(合并选择器等)] compatibility: 'ie7',//保留ie7及以下兼容写法 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式] keepBreaks: false,//类型:Boolean 默认:false [是否保留换行] keepSpecialComments: '*' //保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀 })) //.pipe(rename({ suffix: '.min' })) //如果是多个css合并,记得修改html引入文件的名字 .pipe(gulp.dest(path.build.css)) .pipe(reload({stream: true})) .pipe(notify({message:'Css task complete'})); }); //3.js语法检查及压缩 gulp.task('js', function () { gulp.src(path.src.js) .pipe(jshint()) .pipe(jshint.reporter('default')) //.pipe(concat('main.js')) .pipe(jsmin()) //.pipe(rename({suffix: '.min' })) .pipe(gulp.dest(path.build.js)) .pipe(reload({stream: true})) .pipe(notify({message:'Javascript task complete'})); }); //4.图片处理 gulp.task('image', function(){ return gulp.src(path.src.image) .pipe(cache(imagemin({ optimizationLevel:5,//类型:Number 默认:3 取值范围:0-7(优化等级) progressive:true,//类型:Boolean 默认:false 无损压缩jpg图片 interlaced:true,//类型:Boolean 默认:false 隔行扫描gif进行渲染 multipass:true,//类型:Boolean 默认:false 多次优化svg直到完全优化 use: [pngquant()] //深度处理png格式的图片 }))) .pipe(gulp.dest(path.build.image)) .pipe(reload({stream: true})) .pipe(notify({message:'Images task complete'})); }); //5.复制文件 gulp.task('copy', function(){ for(var i=0,items=path.copy,len=items.length;i<len;i++){ gulp.src(items[i].from).pipe(gulp.dest(items[i].to)) .pipe(notify({message:'copy task complete'})); } }); //6.清空图片、样式、js gulp.task('clean', function() { gulp.src(path.clear,{read: false}) .pipe(clean()) .pipe(notify({message: 'Clean task complete'})); }); //7.默认任务 清空图片、样式、js并重建 运行语句 gulp gulp.task('default', ['clean'], function(){ gulp.start('html','css','js','image','copy'); }); //X.监听任务 运行语句 gulp watch //watch方法是用于监听文件变化,文件一修改就会执行指定的任务 gulp.task('watch', function () { //监听html gulp.watch(path.src.html, function (event) { gulp.run('html'); }); // 监听css gulp.watch(path.src.css, function () { gulp.run('css'); }); // 监听js gulp.watch(path.src.js, function () { gulp.run('js'); }); // 监听images gulp.watch(path.src.image, function () { gulp.run('image'); }); });
四、任务运行
前提,cmd进入项目目录
可以一个任务一个任务的执行,例如: gulp html html对应的是 gulp.task('html', function () {}
这里面我要用批量任务方式,直接运行gulp命令,一波流搞定对应的是
gulp.task('default', ['clean'], function(){
gulp.start('html','css','js','image','copy');
});
结果: 该有的全有了,帅吧。
六、复用gulp环境及配置工具
本人最讨厌的事情就是,重复、没意思的事情不断去做,有那时间还不如撩个妹儿,打个灰机呢,有人可能不屑于复用,那算你牛逼,我是拯救不了你这样的单身狗了......
复用gulp的好处:不用再次本地安装那么多插件了,如果你非要再装一次,那 I 服了 YOU!
我复用的步骤如下:
1.先将这个demo备份,以防自己改错,然后就SB了
2.将src里面的内容替换成自己项目的内容
3.删除build整个文件夹
4.修改gulpfile.js
根据自己情况,修改文件即可