一切福田,不離方寸,從心而覓,感無不通。

前端构建工具gulp超详细配置, 使用教程(图文)

流程

1. 输入命令(可以使用git bash或者命令控制台cmd) npm install -g gulp

  • 安装全局gulp命令

2. 创建一个项目文件夹, 当前项目文件夹下输入命令npm init

配置package.json文件, 这一部分看情况自己决定是否填, 不想填也可以, 直接按回车

当前项目文件夹下输入命令npm install gulp --save-dev

全局安装gulp后,还需要在每个要使用gulp的项目中都单独安装一次

开始使用gulp

其实, gulp的使用比webpack要简单很多.

配置gulpflie.js文件

在当前项目文件下创建文件名为gulpfile.js文件, 作为该项目配置文件.

 

其实在项目文件夹下输入命令gulp时, 就是触发这个default任务, 因此, 我们定义多个自定义事件, 这样在输入gulp时, 就可以直接将我们写的命令也一起触发.

gulp API

gulp.src(globs[, options])

globs参数是文件匹配模式(类似正则表达式),用来匹配文件路径(包括文件名),当然这里也可以直接指定某个具体的文件路径。当有多个匹配模式时,该参数可以为一个数组。
options为可选参数。通常情况下我们不需要用到。

下面我们重点说说Gulp用到的glob的匹配规则以及一些文件匹配技巧。

名称 说明
* 匹配文件路径中的0个或多个字符,但不会匹配路径分隔符,除非路径分隔符出现在末尾
** 匹配路径中的0个或多个目录及其子目录,需要单独出现,即它左右不能有其他东西了。如果出现在末尾,也能匹配文件。
? 匹配文件路径中的一个字符(不会匹配路径分隔符)
[…] 匹配方括号中出现的字符中的任意一个,当方括号中第一个字符为^或!时,则表示不匹配方括号中出现的其他字符中的任意一个,类似js正则表达式中的用法
!(pattern|pattern|pattern) 匹配任何与括号中给定的任一模式都不匹配的
?(pattern|pattern|pattern) 匹配括号中给定的任一模式0次或1次,类似于js正则中的(pattern|pattern|pattern)?
+(pattern|pattern|pattern) 匹配括号中给定的任一模式至少1次,类似于js正则中的(pattern|pattern|pattern)+
*(pattern|pattern|pattern) 匹配括号中给定的任一模式0次或多次,类似于js正则中的(pattern|pattern|pattern)*
@(pattern|pattern|pattern) 匹配括号中给定的任一模式1次,类似于js正则中的(pattern|pattern|pattern)

例子:

 

 

 

数组的第一个元素中
此外,还可以使用展开模式。展开模式以花括号作为定界符,根据它里面的内容,会展开为多个模式,最后匹配的结果为所有展开的模式相加起来得到的结果。展开的例子如下:

  • a{b,c}d 会展开为 abd,acd
  • a{b,}c 会展开为 abc,ac
  • a{0..3}d 会展开为 a0d,a1d,a2d,a3d
  • a{b,c{d,e}f}g 会展开为 abg,acdfg,acefg
  • a{b,c}d{e,f}g 会展开为 abdeg,acdeg,abdeg,abdfg

gulp.dest(path[,options])

gulp.dest()方法是用来写文件的
path为写入文件的路径
options为一个可选的参数对象,通常我们不需要用到

要想使用好gulp.dest()这个方法,就要理解给它传入的路径参数与最终生成的文件的关系。

gulp的使用流程一般是这样子的:首先通过gulp.src()方法获取到我们想要处理的文件流,然后把文件流通过pipe方法导入到gulp的插件中,最后把经过插件处理后的流再通过pipe方法导入到gulp.dest()中,gulp.dest()方法则把流中的内容写入到文件中,这里首先需要弄清楚的一点是,我们给gulp.dest()传入的路径参数,只能用来指定要生成的文件的目录,而不能指定生成文件的文件名,它生成文件的文件名使用的是导入到它的文件流自身的文件名,所以生成的文件名是由导入到它的文件流决定的,即使我们给它传入一个带有文件名的路径参数,然后它也会把这个文件名当做是目录名,例如:

 

 

 

 

 

 

gulp.dest()把文件流写入文件后,文件流仍然可以继续使用。


gulp.task(name[, deps], fn)

gulp.task方法用来定义任务,内部使用的是Orchestrator

name 为任务名
deps 是当前定义的任务需要依赖的其他任务,为一个数组。当前定义的任务会在所有依赖的任务执行完毕后才开始执行。如果没有依赖,则可省略这个参数
fn 为任务函数,我们把任务要执行的代码都写在里面。该参数也是可选的。

 

 

 

上面的例子中我们执行two任务时,会先执行one任务,但不会去等待one任务中的异步操作完成后再执行two任务,而是紧接着执行two任务。所以two任务会在one任务中的异步操作完成之前就执行了。

那如果我们想等待异步任务中的异步操作完成后再执行后续的任务,该怎么做呢?
有三种方法可以实现:
第一:在异步操作完成后执行一个回调函数来通知gulp这个异步任务已经完成,这个回调函数就是任务函数的第一个参数。

 

 

 

gulp.task()就这些了,主要是要知道当依赖是异步任务时的处理。


gulp.watch(glob[, opts], tasks)

gulp.watch()用来监视文件的变化,当文件发生变化后,我们可以利用它来执行相应的任务,例如文件压缩等。
glob 为要监视的文件匹配模式,规则和用法与gulp.src()方法中的glob相同。
opts 为一个可选的配置对象,通常不需要用到
tasks 为文件变化后要执行的任务,为一个数组

 

 

一些常用的gulp插件

1. 自动加载插件

使用:gulp-load-plugins
安装:npm install --save-dev gulp-load-plugins
要使用gulp的插件,首先得用require来把插件加载进来,如果我们要使用的插件非常多,那我们的gulpfile.js文件开头可能就会是这个样子的:

 

 

 

 

gulp-load-plugins并不会一开始就加载所有package.json里的gulp插件,而是在我们需要用到某个插件的时候,才去加载那个插件。
最后要提醒的一点是,因为gulp-load-plugins是通过你的k文件来加载插件的,所以必须要保证你需要自动加载的插件已经写入到了package.json文件里,并且这些插件都是已经安装好了的。

2. 重命名

使用:gulp-rename
安装:npm install --save-dev gulp-rename
用来重命名文件流中的文件。用gulp.dest()方法写入文件时,文件名使用的是文件流中的文件名,如果要想改变文件名,那可以在之前用gulp-rename插件来改变文件流中的文件名。

 

3. js文件压缩

使用 : gulp-uglify
安装:npm install --save-dev gulp-uglify
用来压缩js文件,使用的是uglify引擎

 

4. css文件压缩

使用 : gulp-clean-css
安装:npm install gulp-clean-css --save-dev
要压缩css文件时可以使用该插件

 

5. html文件压缩

使用 : gulp-htmlmin
安装:npm i gulp-htmlmin --save-dev
用来压缩html文件

 

6. js代码检查

使用 : gulp-jshint
安装:npm install --save-dev gulp-jshint
用来检查js代码

 

7. 文件合并

使用 : gulp-concat
安装:npm install --save-dev gulp-concat
用来把多个文件合并为一个文件,我们可以用它来合并js或css文件等,这样就能减少页面的http请求数了

 

8. less和sass的编译

less使用gulp-less,安装:npm install --save-dev gulp-less

 

 

9. 图片压缩

可以使用gulp-imagemin插件来压缩jpg、png、gif等图片。
安装:npm install --save-dev gulp-imagemin

 

gulp-imagemin的使用比较复杂一点,而且它本身也有很多插件,建议去它的项目主页看看文档

10. 自动刷新

使用gulp-livereload插件,安装:npm install --save-dev gulp-livereload。
当代码变化时,它可以帮我们自动刷新页面
该插件最好配合谷歌浏览器来使用,且要安装livereload chrome extension扩展插件,不能下载的请自行FQ。

 

11. 服务器

使用 : gulp-connect插件,
安装 : npm install --save-dev gulp-connect
Gulp plugin to run a webserver (with LiveReload), 开服务器,并集成了LiveReload(自动刷新), 下载这个插件上面的LiverReload插件就不用再下载了.