gulp是基于Nodejs的自动任务运行器,它能自动化地完成javascript/sass/less/html/image/css 等文件的的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的这些步骤。( 引用来自Kasmine的博客)。使用Gulp的优点就是利用流的方式进行文件的处理,使用管道(pipe)思想,前一级的输出,直接变成后一级的输入,经过管道将多个任务和操做链接起来,所以只有一次I/O的过程,流程更清晰,更纯粹。Gulp去除了中间文件,只将最后的输出写入磁盘,整个过程所以变得更快(引用来自Kasmine的博客)。javascript
提及gulp咱们都会谈到一个名词,即是前端自动化构建,接下来就前端自动化构建进行解释。css
"说到构建工具,我每每会在前面加「自动化」三个字,由于构建工具就是用来让咱们再也不作机械重复的事情,解放咱们的双手的。"( 引用来自知乎Jasin Yip的回答)。
由于gulp是是基于Nodejs的自动任务运行器,因此必须安装 node.js。因为npm是国外的,使用起来比较慢,咱们这里使用淘宝的cnpm镜像来安装插件及应用,cnpm安装指南。html
$ npm install --global gulp
$ npm install --save-dev gulp
var gulp = require('gulp'); gulp.task('default', function() { // 将你的默认的任务代码放在这 });
$ gulp
默认的名为 default 的任务(task)将会被运行,在这里,这个任务并未作任何事情。
相关插件用法请看对应连接,感谢原做者对插件的解析,若有侵权请联系删除谢谢。按需配置好package.json 在根目录npm install便可。前端
下面附上我本身的项目gulpfile的文件源码
// gulp引入 let gulp = require('gulp'); // 路径 let SRC = './src',// 入口文件夹 DIST = './static',// 出口文件夹 LESS_SRC = SRC + '/**/*.less', // less编译入口 (** 匹配js文件夹的0个或多个子文件夹) JS_SRC = SRC + '/**/*.js', // JS编译入口 (* 匹配js文件夹下全部.js格式的文件) IMG_SRC = SRC + '/**/images/*.{png,jpg,gif,ico}',// 图片编译入口 HTML = './*.html';// html文件 //插件 let less = require('gulp-less'),// less编译 sourcemaps = require('gulp-sourcemaps'),// 浏览器显示编译前less或js位置 uglify = require('gulp-uglify'),// 压缩js文件 pump = require('pump'),// 可使咱们更容易找到代码出错位置 cleanCSS = require('gulp-clean-css'),// css压缩 rename = require("gulp-rename"),// 文件改名 autoprefixer= require('gulp-autoprefixer'),// 根据设置浏览器版本自动处理css属性的浏览器前缀 concat = require('gulp-concat'),// 合并javascript文件,减小网络请求。 imagemin = require('gulp-imagemin'),// 图片压缩 pngquant = require('imagemin-pngquant'), // 深度压缩 changed = require('gulp-changed'),// 只经过更改过的文件 browserSync = require('browser-sync').create(),//浏览器实时刷新 babel = require('gulp-babel');// es6 编译 es5 // 刷新浏览器 let reload = browserSync.reload; // less编译 gulp.task('less', ()=> { let options = { browsers: ['last 5 versions', 'Android >= 4.0'],// 浏览器版本 cascade: true,//是否美化属性值 默认:true 像这样: //-webkit-transform: rotate(45deg); // transform: rotate(45deg); remove:true //是否去掉没必要要的前缀 默认:true }; return gulp.src([LESS_SRC,'!'+SRC+'/common/**/*.less'])// 除了common文件夹下的less所有编译 .pipe(sourcemaps.init())// 启用sourcemaps功能 .pipe(changed(DIST))// 只经过更改过的文件 .pipe(less())// 执行less编译操做 .pipe(autoprefixer(options)) .pipe(cleanCSS({ keepSpecialComments: '*' //保留全部特殊前缀 当你用autoprefixer生成的浏览器前缀,若是不加这个参数,有可能将会删除你的部分前缀 }))// 开启css压缩 .pipe(rename( // { // dirname: "css",// 生成到对应目录下,能够修改上级目录名字,可是全部只能生成到一个文件夹 // basename: "aloha",// 文件名字 // prefix: "bonjour-",// 文件前缀 // suffix: ".min",// 文件后缀 // extname: ".css"// 文件类型 // } function (path) { // path.dirname += "/css";// 生成到对应目录下,能够修改上级目录名字,可是全部只能生成到一个文件夹 // path.basename += "-goodbye";// 文件名字 // path.extname = ".md";// 文件类型 // 前缀后缀不生效 path.dirname = path.dirname.replace('less', 'css');// 修改上级目录,可生成到对应目录 } ))// 更名字 .pipe(sourcemaps.write('./map'))// 生成记录位置信息的sourcemaps文件,为空时即为解析目录下 .pipe(gulp.dest(DIST))// 编译出口,可生成目录或为存在目录 .pipe(reload({stream: true})); }); // js操做 gulp.task('js', (cb)=> { // pump是一个小节点模块,将流链接在一块儿,若是其中一个关闭,则会将它们所有破坏 // 当dest发出关闭或错误时,使用标准source.pipe(dest)事件源将不会被销毁。 // 您还不能提供回调来告诉管道什么时候完成。 pump([ gulp.src([JS_SRC]),// JS编译入口 sourcemaps.init(),// 启用sourcemaps功能 changed(DIST),// 只经过更改过的文件 babel({ presets: ['env']// 编译成es5 }), uglify(),// 开启压缩功能 concat({ path:'js/all.js' }),// 开启js合并功能 rename({suffix: '.min'}),// 更名字中间加‘.min’ sourcemaps.write('./map'),// 生成记录位置信息的sourcemaps文件,为空时即为解析目录下 gulp.dest(DIST),// 编译出口,可生成目录或为存在目录 reload({stream: true}) ],cb// 函数有参数 ) }); // 图片压缩(因为可能过多图片,不建议每次更新操做) // cmd命令:gulp images gulp.task('images', ()=> { gulp.src([IMG_SRC])// JS编译入口 .pipe(changed(DIST))// 只经过更改过的文件 .pipe(imagemin( { optimizationLevel: 5, //类型:Number 默认:3 取值范围:0-7(优化等级) progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片 interlaced: true, //类型:Boolean 默认:false 隔行扫描gif进行渲染 multipass: true, //类型:Boolean 默认:false 屡次优化svg直到彻底优化 svgoPlugins: [{removeViewBox: false}], // 不移除svg的viewbox属性 use: [pngquant()] // 使用pngquant插件进行深度压缩 } )) .pipe(gulp.dest(DIST))// 编译出口,可生成目录或为存在目录 } ) // 静态服务器 + 监听 less/js/html 文件 gulp.task('server', ()=> { browserSync.init({ server: { baseDir: "./" } }); }); // 执行默认操做,顺序执行另外的操做 gulp.task('default',['server'],()=> { // 执行操做 gulp.start(['less','js']); // 监听改变 gulp.watch(LESS_SRC, ['less']); // 监听less的改变并执行对应操做 gulp.watch(JS_SRC, ['js']); // 监听js的改变并执行对应操做 gulp.watch(HTML, reload); })
附上对应的package.json。
{ "devDependencies": { "babel-core": "^6.26.0", "babel-preset-env": "^1.6.1", "browser-sync": "^2.23.6", "gulp": "^3.9.1", "gulp-autoprefixer": "^5.0.0", "gulp-babel": "^7.0.1", "gulp-changed": "^3.2.0", "gulp-clean-css": "^3.9.3", "gulp-concat": "^2.6.1", "gulp-imagemin": "^4.1.0", "gulp-less": "^4.0.0", "gulp-uglify": "^3.0.0", "imagemin-pngquant":"^5.1.0", "pump": "^3.0.0" } }