概念
前端的构建工具常见的有Grunt、Gulp、Webpack三种,Grunt比较老旧,功能少,更新少,插件少。
gulp是一个自动化构建工具,主要用来设定程序自动处理静态资源的工作。简单的说,gulp就是用来打包项目的。
gulp是一个基于任务的工具,也就是说,gulp规定,不管做什么功能,都用统一的接口管理,必须去注册一个任务,然后去执行这个任务,在任务代码中,去做想想做的功能。这是gulp的特点之一:任务化。
官网:gulpjs.com/
插件的使用方法:www.npmjs.com
安装
全局安装gulp
cnpm i gulp -g
检测是否安装成功
gulp -v
# 安装成功之后会显示版本信息
初始化项目
cnpm init -y
# 成功之后会生成一个package.json的文件
# 注意:在中文目录下无法使用这个命令,这时可以使用 npm init 这个命令
在项目中局部安装gulp
使用cnpm默认下载的时候不会记录在package.json文件中,需要记录的时候要在后面加参数
cnpm i gulp --seve-dev
# 简写
cnpm i gulp -D
后面的其他参数
--seve | -S
# 是强制保存在package.json中,意思是项目依赖,开发的时候我需要他写代码,等项目上线以后,项目运行起来也需要他
--save-dev | -D
# 是强制保存在pageckage.json中,意思是开发依赖,开发的时候我需要他,比如打包工具 ,等项目上线以后,我就不需要他运行项目
将来,到了服务器环境中,使用 cnpm i 会安装项目依赖,但是不会安装开发依赖
入门使用
创建glupfile.js文件
在项目根目录下创建一个glupfile.js的文件,文件的名字是固定的,不可私自更改
gulp的每个功能都是一个任务,压缩css的任务、合并文件的任务。gulp规定任务要写在一个叫做glupfile.js的文件中,在这个文件中用来配置所有任务。
写入代码
在glupfile.js写入以下代码
function defaltTask(cb) {
console.log("测试成功");
cb()
}
exports.default = defaltTask;
在命令行中执行这个任务
gulp
到这里,我们的基本入门测试就结束了,接下来我们了解几个gulp常用的api,方便接下来的学习
gulp几个常用接口
-
series:同步任务 -
parallel:异步任务 -
src:读取文件 -
dest:写入文件 -
watch:监视文件变化 -
pipe:管道
series,parallel,src,dest,watch 这几个api都是从gulp中获取
let {series,parallel,src,dest,watch} = require('gulp');
同步任务
如果希望让多个任务按照顺序执行,需要用到gulp的series接口,用来让任务同步执行
// 将任务导出并按照排好的顺序执行
exports.default = series(print1, print2)
异步任务
如果要让两个任务是异步执行的,需要用到gulp的parallel接口,用来让任务异步执行
// 将任务导出并按照排好的顺序执行
exports.default = parallel(print1, print2)
读取文件
将本地文件读取到gulp内存中,需要用到gulp的src接口,读取出来的是数据流
src(要读取的文件路径)
写入文件
将内存中数据输出到本地文件中,需要使用gulp的dest接口,参数是一个文件夹路径
dest(输出文件的文件夹路径)
管道
将数据流接过来进行操作,不需要解构
既然gulp的所有操作都是基于流的,就需要将上一步的结果流向下一个操作,中间需要用到管道:
上一步的操作
.pipe(下一步的操作)
监视文件变化
用来监视某个或某些文件发生变化,可以在变化的时候,执行一个任务函数或者是任务组合
watch(监视的文件或多个文件组成的数组, [options], [task])
gulp插件
我们要处理文件的合并、压缩等操作,接口中没有提供,都放在了插件中
# 下载插件:
npm install 插件名 --save-dev
-
gulp-concat: 合并文件(js/css) -
gulp-uglify: 压缩js文件 -
gulp-rename: 文件重命名 -
gulp-less: 编译less -
gulp-sass:编译sass -
gulp-clean-css: 压缩css -
gulp-htmlmin:压缩html文件 -
gulp-load-plugins:打包插件 -
gulp-autoprefixer:给css加前缀 -
ES6转ES5
-
gulp-babel@7.0.1 -
babel-core -
babel-preset-es2015
-
-
gulp-clean:清空目标文件夹 -
gulp-webserver:启动一个服务器 -
gulp-connect:热加载,配置一个服务器 -
open:自动打开浏览器 -
gulp-imagemin:压缩图片 -
gulp-file-include:gulp打包组件
项目中下载多个插件
cnpm i gulp-concat gulp-uglify gulp-rename gulp-sass gulp-clean-css gulp-htmlmin gulp-webserver gulp-load-plugins gulp-autoprefixer gulp-babel@7.0.1 babel-core babel-preset-es2015 gulp-clean -D
全自动化构建项目
该项目中使用了大部分能够用到的插件,还有部分插件没有用到,如在项目中有其他插件的需求,可以去www.npmjs.com搜索相关插件的使用
目录结构
gulpfile.js代码
// 全自动化构建项目
const { src, dest, parallel, series, watch } = require("gulp");
const _ = require("gulp-load-plugins")();
// 定义html任务
function handlerHtml(cb) {
src('./src/*.html')
.pipe(_.fileInclude({ // 根据配置导入对应的 html 片段
prefix: '@@', // 自定义的一个标识符
basepath: './src/components' // 基准目录, 组件文件所在目录路径
}))
.pipe(_.htmlmin({ collapseWhitespace: true })) // 为true是去掉空格和换行符
.pipe(dest('./dist/'))
cb();
}
// 定义css任务
function handlerCss(cb) {
src('./src/assets/sass/*.scss')
.pipe(_.sass()) // 将sass文件转换为 css文件
.pipe(_.autoprefixer()) // 给css加前缀,在package.json中配置
.pipe(_.cleanCss()) // 压缩css文件
.pipe(_.rename({ extname: ".min.css" })) // 重命名文件
.pipe(dest('./dist/css/'))
cb();
}
// 定义js任务
function handlerJs(cb) {
src('./src/assets/js/*.js')
.pipe(_.babel({ presets: ['es2015'] })) // 将ES6以上的语法转换为ES5的语法
.pipe(_.uglify()) // 将js压缩
.pipe(_.rename({ extname: ".min.js" })) // 重命名文件
.pipe(dest('./dist/js/'))
cb();
}
// 定义压缩图片和字体
function handlerImg(cb) {
src('./src/assets/image/*.*')
.pipe(_.imagemin())
.pipe(dest('./dist/img'))
cb()
}
// 定义监听文件变化任务
function listenerFile(cb) {
watch(['./src/*.html', './src/components/*.html'], { ignoreInitial: false }, handlerHtml);
watch('./src/assets/sass/*.scss', { ignoreInitial: false }, handlerCss);
watch('./src/assets/js/*.js', { ignoreInitial: false }, handlerJs);
cb();
}
// 创建服务器
function server(cb) {
src('./dist', { allowEmpty: true })
.pipe(_.webserver({
livereload: true, // 是否自动刷新
host: "localhost", // 设置域名
port: 8888, // 设置端口
open: true, // 自动打开游览器
fallback: "index.html", // 默认打开的页面
proxies: [ // 配置代理,可以配置多项
{
source: '/runoob', // 自定义地址-菜鸟
target: 'https://www.runoob.com/' //代理的目标地址
},
{
source: '/baidu', // 自定义地址-百度
target: 'https://www.baidu.com/' //代理的目标地址
}
]
}))
cb();
}
// 导出任务
exports.default = series(parallel(handlerHtml, handlerCss, handlerJs, handlerImg), listenerFile, server);
package.json代码
{
"name": "",
"version": "1.0.0",
"description": "",
"main": "index.js",
"dependencies": {},
"devDependencies": { //开发依赖,项目中请把注释去掉
"babel-core": "^6.26.3",
"babel-preset-es2015": "^6.24.1",
"gulp": "^4.0.2",
"gulp-autoprefixer": "^8.0.0",
"gulp-babel": "^7.0.1",
"gulp-clean": "^0.4.0",
"gulp-clean-css": "^4.3.0",
"gulp-concat": "^2.6.1",
"gulp-file-include": "^2.3.0",
"gulp-htmlmin": "^5.0.1",
"gulp-imagemin": "^7.1.0",
"gulp-load-plugins": "^2.0.7",
"gulp-rename": "^2.0.0",
"gulp-sass": "^4.1.0",
"gulp-uglify": "^3.0.2",
"gulp-webserver": "^0.9.1"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"browserslist": [ //css兼容版本信息,项目中请把注释去掉
"FireFox > 2",
"IOS > 3",
"IE > 7",
"chrome > 5",
"last 3 version"
]
}
在项目开发过程中使用这套配置,查看效果时会很慢,这时我们可以把管道压缩去掉,提高我们查看效果的速度