首页 > 其他分享 >系统化学习前端之gulp

系统化学习前端之gulp

时间:2023-02-22 15:55:30浏览次数:45  
标签:src const cb 前端 js gulp 任务 系统化

gulp 基本使用

gulp 是什么

基于流的自动化构建工具

gulp 执行单个任务

gulp 执行单个任务可以直接通过定义任务,执行任务名方式来完成任务。

  1. 安装依赖

    npm install -D gulp
    
  2. 配置文件 gulpfile.js

    gulp4.0 之前

    具名任务

    1. 定义任务

      const gulp = require('gulp')
      
      gulp.task('job', (cb) => {
        console.log('job')
        cb()
      })
      
    2. 执行 gulp 指令

      npx gulp job
      

    不具名任务

    1. 定义任务

      const gulp = require('gulp')
      
      gulp.task('default', (cb) => {
        console.log('default')
        cb()
      })
      
    2. 执行 gulp 指令

      npx gulp
      

    gulp4.0 之后

    具名任务

    1. 定义任务

      const job = (cb) => {
        console.log('job')
        cb() // 使用回调结束 task,不使用回调会导致报错 task not complete
      }
      
      module.exports = {
        job
      }
      
    2. 执行 gulp 指令

      npx gulp job
      

    不具名任务

    1. 定义任务

      const job = (cb) => {
        console.log('default')
        cb()
      }
      
      module.exports.default = job
      
    2. 执行 gulp 指令

      npx gulp
      

    注意:每个 gulp 任务都是一个异步 JavaScript 函数,任务结束需要满足以下任一条件:

    1. 任务函数可以接收一个 callback 作为参数,调用回调函数则任务结束。
    2. 任务函数返回 stream, promise, event emitter, child process 或 observable 类型的函数则任务结束。

gulp 执行多个任务

gulp 执行多个任务可以通过 gulp 内置 api 来进行任务组合执行,gulp 任务组合 api 有 series 和 parallel,两者均可以接收任意数量的任务函数或者组合后的任务组合。

  1. series

    串行任务组合。series() 接收的任务函数或者任务组合会按照串行执行,即同一时间只执行单个任务,当上一个任务完成再执行下一个任务。

    定义任务

    const { series, parallel } = require('gulp')
    
    const task1 = (cb) => {
      setTimeout(() => {
        console.log('task1')
        cb()
      }, 1000)
    }
    
    const task2 = (cb) => {
      setTimeout(() => {
        console.log('task2')
        cb()
      }, 1000)
    }
    
    const task3 = (cb) => {
      setTimeout(() => {
        console.log('task3')
        cb()
      }, 1000)
    }
    
    module.exports.default = series(task1, task2, task3)
    

    执行指令

    npx gulp
    

  1. parallel

    并行任务组合。parallel() 接收的任务函数和任务组合会按照并行执行,即同一时间执行多个 parallel 接收的任务。

    定义任务

    const { series, parallel } = require('gulp')
    
    const task1 = (cb) => {
      setTimeout(() => {
        console.log('task1')
        cb()
      }, 1000)
    }
    
    const task2 = (cb) => {
      setTimeout(() => {
        console.log('task2')
        cb()
      }, 1000)
    }
    
    const task3 = (cb) => {
      setTimeout(() => {
        console.log('task3')
        cb()
      }, 1000)
    }
    
    module.exports.default = parallel(task1, task2, task3)
    

    执行指令

    npx gulp
    

  1. series / parallel 复合

    定义任务

    const { series, parallel } = require('gulp')
    
    const task1 = (cb) => {
      setTimeout(() => {
        console.log('task1')
        cb()
      }, 1000)
    }
    
    const task2 = (cb) => {
      setTimeout(() => {
        console.log('task2')
        cb()
      }, 1000)
    }
    
    const task3 = (cb) => {
      setTimeout(() => {
        console.log('task3')
        cb()
      }, 1000)
    }
    
    const seriesTask = series(task1, task2, task3)
    
    const parallelTask = parallel(task1, task2, task3)
    
    const composeTask = series(seriesTask, parallelTask)
    
    module.exports.default = composeTask
    

    执行指令

    npx gulp
    

读取/写入文件

gulp 定义任务,执行任务都是在 gulp 配置文件中操作的。实际项目处理,gulpfile.js 读取外部文件,处理后返回并写入文件,因此,需要使用 gulp 读取和写入文件 api 来处理外部文件,gulp 读取、写入文件 api 分别为 src 和 dest。

  1. src

    src 接收文件路径作为参数,以 stream 的方式读取文件。单个文件路径以字符串形式接收,多个文件路径以数组方式接收。

    文件路径可以以正则形式进行匹配,至少有一个匹配,否则报错。

    匹配规则:

     1. `/src/*.js`
     
     	表示仅匹配 src 目录下的所有js,对于 /src/js/ 目录下的 js 是无法匹配的。
     
     2. `/src/**/*.js`
     
     	表示匹配 src 目录下的所有js,包含 /src/js/ 目录下的 js 。
     
     3. `[ '/src/**/*.js', '!script/' ]`
     
     	表示匹配 src 目录下的所有js,包含 /src/js/ 目录下的 js ,但不包含 /src/script/ 目录下的 js 。
    
  2. dest

    dest 接收输入目录作为参数,将 stream 写入到文件中。

  3. src/dest 使用

    文件结构

    main.js

    	const sum = (x, y) => {
      return x + y
    }
    
    const res = sum(x, y)
    console.log(res)
    

    gulpfile.js

    const { src, dest } = require('gulp')
    const babel = require('gulp-babel')
    const uglify = require('gulp-uglify')
    
    const job = (cb) => {
      return src('./src/*.js')
      .pipe(babel({ presets: ['@babel/preset-env'] }))
      .pipe(uglify())
      .pipe(dest('./dist/'))
    }
    
    module.exports.default = job
    

    安装 gulp 插件及依赖

    npm install -D gulp-babel @babel/core @babel/preset-env
    npm install -D gulp-uglify
    

    启动 gulp

    npx gulp
    

注意: src,dest读取和写入文件均是以 stream 流的方式进行的。

  1. pipe 顾名思义:管道,用于”运输“ stream 流,对 stream 流进行处理以后,传递给下一个pipe。
  2. gulp-babel 插件,用于 ES6 语法转换为 ES5。
  3. gulp-uglify 插件,用于压缩 js 文件。

监听文件

开发过程中,js 文件一旦发生修改,gulp 需要重新启动才能进行 stream 流的处理操作。gulp 提供了一个监听文件内容变化的 api ,用于监听文件,一旦内容变化,则原有任务会重新执行。监听文件变化的 api 是 watch 。

  1. watch

    watch 接收两个参数,一个是需要监听的文件路径,同样可以使用正则匹配;另一个是文件内容变化需要执行的任务或任务组合。

    gulpfile.js

    const { src, dest, watch } = require('gulp')
    const babel = require('gulp-babel')
    const uglify = require('gulp-uglify')
    
    const job = (cb) => {
      return src('./src/*.js')
      .pipe(babel({ presets: ['@babel/preset-env'] }))
      .pipe(uglify())
      .pipe(dest('./dist/'))
    }
    
    watch('./src/*.js', job)
    
    module.exports.default = job
    

项目简单配置案例

demo项目地址

gulpfile.js

const { series, parallel, src, dest, watch } = require('gulp')

const htmlMin = require('gulp-htmlmin')
const inject = require('gulp-inject')

const cssMin = require('gulp-cssmin')

const babel = require('gulp-babel')
const uglify = require('gulp-uglify')

const htmlTask = () => {
  return src('./src/index.html')
  .pipe(htmlMin({
    collapseWhitespace: true // 压缩 html
  }))
  .pipe(inject( 
    src([ './src/js/**/*.js', './src/css/**/*.css' ], { read: false }), 
    { relative: true } // 自动注入 js 和 css 
  ))
  .pipe(dest('./dist/'))
}

const cssTask = () => {
  return src('./src/css/**/*.css', { base: './src' })
  .pipe(cssMin()) // 压缩 css
  .pipe(dest('./dist/'))
}

const jsTask = () => {
  return src('./src/js/**/*.js', { base: './src' })
  .pipe(babel({ presets: ['@babel/preset-env'] })) // 编译 ES6 -> ES5
  .pipe(uglify()) // 压缩 js
  .pipe(dest('./dist/'))
}

const srcTask = series(htmlTask, cssTask, jsTask)

watch([ './src/js/**/*.js', './src/css/**/*.css' ], srcTask)

module.exports.default = srcTask

更多配置可以查看 gulp 插件配置

标签:src,const,cb,前端,js,gulp,任务,系统化
From: https://www.cnblogs.com/huangminghua/p/17144623.html

相关文章

  • 前端JS for-in和for-of的区别
    forin遍历对象,返回的是对象的key; 遍历数组/字符串,返回的是数组的下标forof只能遍历的是数组遍历数组对象,返回单个对象;遍历数组元素/字符串,返回单个元素举例......
  • 前端如何给bearer token传值
    Bearertoken是一种常见的身份验证机制,通常用于WebAPI和其他Web服务。在前端中,Bearertoken通常是通过HTTP头(HTTPheader)发送的,具体来说是通过"Authorization"头。在使用......
  • 前端是做什么?发展前景如何?
    1前端这个岗位是干嘛的用户能看到的地方,比如在小红书你现在查看的这个界面就是前端做出来的。前端负责内容展示、人机交互。除了网站,广义上App、小程序也属于前端。前端......
  • 直播平台软件开发,前端实现登录拼图验证
    直播平台软件开发,前端实现登录拼图验证搭建框架我们要实现这个功能,我们需要先搭建出来一个框架。 //css <style>  .check{      width:400px; ......
  • 「趣学前端」Taro迁移完成之后,总结了一些踩坑经验
    背景四月份的时候,尝试将老的移动端项目改造成多端。因为老项目使用的React框架,综合考量,保障当前业务开发的进度同时,进行项目迁移,所以最后选择了Taro框架。迁移成本会低一些,......
  • 开发日志01-后端以文件流的形式供前端下载
    需求:本地有一个生成sql脚本的文档,预留了很多类似{{xxx}}需要替换的地方。该需求是需要前端传入响应的值替换掉模板中预留的需要被替换的位置最后通过Post请求返......
  • 前端分页代码示例
    teacher.jsimportrequestfrom'@/utils/request'exportdefault{//1讲师列表(条件查询)getTeacherList(query){returnrequest({ur......
  • 记住这12个要点,你也能打造出让HR和技术主管前一亮的前端简历
     第一篇章:吸引HR如果你想在众多简历中脱颖而出,需要注意以下几点: 1、突出你的亮点:给你的简历一个吸引人的文件命名和头部,突出你的关键技能和经验。2、采用简洁......
  • 碎片化学习前端之webpack(plugin)
    Plugin原理Plugin的作用通过插件我们可以扩展webpack,加入自定义的构建行为,使webpack可以执行更广泛的任务,拥有更强的构建能力。Plugin工作原理webpack就像一条......
  • 系统化学习前端之webpack篇(02)
    webpack高级配置Webpack发展至今,除了编译资源外,还拓展了许多loader和plugin来辅助提升项目性能。写在前面webpack功能之强大,令吾等为之惊叹,欢迎挖宝。提升开发......