概述
Gulp 是基于 Node 平台开发的前端构建工具,主要用来设置程序自动处理静态资源的工作。
通过 Gulp 能自动化地完成 html、css、javascript、less、sass、image 等文件的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,监听文件在改动后重复指定的这些步骤等。
简单来说:Gulp 就是用来打包项目的;它将重复的机械化操作编写成任务, 想要执行机械化操作时在命令行执行一个命令相关任务就能自动执行了,从而提高开发效率。
Gulp 的安装
全局安装:
npm install gulp -g
局部安装:
npm install gulp --save-dev
Gulp 中的方法
gulp.src() 用于获取任务要处理的文件
语法:
gulp.src(globs[,options])
参数:
-
globs
文件的匹配模式(类似于正则表达式),参数为字符串或数组-
用来匹配包括文件名的文件路径;匹配单个文件时可以直接使用指定的文件路径进行匹配;
-
如果有多个匹配模式时,该参数可以为一个包含匹配模式的数组
-
-
options
该参数是一个对象,是个可选参数,一般用不到
gulp.dest() 用于输出文件,将内存中的数据写入到本地的文件中
语法:
gulp.dest(path[,options])
参数:
path
目标文件的路径(存储数据的文件路径),参数为字符串或函数- 为字符串时,直接是文件的路径
- 如果是函数,则函数的返回值应为目标文件的路径
options
该参数事一个对象,一般用不到,需要时查手册即可
gulp.task() 建立 Gulp 任务
语法:
gulp.task(name[, deps], fn)
参数:
name
任务的名称deps
一个包含任务列表的数组,这些任务会在当前任务运行之前完成;当任务比较多时一个一个来执行效率会很低,通过该参数就能执行数组中的所有任务(前提是当前数组中的任务都已注册)fn
回调函数,表示当前任务需要做的一些操作
用来注册 “执行多个任务” 的任务一般命名为 defalue
表示默认任务,使用 gulp 命令来执行这个任务时可以直接省略任务名,也就是说:gulp default
命令可直接简写为 gulp
,它会默认去查找名称为 default 的任务进行执行。
gulp.watch() 监控文件的变化
语法:
gulp.watch(glob[, opts], tasks)
参数:
glob
一个 glob 字符串或者一个包含多个 glob 字符串的数组,通过该参数来指定具体监控哪些文件的变化opts
该参数是一个可配置对象,一般用不到tasks
需要在文件变化后执行的一个或者多个任务;该参数为一个数组
使用 Gulp
-
在项目的根目录下创建
gulpfile.js
文件 -
重构项目的文件夹结构:创建
src
目录存放源代码文件,创建dist
目录存放构建后的文件
-
在
gulpfile.js
文件中编写相关任务// 首先引入 gulp 模块 const gulp = require('gulp') // 通过 task 方法创建任务;在回调函数中执行相关操作 gulp.task('save', cb => { // 获取需要处理的文件 gulp .src('./src/css/base.css') // 将处理后的文件输出到 dist 目录中 .pipe(gulp.dest('./dist/css')) // 这里只是复制了文件 cb() // 如果任务(task)不返回任何内容,需要使用 callback 来指示任务已完成;否则会报错 })
-
在命令行工具中执行gulp任务
执行 gulp 任务需要全局安装 gulp 的命令行接口
gulp-cli
;安装成功后就可以执行 gulp 任务了安装命令:
npm install gulp-cli -g
安装完成后在命令行中执行 gulp 任务:
gulp save
Gulp 插件的使用
想要使用相关插件,首先要进行安装,安装语法:
npm install 插件名称 --save-dev
gulp-htmlmin:html 文件压缩插件。
安装命令:
npm install gulp-htmlmin --save-dev
压缩示例:
// 首先引入 gulp 模块
const gulp = require('gulp')
// 引入压缩 html 的插件
const htmlmin = require('gulp-htmlmin')
// 创建任务
gulp.task('htmlmin', () => {
return (
gulp
// 压缩 src 下所有的 html 文件的代码
.src('./src/*.html')
// 压缩规则
.pipe(htmlmin({ collapseWhitespace: true }))
/* 将压缩的文件存储到指定目录中 */
.pipe(gulp.dest('dist'))
)
})
在项目的根目录下通过 cmd 命令窗口执行 gulp htmlmin
任务即可压缩指定文件的代码。
gulp-babel :JavaScript 语法转化,用于转化 ES6 语法。
使用转化 ES6 插件需要安装相关的依赖,完整的安装命令为:
npm install --save-dev gulp-babel @babel/core @babel/preset-env
gulp-uglify :压缩 JavaScript 代码。
转化示例:
main.js
const a = 666
let b = 999
const fn = (x, y) => {
console.log(x + y)
}
gulpfile.js
// 首先引入 gulp 模块
const gulp = require('gulp')
// 引入转换 ES6 语法的插件
const babel = require('gulp-babel')
// 注册任务
gulp.task('babel', () => {
gulp
.src('./src/js/main.js')
// 转换 ES6 语法
.pipe(
babel({
// 根据配置的目标环境自动采用需要的babel插件
presets: ['@babel/env']
})
)
.pipe(gulp.dest('dist/js'))
})
执行结果:
继续压缩:
gulpfile.js
// 引入转换 ES6 语法的插件
const babel = require('gulp-babel')
// 引入压缩 js 代码插件
const uglify = require('gulp-uglify')
gulp.task('jsmin', () => {
gulp
.src('./src/js/base.js')
// 转换 ES6 语法
.pipe(
babel({
presets: ['@babel/env']
})
)
// 压缩 js 代码
.pipe(uglify())
.pipe(gulp.dest('dist/js'))
})
执行结果:
gulp-concat:用于合并 js 文件;使用时需要传入一个文件名作为合并后的文件的名称。
gulp-rename:重命名文件;一般用于对压缩后的文件进行重命名。
使用时需要传入一个参数,该参数可以是一个对象,在对象中设置用于重命名的属性;也可以是一个函数
常用的属性:
suffix
加后缀名(并不是文件的后缀名,只是在原文件名上追加名称)prefix
加前缀名
示例:
base.js
const a = 666
let b = 999
const fn = (x, y) => {
console.log(x + y)
}
base2.js
var x = 123,
y = 456
console.log(x * y)
gulpfile.js
// 首先引入 gulp 模块
const gulp = require('gulp')
// 引入转换 ES6 语法的插件
const babel = require('gulp-babel')
// 引入转换 ES6 语法的插件
const babel = require('gulp-babel')
// 引入压缩 js 代码插件
const uglify = require('gulp-uglify')
// 引入合并 js 代码的插件
const concat = require('gulp-concat')
// 引入重命名插件
const rename = require('gulp-rename')
// 创建任务
gulp.task('default', () => {
return (
gulp
// 获取指定目录下的所有 js 文件
.src('./src/js/*.js')
// 转 es5
.pipe(
babel({
presets: ['@babel/env']
})
)
/* 合并 js 文件 */
.pipe(concat('build.js')) /* 合并后的文件名为 build.js */
/* 将合并后生成的文件输出到指定目录下 */
.pipe(gulp.dest('./dist/js'))
/* 压缩 js 代码 */
.pipe(uglify())
/* 重命名压缩后的文件(向后追加文件名) */
.pipe(rename({ suffix: '.min' }))
/* 输出文件 */
.pipe(gulp.dest('dist/js'))
)
})
执执行结果:
gulp-less: less 语法转化插件;通过该插件可以将 less 语法转成 css 语法。
gulp-csso:css 文件压缩插件;用于压缩 css 代码。也可以使用 gulp-clean-css 插件,该插件也是用来压缩 css 代码的。
示例:
a.less
.headers {
width: 200px;
.logo {
height: 200px;
background: yellow;
}
}
gulpfile.js
// 首先引入 gulp 模块
const gulp = require('gulp')
// 引入 less 插件
const less = require('gulp-less')
// 引入重命名插件
const rename = require('gulp-rename')
// 引入压缩 css 代码的插件
const csso = require('gulp-csso')
// 注册任务
gulp.task('cssmin', () => {
return (
gulp
.src('./src/css/a.less')
// 处理 less 语法,将 less 编译为 css
.pipe(less())
// 存储转成 css 语法后的文件
.pipe(gulp.dest('./dist/css'))
// 压缩 css 代码
.pipe(csso())
// 向后添加文件名
.pipe(rename({ suffix: '.min' }))
// 存储压缩后的文件
.pipe(gulp.dest('dist/css'))
)
})
执行结果:
gulp-file-include:公共文件包含;用于抽离公共代码。
在需要公共代码的文件的位置中书写 @@include(path)
(path 为文件路径,包含文件名)代码,在执行注册的 fileinclude 任务时会将当前位置的代码替换为指定路径的文件中的内容。
示例:
header.html
<!-- 头部区域 -->
<div class="header">
头部区域
</div>
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<!-- 引入公共的头部文件;执行相关任务时当前位置会替换为指定文件中的内容 -->
@@include('./common/header.html')
<!-- 内容区域 -->
<div class="content">
内容区域
</div>
<!-- 底部区域 -->
<div class="footer">
底部区域
</div>
</body>
</html>
gulpfile.js:
// 首先引入 gulp 模块
const gulp = require('gulp')
// 引入抽取公共代码插件
const fileinclude = require('gulp-file-include')
gulp.task('fileinclude', () => {
return (
gulp
.src('./test.html')
// 调用 fileinclude
.pipe(fileinclude())
// 将处理后的代码保存在 dist 目录下
.pipe(gulp.dest('dist'))
)
})
执行相结果:
gulp-livereload:页面热更新,当指定文件的内容发生改变时就会更新文件。
示例:
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<link rel="stylesheet" href="./css/a.min.css" />
</head>
<body>
<div class="box">
<div class="section"></div>
</div>
</body>
</html>
a.less
@bgc: green;
.box {
width: 200px;
height: 200px;
background-color: red;
.section {
width: 150px;
height: 150px;
background: @bgc;
}
}
gulpfile.js
// 首先引入 gulp 模块
const gulp = require('gulp')
// 引入压缩 html 的插件
const htmlmin = require('gulp-htmlmin')
// 引入 less 编译插件
const less = require('gulp-less')
// 引入压缩 css 代码的插件
const csso = require('gulp-csso')
// 引入重命名插件
const rename = require('gulp-rename')
// 引入热加载模块
const livereload = require('gulp-livereload')
/* 创建任务,压缩 html 代码 */
gulp.task('htmlmin', () => {
return (
gulp
// 压缩 html 中的代码
.src('./src/*.html')
.pipe(htmlmin({ collapseWhitespace: true }))
// 将压缩的文件存储到指定目录中
.pipe(gulp.dest('dist'))
/* 在当前任务的最后铺个管道,用于实时刷新 */
.pipe(livereload())
)
})
/* 注册任务,压缩 css代码 */
gulp.task('cssmin', () => {
return (
gulp
.src('./src/css/a.less')
// 处理 less 语法
.pipe(less())
// 存储转成 css 语法后的文件
.pipe(gulp.dest('./dist/css'))
// 压缩 css 代码
.pipe(csso())
// 向后添加文件名
.pipe(rename({ suffix: '.min' }))
// 存储压缩后的文件
.pipe(gulp.dest('dist/css'))
// 在当前任务的最后铺个管道,用于实时刷新
.pipe(livereload())
)
})
// 注册默认任务
gulp.task('default', ['htmlmin', 'cssmin'])
// 注册实时更新任务
gulp.task('watch', ['default'], function() {
// 开启监听
livereload.listen()
// 监听文件的变化,当文件变化时执行相应的任务
gulp.watch(['./src/*.html'], ['htmlmin'])
gulp.watch(['./src/css/*.less'], ['cssmin'])
})
执行更新任务:
gulp-connect:页面自动刷新;该插件内部有一个小型服务器,通过相关的服务器配置来完成刷新;当指定的文件内容发生改变时会自动刷新页面。
open:自动打开指定的 URL,是一个独立的插件不需要 gulp-
前缀。
示例,将上一个 gulpfile.js 文件的代码替换为如下代码:
// 首先引入 gulp 模块
const gulp = require('gulp')
// 引入压缩 html 的插件
const htmlmin = require('gulp-htmlmin')
// 引入 less 编译插件
const less = require('gulp-less')
// 引入压缩 css 代码的插件
const csso = require('gulp-csso')
// 引入重命名插件
const rename = require('gulp-rename')
// 引入热加载模块
const livereload = require('gulp-livereload')
// 实时更新页面模块
const connect = require('gulp-connect')
// 引入 open 插件
const open = require('open')
/* 创建任务,压缩 html 代码 */
gulp.task('htmlmin', () => {
return (
gulp
// 压缩 html 中的代码
.src('./src/*.html')
.pipe(htmlmin({ collapseWhitespace: true }))
// 将压缩的文件存储到指定目录中
.pipe(gulp.dest('dist'))
/* 在当前任务的最后铺个管道,用于实时刷新 */
.pipe(livereload())
.pipe(connect.reload())
)
})
// 注册任务,压缩 css代码
gulp.task('cssmin', () => {
return (
gulp
.src('./src/css/a.less')
// 处理 less 语法
.pipe(less())
// 存储转成 css 语法后的文件
.pipe(gulp.dest('./dist/css'))
// 压缩 css 代码
.pipe(csso())
// 向后添加文件名
.pipe(rename({ suffix: '.min' }))
// 存储压缩后的文件
.pipe(gulp.dest('dist/css'))
// 在当前任务的最后铺个管道,用于实时刷新
.pipe(livereload())
.pipe(connect.reload())
)
})
// 注册默认任务
gulp.task('default', ['htmlmin', 'cssmin'])
// 注册实时更新任务
gulp.task('watch', ['default'], function() {
// 开启监听
livereload.listen()
// 监听文件的变化,当文件变化时执行相应的任务
gulp.watch(['./src/*.html'], ['htmlmin'])
gulp.watch(['./src/css/*.less'], ['cssmin'])
})
/* 注册页面刷新任务 */
gulp.task('server', ['default'], function() {
// 配置服务器选项
connect.server({
// 指定根目录
root: 'dist/',
// 实时刷新
livereload: true,
// 配置端口号
port: 5000
})
// 打开指定的 URL
open('http://localhost:5000/')
// 监听文件的变化,当文件变化时执行相应的任务
gulp.watch(['./src/*.html'], ['htmlmin'])
gulp.watch(['./src/css/*.less'], ['cssmin'])
})
当运行 gulp server
命令时就会自动打开浏览器显示页面,指定文件内容改变时页面会自动刷新。
gulp-load-plugins:用于模块化管理插件的插件;使用 gulp-load-plugins 模块,可以加载 package.json 文件中所有的 gulp 模块。
通过上面的例子可明显感受到除了要引入必要的 gulp 模块,其他模块也要一个一个的导入,这种写法非常的麻烦;通过 gulp-load-plugins 插件就可以解决这个问题。
gulp-load-plugins:插件的简单用法:
在项目中安装成功插件后,在 gulpfile.js 文件中导入该模块并调用,一般用 $
变量来接收返回值;在使用 gulp-
前缀的模块时就不需要导入了,直接在对应的模块前拼上 $.
前缀即可,具体用法见“示例”。
示例:
// 首先引入 gulp 模块
const gulp = require('gulp')
// 引入模块管理插件,引入的是个函数所以要调用
const $ = require('gulp-load-plugins')()
// 引入 open 插件
const open = require('open')
/* 创建任务,压缩 html 代码 */
gulp.task('htmlmin', () => {
return (
gulp
// 压缩 html 中的代码
.src('./src/*.html')
.pipe($.htmlmin({ collapseWhitespace: true }))
// 将压缩的文件存储到指定目录中
.pipe(gulp.dest('dist'))
/* 在当前任务的最后铺个管道,用于实时刷新 */
.pipe($.livereload())
.pipe($.connect.reload())
)
})
/* 注册任务,压缩 css代码 */
gulp.task('cssmin', () => {
return (
gulp
.src('./src/css/a.less')
// 处理 less 语法
.pipe($.less())
// 存储转成 css 语法后的文件
.pipe(gulp.dest('./dist/css'))
// 压缩 css 代码
.pipe($.csso())
// 向后添加文件名
.pipe($.rename({ suffix: '.min' }))
// 存储压缩后的文件
.pipe(gulp.dest('dist/css'))
// 在当前任务的最后铺个管道,用于实时刷新
.pipe($.livereload())
.pipe($.connect.reload())
)
})
// 注册默认任务
gulp.task('default', ['htmlmin', 'cssmin'])
// 注册实时更新任务
gulp.task('watch', ['default'], function() {
// 开启监听
$.livereload.listen()
// 监听文件的变化,当文件变化时执行相应的任务
// gulp.watch(['./src/*.html', './src/css/*.less'], ['htmlmin', 'cssmin'])
gulp.watch(['./src/*.html'], ['htmlmin'])
gulp.watch(['./src/css/*.less'], ['cssmin'])
})
// 注册页面刷新任务
gulp.task('server', ['default'], function() {
// 配置服务器选项
$.connect.server({
// 指定根目录
root: 'dist/',
// 实时刷新
livereload: true,
// 配置端口号
port: 5000
})
// 打开指定的 URL
open('http://localhost:5000/')
// 监听文件的变化,当文件变化时执行相应的任务
gulp.watch(['./src/*.html'], ['htmlmin'])
gulp.watch(['./src/css/*.less'], ['cssmin'])
})
该示例的功能与上一个示例完全相同。
browsersync:浏览器实时同步。。。