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
我们先来总结一下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.js
a/**/z 能匹配 a/z,a/b/z,a/b/c/z,a/d/g/h/j/k/z
a/**b/z 能匹配 a/b/z,a/sb/z,但不能匹配a/x/sb/z,因为只有单**单独出现才能匹配多级目录
?.js 能匹配 a.js,b.js,c.js
a?? 能匹配 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有了初步的了解,如果有描述不当或者错误的地方请多指教
注:本人也是小白,本篇主要参照链接:
www.cnblogs.com/fengyuqing/…