
前端自动化工具现在是五花八门,例举:grunt、gulp、webpack、yeoman、Bower还有百度的fis。东西多但是大致的功能就是帮我们减少一些重复性的工作。这里重点就结合下gulp,如果对grunt感兴趣可以参考《grunt入门教程》,网上都说gulp比grunt优秀其实它们的用法感觉也差不多。
将以下内容保存为gulpfile.js
var gulp = require('gulp');
var cssmin = require('gulp-minify-css'); //压缩,删除注释、换行,合并选择器
var cssver = require('gulp-make-css-url-version'); //为css的url背景图片添加mdb5,防止缓存
var concat = require('gulp-concat');//合并css、js
var uglify = require('gulp-uglify'); //js压缩
var notify = require('gulp-notify'); //任务执行成功提示
var htmlmin = require('gulp-htmlmin');//对html页面压缩处理
var postcss = require('gulp-postcss'); //自动添加css前缀
var autoprefixer = require('autoprefixer-core');//自动添加css前缀
var rev = require('gulp-rev-append'); //为html的js、css添加版本号
var cheerio = require('gulp-cheerio'); //操作html的dom,目的合并多个js或者css链接
var useref = require('gulp-useref'); //将html中多个link和script各自合并成一个
var del = require('del'); //删除文件
var gulpif = require('gulp-if');
var imageMin = require('gulp-imagemin'); //图片压缩
var babel = require("gulp-babel");
var fileinclude = require('gulp-file-include');
var runSequence = require('run-sequence'); //同步执行
gulp.task('fileinclude', function() {
// 适配page中所有文件夹下的所有html,排除page下的include文件夹中html
gulp.src(['view/**/*.html'])
.pipe(fileinclude({
prefix: '@@',
basepath: '@file'
}))
.pipe(gulp.dest('src'))
.on('end', function () {
gulp.src('src/*.html')
.pipe(useref())
.pipe(gulpif('*.js', babel({presets: ['es2015']})))
.pipe(gulpif('*.js', uglify()))
.pipe(gulpif('*.css', cssmin({
advanced: false,//类型:Boolean 默认:true [是否开启高级优化(合并选择器等)]
compatibility: 'ie7',//保留ie7及以下兼容写法 类型:String 默认:''or'*' [启用兼容模式; 'ie7':IE7兼容模式,'ie8':IE8兼容模式,'*':IE9+兼容模式]
keepBreaks: false,//类型:Boolean 默认:false [是否保留换行]
keepSpecialComments: '*'//保留所有特殊前缀 当你用autoprefixer生成的浏览器前缀,如果不加这个参数,有可能将会删除你的部分前缀
})))
.pipe(gulpif('*.css',postcss([ autoprefixer({ browsers: ["> 0%"] }) ])))
.pipe(gulpif('*.css',cssver()))
.pipe(gulpif('*.html',htmlmin({
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
})))
.pipe(gulpif('*.html',rev()))
//.pipe(gulpif('*.html',cheerio(function ($, file) {
// $('link').eq(0).remove();
// $('head').append('<link rel="stylesheet" href="css/css.min.css?rev='+Math.random()+'">');
// $('script').eq(0).remove();
// $('head').append('<script src="js/all.min.js?rev='+Math.random()+'"></script>');
//})))
.pipe(gulp.dest('dist'))
});
});
//把独立的js复制到dist/js的根目录下
gulp.task('copy', function() {
gulp.src('src/js/*.js')
.pipe(gulp.dest('dist/js'))
});
//图片压缩
gulp.task('img', function () {
gulp.src('src/images/*.*')
.pipe(imageMin({progressive: true}))
.pipe(gulp.dest('dist/images'));
console.log('33333333333');
});
//为此任务命名为watch
// gulp.task('watch',function(){
// gulp.watch('src/**/*.css',['sync']); //在css目录下的所有文件夹的后缀是css的文件,一旦修改就自动执行testCssmin任务
// gulp.watch('src/**/*.js',['sync']);
// });
//修改view目录下的html就自动在src根目录下生成html
gulp.task('watch_html',function(){
gulp.watch('view/**/*.html',['fileinclude']); //在css目录下的所有文件夹的后缀是css的文件,一旦修改就自动执行testCssmin任务
});
//gulp的默认执行的任务就是watch任务
//gulp.task('default',['testCssmin','js','html','watch'], function() {
// // 将你的默认的任务代码放在这
//});
gulp.task('default',['fileinclude','img','copy'], function() {
// 将你的默认的任务代码放在这
});
在命令环境中直接输入:gulp,就能到达以下效果:
按先后顺序依次执行fileinclude、 img 、copy
———————————————以下是本人的前端自动化构建包—————————————————————-

链接: https://pan.baidu.com/s/1Qcd69Vb9i9At2lZIXN3D7g 提取码: m9i7
https://sdeno.com/wp-content/uploads/2017/09/gulp.rar
使用步骤:
1,解压目录后执行: npm install
2,编辑html文件在view目录,推荐开启监听view目录里面的html变化后自动生成更新html到src根目录下
———————————————API学习—————————————————————-
通配符路径匹配示例:
“src/a.js”:指定具体文件;
“*”:匹配所有文件 例:src/*.js(包含src下的所有js文件);
“**”:匹配0个或多个子文件夹 例:src/**/*.js(包含src的0个或多个子文件夹下的js文件);
“{}”:匹配多个属性 例:src/{a,b}.js(包含a.js和b.js文件) src/*.{jpg,png,gif}(src下的所有jpg/png/gif文件);
“!”:排除文件 例:!src/a.js(不包含src下的a.js文件);
案例:
var gulp = require('gulp'),
less = require('gulp-less');
gulp.task('testLess', function () {
//gulp.src('less/test/style.less')
gulp.src(['less/**/*.less','!less/{extend,page}/*.less'])
.pipe(less())
.pipe(gulp.dest('./css'));
});
gulp.task(name[, deps], fn)
说明:task定义一个gulp任务;
name: 类型(必填):String 指定任务的名称(不应该有空格);
deps: 类型(可选):StringArray,该任务依赖的任务(注意:被依赖的任务需要返回当前任务的事件流,请参看下面示例);
fn: 类型(必填):Function 该任务调用的插件操作;
gulp.task('testLess', function () {
return gulp.src(['less/style.less']) //这里要注意,添加了return
.pipe(less())
.pipe(gulp.dest('./css'));
});
gulp.task('minicss', ['testLess'], function () { //执行完testLess任务后再执行minicss任务
gulp.src(['css/*.css'])
.pipe(minifyCss())
.pipe(gulp.dest('./dist/css'));
});
gulp.watch(glob [, opts], tasks) or gulp.watch(glob [, opts, cb])
说明:watch方法是用于监听文件变化,文件一修改就会执行指定的任务;
glob: 需要处理的源文件匹配符路径。类型(必填):String or StringArray;
opts: 类型(可选):Object 具体参看https://github.com/shama/gaze;
tasks: 类型(必填):StringArray 需要执行的任务的名称数组;
cb(event): 类型(可选):Function 每个文件变化执行的回调函数;
gulp.task('watch1', function () {
gulp.watch('less/**/*.less', ['testLess']);
});
gulp.task('watch2', function () {
gulp.watch('js/**/*.js', function (event) {
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...');
});
});
http://www.ydcss.com/archives/424