Gulp自动化构建打包工具
gulp是一个项目开发的自动化构建打包工具,基于node环境来运行的
一、什么是自动化打包构建工具
- 我们在开发的过程中,会写到
js
,css
等文件 - 我们的项目如果想上线,那么一定要体积小一点,文件越小越好
- 而我们写的
js
,css
文件的时候,会有很多 换行/空格 之类的东西 - 而这些 换行/空格 都是占文件体积的一部分
- 那么我们在上线之前就要把这些 空格/换行 删除掉,但我们又不可能一个一个的去删除
- 就要用到一个自动化工具来帮助我们把这些多余的东西干掉
常见的自动化打包工具
gulp
webpack
二、安装GULP
-
gulp
是一个依赖于node
的环境工具 -
所以我们需要安装一个 全局
gulp
依赖 -
直接使用
npm
去安装# 使用npm安装全局依赖 gulp $ npm install --global gulp
-
检查是否安装成功
$ gulp --version
三、使用GULP
1.项目目录结构
注意:所有的代码都必须放在src
这个文件夹下
2.在项目文件夹下执行npm初始化
在 gulp_demo
下初始化
$ npm init -y
3.执行完毕之后,再来看看我们的项目目录
会多一个package.json文件
四、项目GULP配置
1.安装gulp
-
之前已经安装过
gulp
全局依赖了 -
但是每一个项目都要安装一次
gulp
的项目依赖 -
因为每一个项目的打包构建规则都不一样,所以不能全都配置成一个
-
所以我们要在项目里再次进行
gulp
安装还是进入项目文件夹gulp_demo下安装
$ npm i -D gulp
项目中的gulp依赖要和全局gulp环境保持一致
2.项目进行打包构建配置
在项目目录下新建一个gulpfile.js
接下来我们就在gulpfile.js文件里进行配置,让我们的打包构建可以生效
五、GULP API
在进行项目打包之前,要先了解一下GULP的一些API,方便以后的打包操作和理解
1.task()
每个gulp任务都是一个异步JavaScript函数
//创建名为css的任务
gulp.task('css',function(){
//执行任务代码
})
2.src()
创建一个流,用于从文件系统中读取对象
3.dest()
创建一个用于将数据对象写入到文件系统的流
4.pipe()
字面意思,管道,接受上一个流的结果,并返回一个处理后流的结果。
举个栗子🌰
//定义一个copy任务,将src/js目录下的js文件复制到output目录下
gulp.task('copy',function(){
return gulp.src('./src/js/*.js')
.pipe(gulp.dest('output/')) //当没有output文件夹时,会自动创建
})
5.series()
将任务函数和/或组合操作组合成更大的操作,这些操作将按照顺序依次执行
gulp.series('js','css') //先执行js这个任务,在执行css任务
gulp.task('test',gulp.series('copy','js'))
6.parallel()
将任务功能和/或组合操作合成 同时执行 的较大操作。对于使用series()
和parallel()
进行嵌套组合的深度没有强制限制
gulp.parallel('js','css') //js任务和css任务同时执行
gulp.parallel('test',gulp.series('copy','js'))
7.watch()
监听 文件系统 并在文件发生改变时执行
gulp.watch('./src/css/**',gulp.parallel('css'))
六、打包操作
学习了解完gulp的API,现在开始打包我们的项目
1.打包css文件
-
在gulpfile.js里引入gulp
//我是gulpfile.js文件 //1.引入gulp const gulp = require('gulp')
-
下载第三方依赖包
gulp-cssmin
# 在项目文件下下载gulp-cssmin第三方依赖 $ npm i -D gulp-cssmin
-
下载完毕后,去文件中进行配置
//我是gulpfile.js文件 //1.引入gulp const gulp = require('gulp') //2.引入gulp-cssmin const cssmin = require('gulp-cssmin') //3.创建一个css的任务 gulp.task('css',function(){ return gulp.src('./src/css/*.css') //对哪些文件进行操作,这里是对css文件操作 .pipe(cssmin()) //做什么操作,这里是进行css压缩 .pipe(gulp.dest('./dist/css')) //把压缩完的文件放在dist文件夹下 })
-
执行css任务 ,直接在控制台使用命令
# 表示运行gulpfile.js配置文件中的 css 任务 $ gulp css
- 执行完毕以后,就会在
gulp_demo
目录下生成一个dist
文件夹 - 里面就有我们压缩好的
css
文件
- 执行完毕以后,就会在
2.打包SASS文件
-
任务:
- 把
sass
解析成css
- 压缩一下
- 放到对应的文件夹中
- 把
-
下载第三方依赖包
gulp-sass
# 在项目文件下下载gulp-sass第三方依赖 $ npm i -D gulp-sass
-
配置文件
//2-1.引入gulp-sass const sass = require('gulp-sass') //2-2创建一个sass任务 gulp.task('sass',function(){ return gulp.src('./src/sass/**') .pipe(sass()) .pipe(cssmin()) .pipe(gulp.dest('./dist/css')) })
-
执行任务
# 执行 sass 任务 $ gulp sass
3.打包JS文件
打包js文件需要四个包,一个是压缩js文件的包,三个是编译ES6语法的包
打包js文件
-
下载第三方依赖包
gulp-uglify
# 在项目文件下下载gulp-uglify第三方依赖 $ npm i -D gulp-uglify
-
配饰文件
//3-1.引入gulp-uglify const uglify = require('gulp-uglify') //3-2创建一个js任务 gulp.task('js',function(){ return gulp.src('./src/js/*.js') .pipe(uglify()) .pipe(gulp.dest('./dist/js')) })
-
执行js任务
gulp js
编译ES6语法
ES6转ES5需要的三个依赖
-
下载第三方依赖包
npm i -D gulp-babel@7.0.1 npm i -D babel-core npm i -D babel-preset-es2015
-
配置文件
//3-1引入gulp-babel // ES6转ES5虽然需要下载三个依赖,但只需要引入一个gulp-babel就可以了 const babel = require('gulp-babel') //3-2创建一个js任务 gulp.task('sass',function(){ return gulp.src('./src/js/*.js') .pipe(babel({ presets:['es2015'] })) .pipe(uglify()) .pipe(gulp.dest('./dist/js')) })
-
执行任务
gulp js
4.打包html文件
-
下载第三方依赖包
gulp-htmlmin
# 在项目文件下下载gulp-htmlmin第三方依赖 $ npm i -D gulp-htmlmin
-
配饰文件
//4-1.引入gulp-htmlmin const htmlmin = require('gulp-htmlmin') //3-2创建一个js任务 gulp.task('html',function(){ return gulp.src('./src/pages/*.html') .pipe(htmlmin({ removeEmptyAttibutes:true, //移出所有空属性 collapseWhitespace:true //压缩html })) .pipe(gulp.dest('./dist/pages')) })
-
运行html任务
gulp html
4.处理LIB和STATIC文件
这些都是第三方的一些文件和一些图片之类的信息
不需要压缩处理,只需要转到我们的dist文件夹下就可以了
-
配置文件
//5创建一个lib任务 gulp.task('lib',function(){ return gulp.src('./src/lib/**') .pipe(gulp.dest('./dist/lib')) }) //6创建一个static任务 gulp.task('static',function(){ return gulp.src('./src/static/**') .pipe(gulp.dest('./dist/static')) })
-
执行lib和static任务
# 执行 lib 任务 $ gulp lib # 执行 static 任务 $ gulp static
5.按顺序批量执行任务series()
当我们任务太多时,一个任务一个任务的执行太费时间,我们可以批量的执行任务
series()
将任务按顺序执行
exports.default
暴露一个默认任务
根目录运行默认任务,只需要执行 gulp
命令
exports.default = gulp.series('css','sass','js','html','lib','static') //按顺序依次执行
执行任务
# 执行默认任务
$ gulp
6.同时批量执行任务parallel()
parallel()
多个任务同时执行
exports.default
暴露一个默认任务
根目录运行默认任务,只需要执行 gulp
命令
exports.default = gulp.parallel('css','sass','js','html','lib','static') //同时执行
执行任务
# 执行默认任务
$ gulp
7.清除dist文件夹
- 当你在编译的时候,如果第一次编译有一个叫做
a.css
的文件,他会帮你编译 - 后来你把
a.css
文件改了名字,改成了b.css
文件,再次进行编译的时候 - 会给你新生成一个叫做
b.css
文件在dist
文件夹中 - 之前的
a.css
文件也不会消失 - 那这样就不是很好
- 我们比较好的做法是
- 在执行所有编译之前
- 先把
dist
文件夹清除掉 - 然后再执行所有的编译
-
下载第三方依赖包
gulp-clean
-
配置文件
//引入 gulp-clean const clean = require('gulp-clean') //创建一个 clean 任务 gulp.task('clean',function(){ return gulp.src('./dist',{allowEmpty:true}) //当dist目录不存在时 .pipe(clean()) })
-
先执行 clean 任务,在执行默认任务
# 执行 clean 任务 $ gulp clean # 执行默认任务 $ gulp //当没有dist文件夹时,会自动创建dist文件夹
8.清除配置完成默认任务
series将任务按顺序执行和parallel同时执行 嵌套执行
exports.default = gulp.series('clean', gulp.parallel('css', 'sass', 'js', 'html', 'lib', 'static'))
//先清除dist文件夹,在执行打包任务
9.自动打开浏览器
-
下载第三方依赖包
gulp-webserver
-
配置文件
//引入 gulp-webserver const webserver = require('gulp-clean') //创建一个 webserver 任务 gulp.task('webserver',function(){ return gulp.src('./dist') .pipe(webserver({ host:'localhost', //配置打开浏览器的域名 port:8080, //配置打开浏览器的端口号 livereload:true //自动刷新浏览器 open:'./pages/index.html' //默认打开dist文件夹下的那个文件 })) .pipe(clean()) })
exports.default = gulp.series('clean', gulp.parallel('css', 'sass', 'js', 'html', 'lib', 'static'),'webserver')
10修改内容自动刷新
在制作一个任务,当文件夹下的内容修改的时候,自动帮我们重新编译
不需要任何依赖,只需要配置一个监听文件的任务就可以了
创建一个watch任务
//创建一个watch任务
gulp.task('watch', function () {
//gulp.watch('./src/css/**', gulp.parallel('css'))
//gulp.watch('./src/sass/**', gulp.parallel('sass'))
//gulp.watch('./src/js/**', gulp.parallel('js'))
//gulp.watch('./src/pages/**', gulp.parallel('html'))
//gulp.watch('./src/lib/**', gulp.parallel('lib'))
//gulp.watch('./src/static/**', gulp.parallel('static'))
gulp.watch('./src/**',gulp.series('clean', gulp.parallel('css', 'sass', 'js', 'html', 'lib', 'static')))
})
改写成默认任务
exports.default = gulp.series('clean',
gulp.parallel('css', 'sass', 'js', 'html', 'lib', 'static'),
gulp.series('webserver','watch'))
运行任务
gulp
- 这个时候,我们只要进行代码书写就可以了
- 代码发生改变,会帮我们自动打包编译,并且自动进行浏览器刷新
GULP完整配置文件
gulpfile.js文件内容
const gulp = require('gulp')
const cssmin = require('gulp-cssmin')
const sass = require('gulp-sass')(require('sass'));
// 3-1. 引入 gulp-uglify
const uglify = require('gulp-uglify')
// 3-2. 引入 gulp-babel
// es6 转 es5 虽然需要下载三个依赖,但是只需要引入一个 gulp-babel 就可以了
const babel = require('gulp-babel')
// 4. 引入 gulp-htmlmin
const htmlmin = require('gulp-htmlmin')
// 5. 引入 gulp-clean
const clean = require('gulp-clean');
// 7. 引入 gulp-webserver
const webserver = require('gulp-webserver')
gulp.task('css', function () {
return gulp.src('./src/css/**')
.pipe(cssmin())
.pipe(gulp.dest('./dist/css'))
})
gulp.task('sass', function () {
return gulp.src('./src/sass/**')
.pipe(sass())
.pipe(cssmin())
.pipe(gulp.dest('./dist/css'))
})
// 3. 创建一个 js 任务
gulp.task('js', function () {
return gulp
.src('./src/js/**')
.pipe(babel({
presets: ['es2015']
}))
.pipe(uglify())
.pipe(gulp.dest('./dist/js'))
})
// 4. 创建一个 html 任务
gulp.task('html', function () {
return gulp
.src('./src/pages/**')
.pipe(htmlmin({
removeEmptyAttibutes: true, // 移出所有空属性
collapseWhitespace: true // 压缩 html
}))
.pipe(gulp.dest('./dist/pages'))
})
gulp.task('lib', function () {
return gulp.src('./src/lib/**')
.pipe(gulp.dest('./dist/lib'))
})
gulp.task('static', function () {
return gulp.src('./src/static/**')
.pipe(gulp.dest('./dist/static'))
})
// 8. 创建一个 clean 任务
gulp.task('clean', function () {
return gulp
.src('./dist', {
allowEmpty: true
}) // {allowEmpty: true} dist目录不存在时配置
.pipe(clean())
})
// 9. 创建一个 webserver 任务
gulp.task('webserver', function () {
return gulp
.src('./dist')
.pipe(webserver({
host: 'localhost', // 配置打开浏览器的域名
port: 3000, // 配置打开浏览器的端口号
livereload: true, // 自动刷新浏览器
open: './pages/index.html' // 默认打开 dist 文件夹下的哪个文件
}))
})
// 10. 创建一个 watch 任务
gulp.task('watch', function () {
gulp.watch('./src/css/**', gulp.parallel('css'))
gulp.watch('./src/sass/**', gulp.parallel('sass'))
gulp.watch('./src/js/**', gulp.parallel('js'))
gulp.watch('./src/pages/**', gulp.parallel('html'))
gulp.watch('./src/lib/**', gulp.parallel('lib'))
gulp.watch('./src/static/**', gulp.parallel('static'))
})
exports.default = gulp.series('clean',
gulp.parallel('css', 'sass', 'js', 'html', 'lib', 'static'),
gulp.series('webserver','watch'))