【任务执行工具】gulp入门

gulp配置

了解glup

  • 前端自动化打包构建工具

    • 打包:把文件压缩,整合,移动,混淆
  • 了解一下前端的打包构建工具

    • gulp:基于流的打包构建工具
    • webpack:基于js文件的打包构建工具
  • 声明是流

    • 流文件:流
      • 一种文件传输的格式
      • 一段一段的文件传输
    • 流格式:流
      • 从头到尾的一个过程
      • 需要从 源 开始一步一步经过加工
        • 每一个步骤需要依赖上一步的结果
        • 最终给出一个完整的成品
      • gulp是基于流格式的一种打包构建工具
  • gulp的依赖环境

    • 依赖于node环境进行开发
    • 底层封装的内容就是node里面的读写文件(http和fs)
  • gulp的作用

    • 对于css文件
      • 压缩
      • 转码(自动添加前缀)
    • 对于js文件
      • 压缩
      • 转码(ES6转ES5)
    • 对于html文件
      • 压缩
      • 转码(对格式的转换)
    • 对于静态资源文件的处理
    • 对于第三方文件的处理
  • 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

作用:帮我们打包自己的项目

  1. 准备一个项目

    • 需求:
      • 你要确定好自己的目录结构
      • 你要分开源码和打包以后的内容
    • 确定自己的目录结构
      • xiaomi
        • src 源码
          • pages html
          • css css
          • js js
          • sass sass
          • images 图片
          • videos 视频
          • audios 音频
          • lib 第三方文件(jquery,swiper,…)
          • fonts 字体图标文件
  2. 准备一个 gulpfile.js的文件

    • 必须有
    • gulp进行打包的依据
    • 每个项目需要一个gulpfile.js
    • 我们在这个文件里面进行本项目的打包配置
    • gulp再运行的时候,会自动读取 gulpfile.js文件里面的配置
    • 按照你在gulpfile.js文件里面的配置进行打包工作
    • 注意:直接写在项目根目录,和src同级
  3. 在项目里面再次安装 gulp

    • 注意:项目里面的gulp是以第三方模块的形式出现的
    • 专门给你提供配置打包流程的API的
    • 每一个项目都要安装一次
    • 打开命令行,切换到项目目录
      • 输入指令 $ npm install gulp
属性我本项目的打包配置流程
按照gulp的语法来进行配置
gulp指令运行的时候才会认识
  1. 在 gulpfile.js 里面属性配置文件

    • 书写你该项目的打包流程
    • 书写完毕以后,按照打包流程去执行 gulp 指令运行 gulpfile.js 文件
  2. 源码和打包以后的内容

    • pages/index.html 开发源码

    • 打包完毕放在哪?

      • 同级目录下,再次新建一个叫做pages的文件夹

        • 不行?不能创建同名文件夹
      • 统计目录下,创建一个叫做views的文件

        • 不行?
    • 必须要保证打包前后的目录结构一致

      • 创建一个叫做src的目录(表示源码)
      • 创建一个叫做dist的目录(存放打包后的文件)
  3. gulp

    • 全局依赖环境 gulp

      • 一台电脑安装一次,以后使用就可以了

      • 在命令行提供 gulp xxx 的能力

      • 指令 $ npm install --global gulp

      • 项目依赖第三方

        • 每一个项目都要安装一次

        • 作为第三方包出现,在你导入以后,可以使用 gulp.xxx()方法

        • 切换到项目目录,输入指令 $ npm install gulp

  4. package.json 记录的第三方依赖

    • dependecies
      • 表示你项目的 项目依赖
      • 比如 jquery,swiper
      • 指项目运行需要用到的内容,将来上线以后也需要用到的内容
    • devDependencies
      • 表示的你项目的 开发依赖
      • 比如 gulp
      • 指项目开发阶段需要用到的内容,将来上线以后不需要用到的
    • gulp 第三方包最后是放在 devDependencies
      • 在你安装第三方依赖的时候,属性 $ npm install --dev 包名
      • 就会把依赖记录在 devDependencies

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 启动的服务器上运行页面
 */
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值