gulp入门教程
gulp
是前端的自动化构建工具,gulp
的出现是希望能取代grunt
,成为最流行的前端自动化构建工具,它与grunt
比起来有如下优势:
- 遵循代码优于配置策略:无需写一堆配置参数,维护起来更像写代码
-
易上手:它的核心API只有4个(有些地方可能会说是5个API,因为目前已经摒弃了
run
方法,所以我们只要知道这4个API就行) -
速度快:各任务之间通过
nodejs
的stream
进行数据互通,速度更快
gulp的安装
在安装之前,请确保已经安装nodejs
环境,如何安装nodejs
可以查看这里搭建nodejs环境
全局安装
npm install -g gulp
通过gulp -v
检查是否安装成功,安装成功后会在全局目录中找到gulp
文件夹,我这里是/usr/lib/node_modules
本地安装
1. 生成package.json
文件
npm init
2. 本地安装gulp
npm install --save-dev gulp
安装成功后,能在本地node_modules
文件夹中看到gulp
;其中--save-dev
表示会将安装gulp
的信息写入package.json
文件的devDependencies
字段中
搭建gulp项目
gulp API介绍
gulp
的核心API只有4个:task
、watch
、src
、dest
;有些地方可能会说是5个API,因为目前已经摒弃了run
方法,所以我们只要知道这4个API就行。
1. gulp.src(globs[, options])
gulp
使用gulp.src
函数读取文件,然后将文件内容转换成stream
流后通过pipe
传输给其他的任务,最终通过gulp.dest
将处理结果写入文件中,整个流程如下:
代码例子:
// 读取src/scss/目录下scss文件
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('build/css'));
- globs:文件匹配模式,用来匹配文件;该函数还可以为数组,这样能有多种匹配模式来匹配文件。
- options:可选参数,一般不用,可以忽略。
这里列出globs
参数的匹配规则:
-
*
:匹配0到多个字符;如:
*.js
:匹配js文件
*.css
:匹配css文件
。 -
**
:匹配0到多个目录或文件;如:
src/**/*.js
:匹配src/
目录下所有的js文件
。 -
?
:匹配一个字符;如 :
?.js
:匹配a.js
和b.js
,不能匹配ab.js
。 -
!
:不匹配;如:
!*.js
:不匹配js文件
。 -
[字符]
:匹配方括号内出现字符的任意一个;如:
[abc].js
:匹配a.js
、b.js
、c.js
;
[^abc].js
:不匹配a.js
、b.js
、c.js
。 -
(模式1|模式2)
:匹配括号内任意一个模式,可与*
、+
、?
和!
作为前缀组合使用;如:
*.+(js|css)
:匹配js文件
或css文件
2. gulp.dest(path[, options])
将stream
流写入文件
- path:写入文件的目录
- options:可选参数,一般不用,可以忽略
// 编译scss文件后,保存到build/css/目录中
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('build/css'));
3. gulp.task(name[, deps], fn)
gulp
使用gulp.task
函数创建任务
- name:任务名称
- deps:任务列表,这些任务会在当前任务运行之前被执行;当这个任务依赖于其他任务时,可以把任务写入列表中,否则可以不写。
- fn:任务函数,我们可以把要执行的代码都写在这个函数中,该参数也是可选的。
代码例子:
gulp.task('one', function(){
console.log('task one');
});
gulp.task('two', ['one'], function(){
console.log('task two');
});
gulp.task
创建了one
和two
任务,该two
任务依赖one
任务,使用gulp
命令执行two
任务
gulp two
4. gulp.watch(glob[, opts], tasks)
gulp.watch
用来监视文件内容是否变化
-
glob:文件匹配模式,规则与
gulp.src
中的glob
参数一样 - opts:可选参数,一般不用,可以忽略。
-
task:任务列表,当
glob
匹配的文件有变化时,就会执行该列表中的任务。
代码例子:
gulp.watch('src/**/*.+(scss|js)', ['sass', 'js']);
监控src/
目录下所有的scss文件
和js文件
,如果有文件内容发送变化,则顺序执行sass
、js
任务。
搭建项目例子
我们把项目的文件放在本地src/
文件夹中,项目结构为:
├── gulpfile.js
├── node_modules
├── ...
├── package.json
└── src
├── js
│ ├── a.js
│ └── b.js
└── scss
├── c.scss
└── d.scss
gulpfile.js
内容:
var gulp = require('gulp'),
sass = require('gulp-sass'),
jshint = require('gulp-jshint'),
cssmin = require('gulp-clean-css'),
uglify = require('gulp-uglify'),
rename = require('gulp-rename');
// 检查、编译scss文件后,保存到build/css中
gulp.task('sass', function(){
gulp.src('src/scss/*.scss')
.pipe(sass())
.pipe(gulp.dest('build/css'));
});
// 检查js语法后,保存到build/js中
gulp.task('js', function(){
gulp.src('src/js/*.js')
.pipe(jshint())
.pipe(gulp.dest('build/js'));
});
// 监听文件变化
gulp.task("watch", function(){
// 监听src目录下的scss、js文件
gulp.watch('src/**/*.+(scss|js)', ['sass', 'js']);
});
// 压缩css、js文件
gulp.task('dist', ['sass', 'js'], function(){
// 压缩css文件
gulp.src('build/css/*.css')
.pipe(cssmin())
.pipe(rename({
suffix: ".min", // 文件名后缀加上".min"
})).pipe(gulp.dest('dist/css'));
// 压缩js文件
gulp.src('build/js/*.js')
.pipe(uglify())
.pipe(rename({
suffix: ".min", // 文件名后缀加上".min"
})).pipe(gulp.dest('dist/js'));
});
gulp.task('default', ["sass", "js", "watch"]);
首先我们要安装项目需要的gulp插件
npm install node-sass gulp-sass gulp-jshint gulp-clean-css gulp-uglify gulp-rename --save-dev
安装好之后,执行gulp
命令
gulp
会在build/
文件夹下产生:build/js/a.js
、build/js/b.js
和build/css/c.css
、build/css/d.css
;
gulp dist
会在dist/
文件夹下生成dist/js/a.min.js
、dist/js/b.min.js
、dist/css/c.min.css
、dist/css/d.min.css
。