目录
了解glup
-
前端自动化打包构建工具
- 打包:把文件压缩,整合,移动,混淆
-
了解一下前端的打包构建工具
- gulp:基于流的打包构建工具
- webpack:基于js文件的打包构建工具
-
声明是流
- 流文件:流
- 一种文件传输的格式
- 一段一段的文件传输
- 流格式:流
- 从头到尾的一个过程
- 需要从 源 开始一步一步经过加工
- 每一个步骤需要依赖上一步的结果
- 最终给出一个完整的成品
- gulp是基于流格式的一种打包构建工具
- 流文件:流
-
gulp的依赖环境
- 依赖于node环境进行开发
- 底层封装的内容就是node里面的读写文件(http和fs)
-
gulp的作用
- 对于css文件
- 压缩
- 转码(自动添加前缀)
- 对于js文件
- 压缩
- 转码(ES6转ES5)
- 对于html文件
- 压缩
- 转码(对格式的转换)
- 对于静态资源文件的处理
- 对于第三方文件的处理
- …
- 对于css文件
-
gulp的安装
-
是一个JavaScript相关的工具
-
就可以直接使用npm进行安装
-
需要安装在你的电脑环境里面,一次安装多次使用
-
打开命令行,输入指令
- $ npm install --global gulp
-
-
gulp的检测
- 打开命令行,输入指令
- $ gulp --version
- 打开命令行,输入指令
-
gulp的卸载
- 打开命令行,输入指令
- $ npm uninstall --global gulp
- 打开命令行,输入指令
-
gulp的版本
-
gulp@3
- 安装成功检测版本号,gulp 3.9.1
-
gulp@4
- 安装成功检测版本号,gulp cli 2.2.0
-
-
gulp全局工具安装完毕
- 能给你的电脑提供一个启动gulp的环境
- 私人:可以在cmd里面运行 gulp xxx的指令
准备使用gulp
作用:帮我们打包自己的项目
-
准备一个项目
- 需求:
- 你要确定好自己的目录结构
- 你要分开源码和打包以后的内容
- 确定自己的目录结构
- xiaomi
- src 源码
- pages html
- css css
- js js
- sass sass
- images 图片
- videos 视频
- audios 音频
- lib 第三方文件(jquery,swiper,…)
- fonts 字体图标文件
- src 源码
- xiaomi
- 需求:
-
准备一个 gulpfile.js的文件
- 必须有
- gulp进行打包的依据
- 每个项目需要一个gulpfile.js
- 我们在这个文件里面进行本项目的打包配置
- gulp再运行的时候,会自动读取 gulpfile.js文件里面的配置
- 按照你在gulpfile.js文件里面的配置进行打包工作
- 注意:直接写在项目根目录,和src同级
-
在项目里面再次安装 gulp
- 注意:项目里面的gulp是以第三方模块的形式出现的
- 专门给你提供配置打包流程的API的
- 每一个项目都要安装一次
- 打开命令行,切换到项目目录
- 输入指令 $ npm install gulp
属性我本项目的打包配置流程
按照gulp的语法来进行配置
gulp指令运行的时候才会认识
-
在 gulpfile.js 里面属性配置文件
- 书写你该项目的打包流程
- 书写完毕以后,按照打包流程去执行 gulp 指令运行 gulpfile.js 文件
-
源码和打包以后的内容
-
pages/index.html 开发源码
-
打包完毕放在哪?
-
同级目录下,再次新建一个叫做pages的文件夹
- 不行?不能创建同名文件夹
-
统计目录下,创建一个叫做views的文件
- 不行?
-
-
必须要保证打包前后的目录结构一致
- 创建一个叫做src的目录(表示源码)
- 创建一个叫做dist的目录(存放打包后的文件)
-
-
gulp
-
全局依赖环境 gulp
-
一台电脑安装一次,以后使用就可以了
-
在命令行提供 gulp xxx 的能力
-
指令 $ npm install --global gulp
-
项目依赖第三方
-
每一个项目都要安装一次
-
作为第三方包出现,在你导入以后,可以使用 gulp.xxx()方法
-
切换到项目目录,输入指令 $ npm install gulp
-
-
-
-
package.json 记录的第三方依赖
- dependecies
- 表示你项目的 项目依赖
- 比如 jquery,swiper
- 指项目运行需要用到的内容,将来上线以后也需要用到的内容
- devDependencies
- 表示的你项目的 开发依赖
- 比如 gulp
- 指项目开发阶段需要用到的内容,将来上线以后不需要用到的
- gulp 第三方包最后是放在 devDependencies
- 在你安装第三方依赖的时候,属性 $ npm install --dev 包名
- 就会把依赖记录在 devDependencies
- dependecies
gulp的常用API
前提:下载gulp第三方,导入以后使用
1.gulp.task()
语法:gulp.task(任务名称,任务处理函数)
作用:创建一个基于流的任务
例子:
gulp.task('htmlHandler',function(){
//找到html源文件,进行压缩,打包,放入指定目录
})
2.gulp.src()
语法:gulp.src(路径信息)
作用:找到源文件
书写方式:
2-1. gulp.src('./a/b.html')
找到指定一个文件
2-2.gulp.src('./a/*.html')
找到指定目录下,指定后缀的文件
2-3.gulp.src('./a/**')
找到指定目录下的所有文件
2-4.gulp.src('./a/** /*')
找到a目录下的所有子目录里面的所有文件
2-5.gulp.src('./a/** /*.html')
找到a目录下的所有子目录里面的所有 .html 文件
3.gulp.dest()
语法:gulp.dest(路径信息)
作用:把一个内容放在指定目录内
例子:
gulp.dest('./abc')
把它接收到的内容放在abc目录下
4.gulp.watch()
语法:gulp.watch(路径信息,任务名称)
作用:监控指定目录下的文件,一旦发生变化,重新执行后面的任务
例子:
gulp.watch('./src/pages/*.html',htmlHandler)
当指定目录下的html文件发送变化,就会执行 htmlHandler这个任务
5.gulp.series()
语法:gulp.series(任务1,任务2,任务3,…)
作用:逐个执行多个任务,前一个任务结束,第二个任务开始
6.gulp.parallel()
语法:gulp.parallel(任务,任务2,任务3,…)
作用:并行开始多个任务
7.pipe()
管道函数
所有的gulp API 都是基于流
接收当前流,进入下一个流过程的管道函数
例子:
gulp.src().pipe(压缩任务).pipe(转码).pipe(gulp.dest(‘abc’))
gulp 常用插件
gulp的各种插件就是用来执行各种各样的压缩混淆转码任务的
1.gulp-cssmin
- 下载:npm i gulp-cssmin -D
- 导入:const cssmin=require(‘gulp-cssmin’)
- 导入以后得到一个处理流文件的函数
- 直接在管道函数里面执行就好了
执行一个gulp配置好的任务
直接打开命令行,切换到 gulpfile.js所在的目录
执行指令 $ gulp 任务名称
2. gulp-autoprefixer
- 下载:npm i gulp-autoprefixer -D
- 导入:const autoPrefixer = require(‘gulp-autoprefixer’)
- 导入以后得到一个处理流文件的函数
- 直接在管道函数里面使用,需要传递参数
- { browsers : [要兼容的浏览器]}
3.gulp-sass
- 下载:npm i gulp-sass -D(报错试试npm install --save-dev gulp@3.9.1)
- 很容易报错,基本下载不成功
- 为什么:因为 gulp-sass 依赖另一个第三方,node-sass
- node-sass 很难下载成功
- 以前都是在同一个地方下载,后来node-sass 自己单独有一个下载地址
- 如果你不进行单独的 node-sass 下载地址配置,就很容易失败
- 解决:给node-sass 单独配置一个下载地址
- 下载 node-sass 从这个单独的地址下载,下载其他的东西还是统一地址
- node-sass 单独下载地址
- $ set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/
- 单独配置一个下载地址,只要下载 node-sass 的时候会使用
- 过程
- $ set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/
- $ npm i node-sass -D
- $ npm i gulp-sass -D
- 导入:const sass = require(‘gulp-sass’)
- 导入以后得到一个可以处理流文件的函数,直接再管道函数里面执行就可以了。
4.gulp-ugfity
- 把 JS 文件压缩的
- 下载:npm i -D gulp-uglify
- 导入:const ugfity = require(‘gulp-uglify’)
- 导入以后得到一个可以处理流文件的函数
- 直接再管道函数中使用就可以了
- 注意:你不能写ES6 语法,一旦有了ES6语法就会报错(现在不会)
5.gulp-babel
- 专门进行 ES6 转 ES5 的插件
- gubel-babel的版本
- gulp-babel@7:大部分使用在 gulp@3 里面
- gulp-babel@8:大部分使用在 gulp@4 里面
- 下载:
- gulp-babel 需要依赖另外两个包,我们要一起下载
- 另外两个包 :@babel/core @babel/preset-env
- 导入:
- 只要导入一个包就可以了,他会自动导入另外两个包
- const babel = require(‘gulp-babel’)
- 导入以后得到一个可以处理流文件的函数
- 直接再管道函数内部使用,需要传递参数
6.gulp-htmlmin
下载:npm i -D gulp-htmlmin
导入:const htmlmin = require(‘gulp-htmlmin’)
导入以后得到一个可以处理流文件的函数
直接再管道函数里面调用,需要传递参数
7.del
下载:npm i -D del@5
作用:删除文件目录
导入:const del = require(‘del’)
导入以后得到一个函数,直接使用传递参数就可以了
8.gulp-webserver
作用:启动一个基于 node 属性的服务器
下载:npm i -D gulp-webserver
导入:const webserver = require(‘gulp-webserver’)
导入以后得到一个处理流文件的函数
我们在管道函数内调用就可以了,需要传递参数
gulp 打包组件
场景:
- 把重复的位置单独拿出来,写成一个 html 片段
- 单独拿出来的片段可以包含 css 和 js
- 也可以不包含
- 当我压缩 html的时候
- 能再固定位置把我写好的 html 片段引入进来
组件
- 一段可以包含(css / js)一整套 html 结构片段
- 把页面的每一部分分成一段一段的 html 片段
- 最后组装在一起
gulp-file-include
作用:在一个html页面里面导入一个 html 片段
下载:npm i -D gulp-file-include
导入:const fileInclude = require(‘gulp-file-include’)
导入之后得到一个处理流文件的函数
我们在管道函数内调用就可以了,需要传递参数
gulpfile.js
//因为gulp是依赖于node环境运行的
//将来的运行也是以node为继承运行的
//书写gulpfile.js文件就按照node的模块化语法进行书写(CommonJS)
//0-1.导入gulp
const gulp=require('gulp')
//0-2.导入 gulp-cssmin
const cssmin=require('gulp-cssmin')
//0-3.导入 gulp-autoprefixer
const autoprefixer=require('gulp-autoprefixer')
//0-4.导入 gulp-sass
const sass = require('gulp-sass')
//0-5 导入gulp-uglify
const uglify = require('gulp-uglify')
//0-6 导入 gulp-babel
const babel = require('gulp-babel')
//0-7 导入gulp-htmlmin
const htmlmin = require('gulp-htmlmin')
//0-8 导入 del
const del = require('del')
//0-9 导入gulp-web-server
const webserver = require('gulp-webserver')
//0-10 导入 gulp-file-include
const fileInclude = require('gulp-file-include')
//1.创建一个打包css的任务
// gulp@3的标准书写语法
// gulp.task('cssHandler',function(){
// //需要捕获到给任务的结束,需要把这个流return 出去,
// //task就会处理流
// return gulp
// .src('./src/css/*.css')//1-1.找到源文件
// .pipe(cssmin()) //1-2.压缩文件
// .pipe(gulp.dest('./dist/css/'))//1-3.把压缩好的内容放在指定目录下
// })
//1.创建任务
//1-1.创建一个打包css的任务
// gulp@4 的标准书写,需要在 gulpfile.js 文件里面把这个函数名导出
const cssHandler=function(){
return gulp
.src('./src/css/*.css') //1.找到内容
.pipe(autoprefixer()) //2.自动添加前缀
.pipe(cssmin()) //3.压缩
.pipe(gulp.dest('./dist/css'))//4.放到指定目录
}
//1-2.创建一个打包sass文件的任务
const sassHandler = function(){
return gulp
.src('./src/sass/*.scss')
.pipe(sass())
.pipe(autoprefixer())
.pipe(cssmin())
.pipe(gulp.dest('./dist/sass/'))
}
//1-3 创建一个打包js文件的任务
const jsHandler = function(){
return gulp
.src('./src/js/*.js') //1.找到js文件
.pipe(babel({
//babel@7, presets:['es2015']
presets:['@babel/env']
}))
.pipe(uglify())
.pipe(gulp.dest('./dist/js/'))
}
//1-4.创建一个打包 html 文件的任务
const htmlHandler = function(){
return gulp
.src('./src/pages/*.html')
.pipe(fileInclude({
prefix:'@-@',//你自定义的一个标识符
basepath:'./src/components'//基准目录,你的组件文件在哪个目录
}))
.pipe(htmlmin({//通过你配置的参数来进行压缩
// collapseWhitespace:true,//表示移除空格
removeEmptyAttributes:true,//表示移除空的书写(仅限于原生属性)
collapseBooleanAttributes:true,//移除checked类似的布尔值属性
removeAttributeQuotes:true,//移除属性上的双引号
minifyCSS:true,//压缩内嵌式css代码(只能基本压缩,不能自动添加前缀)
minifyJS:true,//压缩内嵌式JS代码(只能基本压缩,不能进行转码)
removeStyleLinkTypeAttributes:true,//移除style和link标签上的type
removeScriptTypeAttributes:true//移除script标签上默认的属性
}))
.pipe(gulp.dest('./dist/pages/'))
}
//1-5.创建一个打包images 文件的任务
const imgHandler = function () {
return gulp
.src('./src/images/**')
.pipe(gulp.dest('./dist/images'))
}
//1-6.创建一个打包video文件的任务
const videoHandler = function(){
return gulp
.src('./src/videos/**')
.pipe(gulp.dest('./dist/videos/'))
}
//1-7.创建一个打包audios文件的任务
const audioHandler = function(){
return gulp
.src('./src/audios/**')
.pipe(gulp.dest('./dist/audios/'))
}
//1-8.创建一个打包 第三方的任务
const libHandler =function(){
return gulp
.src('./src/lib/**/*')
.pipe(gulp.dest('./dist/lib/'))
}
//1-9.创建一个打包 fonts 文件的任务
const fontHandler = function(){
return gulp
.src('./src/fonts/**/*')
.pipe(gulp.dest('./dist/fonts/'))
}
//1-10.创建一个删除 dist 目录的任务
const delHandler = function(){
//del 直接执行就可以了,不需要流
//参数以数组的形式传递你要删除的文件夹
return del(['./dist/'])
}
//1-11.创建一个启动 服务器的任务
const webHandler=function(){
return gulp
.src('./dist')
.pipe(webserver({
host:'localhost',//域名(可以配置自定义域名)
port:'8080',//端口号
livereload:true,//当文件修改的时候,是否自动刷新页面
open:'./pages/index.html',//默认打开哪一个文件(从dist 目录以后)
proxies:[//配置你的所有代理
//每一个代理就是一个对象数据类型
//注意:如果你没有代理,不要写空对象
{
//代理标识符
source:'/dt',
//代理目标地址
target:'https://www.duitang.com/npi/blog/list/by_filter_id'
}
]
}))
}
//1-12. 创建一个健康任务
const watchHandler=function(){
//使用 gulp.watch()
gulp.watch('./src/css/*.css',cssHandler)
gulp.watch('./src/js/*.js',jsHandler)
gulp.watch('./src/pages/*.html',htmlHandler)
}
//2.导出任务
//2-1.导出打包 css 的任务
module.exports.cssHandler=cssHandler
//2-2 导出打包 sass 的任务
module.exports.sassHandler=sassHandler
//2-3.导出打包js的任务
module.exports.jsHandler=jsHandler
//2-4.导出打包html的任务
module.exports.htmlHandler=htmlHandler
//2-5.导出打包images的任务
module.exports.imgHandler=imgHandler
//2-6.导出打包 videos 的任务
module.exports.videoHandler=videoHandler
//2-7.导出打包 audios 的任务
module.exports.audioHandler=audioHandler
//2-8.导出打包 第三方 的任务
module.exports.libHandler=libHandler
//2-9.导出打包 fonts 的任务
module.exports.fontHandler=fontHandler
//2-10.导出删除 dist 目录的任务
module.exports.delHandler=delHandler
// 3. 配置一个默认任务
// 默认任务的作用就是把所有任务一起执行了
// 要么使用 gulp.series(),要么使用 gulp.parallel()
// 这两个方法的返回值是一个函数,返回值可以直接被当作任务函数使用
// 使用 task 的方式创建一个default 任务
//方式1:
// gulp.task('default',() => {})
//方式2:
// module.exports.default = () => {}
//创建一个默认任务
// module.exports.default = gulp.parallel(cssHandler,jsHandler,htmlHandler,imgHandler,videoHandler,audioHandler,libHandler,fontHandler)
// 添加完删除 dist 目录的任务,修改 default 任务
// module.exports.default = gulp.series(
// delHandler,
// gulp.parallel(cssHandler,jsHandler,htmlHandler,imgHandler,videoHandler,audioHandler,libHandler,fontHandler)
// )
//添加完毕服务器任务以后,修改 default 任务
// module.exports.default = gulp.series(
// delHandler,
// gulp.parallel(cssHandler,jsHandler,htmlHandler,imgHandler,videoHandler,audioHandler,libHandler,fontHandler),
// webHandler
// )
//添加完毕键控任务之后,修改 default 任务
module.exports.default = gulp.series(
delHandler,
gulp.parallel(cssHandler,jsHandler,htmlHandler,imgHandler,videoHandler,audioHandler,libHandler,fontHandler),
webHandler,
watchHandler
)
/*
sass 转换的问题
* 有一个电脑上的工具叫做 sass
=> 可以转换和编译 sass 文件为 css 文件
* gulp 里面配置一个任务,也可以转换 sass 文件
* 写项目的时候使用哪一个?
=> 如果你需要使用 gulp 来配置你的项目,那么不需要使用 sass 工具
=> 如果你不需要使用 gulp 来配置你的项目,那么就需要使用 sass 工具
* 写项目不要多个工具(完成一个工作的多个工具)混着使用
*/
/*
sass转码使用
* 有一种方式叫做 导入sass文件
* 如果你需要用到导入
* 你可以把变量和混合器定义在 .sass 后缀的文件中
=> 你的gulp配置的只会转码 .scss 文件
=> 你设置的变量和混合器文件不会被转码
* 但是,当他转码 .scss文件的时候,会自动读取 .sass 文件里面的变量
=> 会给你解析以后使用
*/
/*
图片问题
* 在开发环境中
* 图片是不需要我们压缩的
=> 直接使用线上地址
=> 图片是UI处理好给我们的
* gulp-imagemin
=> 专门用来压缩图片(无损压缩)
=> 下载需要很好的网络环境
=> 压缩程度最高是7级,1024K 变成1023K
*/
/*
默认任务为什么一定要叫做 default
* 因为你使用 gulp 指令的时候
=>应该是 $ gulp 任务名称
* 当你有一个叫做 default 的任务的时候
=>你可以直接执行指令 $ gulp
=>他会自动去指定你 gulpfile.js 文件中的 default 任务
*/
/**
* 为什么会多一个文件
* * 我们在执行gulp 任务的时候
* * 不会进行文件夹清理的
* * 都是按照当前的 src 目录,和你配置的内容进行打包
* * 放在你指定的目录,如果这个目录已经存在,那么直接放进去
* * 如果这个目录不存在,就会创建一个目录再放进去
*
*
* 当我们第二次修改名称以后打包
* * 本身 dist/css 里面就有一个 index.css 的文件
* * 又打包了一个 abcd.css 的文件,发现 dist/css 目录存在,就直接放进去
* * 所有就会出现两个文件同时存在
*
*
* 需要的结果
* * 只有一个文件
* * 需要直接删除 dist 文件夹
* * 什么时候删除 ? 每次打包之前删除 dist 文件夹
* * 打包完毕会自动创建一个
*/
/**
* 利用gulp 启动一个服务器
* gulp 是基于node 环境的工具
* node 就是可以做服务器的语言
* gulp 可以启动一个基于 node 的服务器
*
* 启动服务器,用哪个目录当作服务器根目录
* dist 目录,是我的结果目录
* 如果你使用 src 目录当作根目录,sass 文件怎么办
* 启动服务器的时候,启动dist目录 里面的 对应的html 文件
*
* sass 文件
* src/pages/login.html
* src/sass/login.scss
* 怎么使用
* 将来 src/pages/login.html 会把打包传递到 dist/pages/login.html
* 将来 src/sass/login.css 会把打包传递到 dist/sass/login.css
* 在html中写
* link href="../sass/login.css"
*
* 自动刷新为什么不好使
* 因为你启动的服务器是 dist 目录
* 你修改的 src 目录下的内容
* 你还需要一个任务,当src 目录下的内容修改的时候,自动重新打包一遍该文件
* 导致 dist 目录下的文件修改,dist 目录下的文件修改就会自动刷新页面
*
*
* 启动服务配置自定义域名
* webserver 位置的host属性一个你自定义好的域名(www.zlq.com)
* 找到电脑中的 hosts 文件
* C:/windows/system32/drivers/etc/hosts
* 注意:遭到哪个没有后缀的hosts 文件
* 添加一行内容 127.0.0.1 www.zlq.com
*
* */
/**
* gulp-webserver 配置代理
* 在 webserver({
* proxies:[
* {
* source: '代理标识符',
* target: '代理目标地址'
* }
* ]
* })
* 注意:
* 1.如果没有多余代理,不要写空对象https://www.duitang.com/npi/blog/list/by_filter_id
* 2.如果你想要使用代理,那么必须要是在 gulp-webserver 启动的服务器上运行页面
*/