Gulp官宣
- 易于使用
- 通过代码优于配置的策略,Gulp 让简单的任务简单,复杂的任务可管理。
- 构建快速
- 利用 Node.js 流的威力,你可以快速构建项目并减少频繁的 IO 操作。
- 插件高质
- Gulp 严格的插件指南确保插件如你期望的那样简洁高质得工作。
- 易于学习
- 通过最少的 API,掌握 Gulp 毫不费力,构建工作尽在掌握:如同一系列流管道。
看了一下gulp的入门指南,确实和webpack相比简单很多,gulp是基于task的,可以把较为复杂的逻辑处理分解成每个简单的task任务完成,它不像webpack,webpack相当于一个地球整体,所有的配置都整合在一起,使用webpack需要很清楚的理解它的运行机制,这样对于初学者来说是有一定困难的,从而gulp就友好很多。
Gulp Starting
- 全局安装gulp
npm install --g gulp复制代码
- 创建项目文件
gulp_start
- 进入文件
gulp_start
,安装项目依赖
npm install --save-dev gulp复制代码
- 在项目根目录下创建一个名为
gulpfile.js
的文件
gulp也需要一个文件作为它的主文件,在gulp中这个文件叫做
gulpfile.js
。新建一个文件名为gulpfile.js的文件,然后放到你的项目目录中。之后要做的事情就是在gulpfile.js
文件中定义我们的任务了。
var gulp = require('gulp');gulp.task('mytest', function() { console.log('hello world');});这里定义一个简单任务`mytest`复制代码
- 执行任务
只需切换到存放gulpfile.js文件的目录,然后在命令行中执行gulp命令就行了,gulp后面可以加上要执行的任务名,例如gulp task1,如果没有指定任务名,则会执行任务名为default的默认任务。
gulp mytest复制代码这里输出了"hello world"。
我们先来总结一下gulp是干什么的:gulp是基于Nodejs的自动任务运行器, 它能自动化地完成 javascript、coffee、sass、less、html/image、css 等文件的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的这些步骤。复制代码
Gulp API
1. gulp的工作方式
在gulp中,使用的是Nodejs中的
stream
(流),首先获取到需要的stream
,然后可以通过stream
的pipe()
方法把流导入到你想要的地方。所以gulp是以stream
为媒介的,它不需要频繁的生成临时文件,这也是我们应用gulp的一个原因。
gulp一般流程:
gulp.src()
方法获取到想要处理的文件流- 把文件流通过
pipe
方法导入到gulp的插件中 - 把经过插件处理后的流再通过
pipe
方法导入到gulp.dest()
中 gulp.dest()
方法则把流中的内容写入到文件中
var gulp = require('gulp');gulp.src('script/jquery.js') // 获取流的api .pipe(gulp.dest('dist/foo.js')); // 写放文件的api复制代码
2. globs匹配规则
gulp内部使用了
node-glob
模块来实现其文件匹配功能。
* 能匹配 a.js,x.y,abc,abc/,但不能匹配a/b.js*.* 能匹配 a.js,style.css,a.b,x.y*/*/*.js 能匹配 a/b/c.js,x/y/z.js,不能匹配a/b.js,a/b/c/d.js** 能匹配 abc,a/b.js,a/b/c.js,x/y/z,x/y/z/a.b,能用来匹配所有的目录和文件**/*.js 能匹配 foo.js,a/foo.js,a/b/foo.js,a/b/c/foo.jsa/**/z 能匹配 a/z,a/b/z,a/b/c/z,a/d/g/h/j/k/za/**b/z 能匹配 a/b/z,a/sb/z,但不能匹配a/x/sb/z,因为只有单**单独出现才能匹配多级目录?.js 能匹配 a.js,b.js,c.jsa?? 能匹配 a.b,abc,但不能匹配ab/,因为它不会匹配路径分隔符[xyz].js 只能匹配 x.js,y.js,z.js,不会匹配xy.js,xyz.js等,整个中括号只代表一个字符[^xyz].js 能匹配 a.js,b.js,c.js等,不能匹配x.js,y.js,z.js复制代码
3. src获取流
gulp.src()
方法正是用来获取流的,但要注意这个流里的内容不是原始的文件流
,而是一个虚拟文件对象流
,这个虚拟文件对象中存储着原始文件的路径、文件名、内容等信息。
语法:
gulp.src(globs[, options]);复制代码
globs:文件匹配模式,可以是数组或String形式
options:可选参数,
options.buffer
:(true)若为false,那么将会以 stream 方式返回 file.contents 而不是文件 buffer 的形式。options.base
:设置输出路径以某个路径的某个组成部分为基础向后拼接。这里简单的理解就是,设置的options.base是输出路径要改的相应的基础目录,后续的路径和输入的一致。options.read
:(true)若为false,那么file.contents 会返回空值(null),也就是并不会去读取文件。
4. dest写
语法:
gulp.dest(path[,options])复制代码
path:为写入文件的路径 options:可选参数,
- options.cwd
- options.mode
注
:gulp.dest(path)
生成的文件路径是我们传入的path参数后面再加上gulp.src()
中有通配符开始出现的那部分路径。
5. watch文件监听
gulp.watch()
用来监视文件的变化,当文件发生变化后,我们可以利用它来执行相应的任务,例如文件压缩等。
语法:
gulp.watch(glob[, opts], tasks); 复制代码
- glob:要监视的文件匹配模式
- opts 为一个可选的配置对象,通常不需要用到。
- tasks 为文件变化后要执行的任务,为一个数组。
另一种使用方式:
gulp.watch(glob[, opts, cb]);复制代码
cb
:每当监视的文件发生变化时,就会调用这个函数,并且会给它传入一个对象,该对象包含了文件变化的一些信息,type属性为变化的类型,可以是added,changed,deleted;path属性为发生变化的文件的路径。
gulp.watch('js/**/*.js', function(event){ console.log(event.type); //变化类型 added为新增,deleted为删除,changed为改变 console.log(event.path); //变化的文件的路径}); 复制代码
6. task任务
语法:
gulp.task(name[, deps], fn)复制代码
- name:任务名
- fn:任务函数
如何控制多个任务执行:
可以通过任务依赖来实现。例如我想要执行one,two,three这三个任务,那我们就可以定义一个空的任务,然后把那三个任务当做这个空的任务的依赖就行了:
gulp.task('default',['one','two','three']);复制代码
注
:如果任务相互之间没有依赖,则会按照你书写的顺序依次执行,若有依赖,则会先执行依赖的任务。那么问题来了,某个任务所依赖的任务是异步的
:
gulp并不会等待那个所依赖的异步任务完成,而是会接着执行后续的任务。
举个栗子:
运行结果:- 那如果我们想等待异步任务中的异步操作完成后再执行后续的任务,该怎么做呢? 三种实现方法:
- 在异步操作完成后执行一个
回调函数
来通知gulp这个异步任务已经完成,这个回调函数就是任务函数的第一个参数。 结果: - 定义任务时返回一个流对象。适用于任务就是操作gulp.src获取到的流的情况。
- 返回一个promise对象。
var Q = require('q');gulp.task('one', function() { var deferred = Q.defer(); // 执行异步的操作 setTimeout(function() { deferred.resolve(); }, 1); return deferred.promise;}); gulp.task('two',['one'],function(){ console.log('two is done');});复制代码
注
:这里的Q需要install q
模块,它是一个第三方模块,使用它可以让你的异步代码逻辑看起来更清晰。具体使用自己教程,本篇重点在Gulp。
My Task
通过gulp把我们自己所编写的JS文件合并压缩、CSS文件进行压缩后,并且生成新的文件。
需要下载的插件: CSS压缩gulp-minify-css
,文件合并gulp-concat
,js压缩插件gulp-uglify
,重命名gulp-rename
这里要注意: js如果是es6语法,则要下载gulp-uglify-es
进行js压缩
var gulp = require('gulp'), minifycss = require('gulp-minify-css'), //CSS压缩 concat = require('gulp-concat'), // 文件合并 uglify = require('gulp-uglify-es').default, //js压缩插件 rename = require('gulp-rename'); // 重命名//css压缩gulp.task('minifycss', function() { return gulp.src('src/css/*.css') //压缩的文件 .pipe(minifycss()) //执行压缩 .pipe(gulp.dest('dist/css')); //输出文件夹});//js合并压缩gulp.task('minifyjs', function() { return gulp.src('src/js/*.js') .pipe(concat('all.js')) //合并所有js到main.js .pipe(gulp.dest('dist/js')) //输出main.js到文件夹 .pipe(rename({ suffix: '.min'})) //rename压缩后的文件名 .pipe(uglify()) //压缩 .pipe(gulp.dest('dist/js')); //输出});gulp.task('build', ['minifycss', 'minifyjs']);// 监视文件的变化,当文件有更新时执行build任务gulp.task('watch', function () { gulp.watch(['src/js/*.js', 'src/css/*.css'], ['build']);});gulp.task('default', ['build', 'watch']);复制代码
最后生成的目录结构:(忽略其他文件)
Gulp入门就到这结束了,希望大家可以通过这篇对gulp有了初步的了解,如果有描述不当或者错误的地方请多指教
注
:本人也是小白,本篇主要参照链接: