前端 Gulp 详细介绍与案例使用

news/2024/5/4 3:50:28/文章来源:https://blog.csdn.net/zz00008888/article/details/129717179

一、简介

  • 前端常见打包构建工具:gulpwebpack

    • gulp 是基于 的打包构建工具。webpack 是基于 js 文件的打包构建工具。
  • 什么是

    • 流文件:一种文件传输的格式,一段一段的文件传输,全部下载完成后再转换成指定文件格式,例如视频、音频、压缩包下载。

    • 流格式:从头到尾的一个过程,从 开始一步一步,每一个步骤都需要依赖上一步的结果,最终给出一个完成的成品。

    gulp 是基于 格式的一种打包构建工具。

  • 依赖环境

    • 依赖与 node 环境进行开发

    • 底层封装的内容主要用到了 node 里面的文件读写(httpfs

  • 作用

    • 对于 css 文件可以进行 压缩,转码(自动添加前缀)(例如:scss -》css -》添加前缀 -》压缩 ....) 。

    • 对于 js 文件可以进行 压缩,转码(ES6 转 ES5)

    • 对于 html 文件可以进行 压缩,转码(对格式的转换)

    • 对于 静态资源文件 的处理,对于 第三方文件 的处理 …

二、安装

  • gulp 使用的主流版本分为 gulp@3.xgulp@4.x,本篇使用 4.x 版本。

  • 安装

    # 正常安装
    $ npm i gulp -g# 如果 mac 有权限限制的话,用这个
    $ sudo npm i gulp -g# 单个项目安装
    $ npm i gulp -D
    

    后续 gulp 的插件(用于压缩 cssjs 等任务要用到的)都安装到 devDependencies

  • 检查是否安装成功(4.x 输出的是 cli 版本号,3.x 输出的是 gulp 3.9.0 版本号)

    $ gulp -v
    CLI version: 2.3.0
    Local version: Unknown
    
  • 运行指令(下面案例中体现使用场景)

    $ gulp xxx
    
  • 创建一个 gulpfile.js 文件,这个是 gulp 配置文件,后续的执行任务都写在这个配置文件中,gulp 会执行一遍配置中的任务。

三、常用 API

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(任务1, 任务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')=> 导入以后得到一个处理流文件的函数=> 直接再管道函数里面执行就好了2. gulp-autoprefixer=> 下载: npm i gulp-autoprefixer -D=> 导入: const autoPrefixer = require('gulp-autoprefixer')=> 导入以后得到一个处理流文件的函数=> 直接再管道函数里面使用, 需要传递参数-> { browsers: [要兼容的浏览器] }3. gulp-sass=> 下载: npm i gulp-sass -D-> 很容易报错, 基本下载不成功-> 为什么: 因为 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 的时候会使用-> 过程1. $ set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/2. $ npm i node-sass -D3. $ npm i gulp-sass -D=> 导入: const sass = require('gulp-sass')=> 导入以后得到一个可以处理流文件的函数, 直接再管道函数里面执行就可以了4. gulp-uglify=>JS 文件压缩的=> 下载: npm i -D gulp-uglify=> 导入: const uglify = require('gulp-uglify')=> 导入以后得到一个可以处理流文件的函数=> 直接再管道函数中使用就可以了=> 注意: 你不能写 ES6 语法, 一旦有了 ES6 语法就会报错5. gulp-babel=> 专门进行 ES6ES5 的插件=> gulp-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=> 作用: 删除文件目录=> 导入: const del = require('del')=> 导入以后得到一个函数, 直接使用传递参数就可以了8. gulp-webserver=> 作用: 启动一个基于 node 书写的服务器=> 下载: npm i -D gulp-webserver=> 导入: const webserver = require('gulp-webserver')=> 导入以后得到一个处理流文件的函数=> 在管道函数内调用就可以了, 需要传递参数9. gulp-file-include=> 作用: 再一个 html 页面里面导入一个 html 片段=> 下载: npm i -D gulp-file-include=> 导入: const fileInclude = require('gulp-file-include')=> 导入以后得到一个处理流文件的函数=> 在管道函数内调用就可以了, 需要传递参数

三、案例需求

  • 打包自己的项目

    1、要确定好自己的目录结构

    2、要分开源码和打包后的内容

    例如:打包 pages/index.html 代码,打包完毕放在哪?

    同级目录下,再次创建叫做 pages 的文件夹?不行,因为不能创建同名文件夹。

    同级目录下,创建叫做 views 的文件夹?不行,因为页面中的资源路径会找不到,路径变了。

    必须要保证打爆前后的目录接口一致,这样才不会导致资源文件路径找不到等问题:

    • 创建一个叫做 src 的目录(表示源码)

    • 创建一个叫做 dist 的目录(存放打包后的文件)

  • 案例项目结构

    - my_project    项目- dist        打包文件(没有会自行创建,每次打包会删除在重新创建)- src         源码+ pages     html+ css       css+ js        js+ sass      sass(需要将 sass 转成 css 进行使用)+ images    图片+ videos    视频+ audios    音频+ lib       第三方文件+ fonts     字体图标文件
    
  • 案例项目 gulpfile.js 配置

    // gulp 配置文件
    // 0. 导入第三方
    // 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-webserver
    const webserver = require('gulp-webserver')
    // 0-10. 导入 gulp-file-include
    const fileInclude = require('gulp-file-include')// 1. 创建任务
    // 1-1. 创建一个打包 css 的任务
    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({ // 根据你的配置导入对应的 html 片段,也就是组件//   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 标签上默认的 type 属性})).pipe(gulp.dest('./dist/pages/'))
    }// 1-5. 创建一个打包 images 文件的任务
    const imgHandler = function () {return gulp.src('./src/images/**').pipe(gulp.dest('./dist/images/'))
    }// 1-6. 创建一个打包 videos 文件的任务
    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: 'www.gx.com', // 域名(可以配置自定义域名)port: '8080', // 端口号livereload: true, // 当文件修改的时候, 是否自动刷新页面open: './pages/login.html', // 默认打开哪一个文件(从 dist 目录以后的目录开始书写)proxies: [ // 配置你的所有代理// 每一个代理就是一个对象数据类型// 注意: 如果你没有代理, 不要写空对象{// 代理标识符source: '/dzm1',// 代理目标地址target: 'https://www.dzm.com/api/'},{source: '/dzm2',target: 'https://www.xyq.com/api/'},{source: '/dzm3',target: 'https://www.xxx.com/api/'}]}))
    }// 1-12. 创建一个监控任务
    const watchHandler = function () {// 使用 gulp.watch()gulp.watch('./src/sass/*.scss', sassHandler)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, sassHandler, jsHandler, htmlHandler, imgHandler, videoHandler, audioHandler, libHandler, fontHandler)// 配置一个默认任务
    // 这个是完整的流程:1、删除dist 2、创建压缩到dist 3、启用本地代理(也可以使用 nginx 代替)4、热更新监听文件变化进行编译
    module.exports.default = gulp.series(delHandler,gulp.parallel(cssHandler, sassHandler, jsHandler, htmlHandler, imgHandler, videoHandler, audioHandler, libHandler, fontHandler),webHandler,watchHandler
    )
    
  • 组件使用案例,不清楚可自行查查。

    image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_274798.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试入门

一、在什么情况下做自动化测试,为什么做自动化测试 刚刚做测试的时候,对于在什么情况下做自动化测试只局限功能比较固定,需求变化不是很频繁且项目周期比较长的时候考虑做自动化测试。但是为什么要做自动化测试呢,具体有什么好处呢…

ASEMI代理FS32K142HAT0MLLT原装现货NXP车规级FS32K142HAT0MLLT

编辑:ll ASEMI代理FS32K142HAT0MLLT原装现货NXP车规级FS32K142HAT0MLLT 型号:FS32K142HAT0MLLT 品牌:NXP /恩智浦 封装:LQFP-100 批号:2023 安装类型:表面贴装型 引脚数量:100 类型&…

3.4.2数据库系统-逻辑结构设计:逻辑结构设计流程、关系模式转换

3.4.2数据库系统-逻辑结构设计:逻辑结构设计流程、关系模式转换逻辑结构设计流程关系模式转换逻辑结构设计流程 ER图向关系模式的转换: 实体向关系模式的转换联系向关系模式的转换 关系模式的泛化: 这个后面再说,内容比较多 确…

LLVM PASS pwn

LLVM LLVM的核心是一个库,其设计了一种通用的LLVM IR,并提供一系列接口来操作LLVM IR,生成目标平台代码等等后端的功能. LLVM Pass就是遍历传入的IR并进行一些处理,在实现上,LLVM的核心库中存在一些Pass类,通过继承这些类并重载一些方法,就可以方便的处理传入的IR. LLVM Pas…

关于OpenResty+doujiang24/lua-resty-kafka写入kafka故障转移模拟测试

关于OpenRestydoujiang24/lua-resty-kafka写入kafka故障转移模拟测试 PS:文章中用到的ip和代码已脱敏 1. 环境 请查看这篇文章https://editor.csdn.net/md/?articleId122735525 2. 配置 kafka地址: kafka_broker_list{{host"193.168.1.2"…

电子拣货标签10代系统简介

CK_Label_v10一、产品参数 1. 外接供电版 产品型号 CK_Label_v10 尺寸 0.8寸/位 屏幕显示 数码管显示(3位数) 数码管颜色 红色 显示内容 0-999 外观尺寸 114.5x44.5x19mm 外观颜色 蓝色 按键 4 指示灯 1 RGB 灯 灯光颜色 7种(红/绿…

GPU推理服务性能优化之路 | 得物技术

1背景 随着CV算法在业务场景中使用越来越多,给我们带来了新的挑战,需要提升Python推理服务的性能以降低生产环境成本。为此我们深入去研究Python GPU推理服务的工作原理,推理模型优化的方法。最终通过两项关键的技术: 1.Python的GPU与CPU进程…

最佳实践| 探索 Authing 企业级云原生权限治理平台

在现代企业中,数据已经成为最重要的资产之一。 有数据显示,全球大约有一半的组织在过去的一年中经历了至少一次成功的网络攻击事件,其中,39% 的攻击事件是由内部人员造成的。为了保护企业的数据和信息资产,许多政府和…

Linux应用开发之文件与IO流

与大多数操作系统一样,Linux为程序运行提供了大量的服务,包括打开文件、读文件、启动一个新程序、分配存储区以及获得当前时间等,这些服务被称为系统调用接口(system call interface)。另外,glibc库还提供了…

移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 示例 2: 输入&#xff…

使用IDEA把项目上传到gitee仓库

使用IDEA把项目上传到gitee仓库在gitee上建立一个仓库第一步(新建仓库)第二步(点击创建)第三步(复制仓库地址)创建工程第一步(选择工程所在文件夹)第二步(文件加入git&am…

qq怎么安装不了(QQ怎么都安装不上重装也不行,是哪里出了问题?)

qq怎么安装不了(QQ怎么都安装不上重装也不行,是哪里出了问题?) 一、发现问题 今天有朋友说他电脑怎么都装不上QQ,总是弹出“安装包可能被非法改动导致安装失败,请从官网下载最新安装包重新安装”,操作系统是XP&#…

[数据结构高频面试题]用两个栈实现队列详解

文章目录 一、栈实现队列的特点分析 1、1 具体分析 1、2 整体概括 二、用栈模拟队列代码的实现 2、1 手撕 栈 代码 2、1、1 stack.h 2、1、2 stack.c 2、2 用栈实现队列代码 🙋‍♂️ 作者:Ggggggtm 🙋‍♂️ 👀 专栏:…

Flink- 物理分区、Sink输出

物理分区 随机分区(shuffle) 轮询分区(Round-Robin) 重缩放分区(rescale) 广播(broadcast) 全局分区(global) 自定义分区(Custom) …

Studio One6中文语言版DAW数字音频音乐创作软件

Studio One6是一款非常实用的数字音乐创作软件,专门用于创作现代化音乐,软件具有简洁的界面和强大的功能,能够很好地辅助用户创作音乐。顾名思义就是“一个工作室”的意思,它所倡导的制作理念是直接在一个制作软件里完成音乐制作的…

Android 解包payload.bin文件,获取system.img

解析payload.bin获取.img文件 payload.bin payload.bin是Android OTA镜像打包文件,将包括system.img、boot.img和lk.img等在内的Android系统进行,打包为一个payload.bin文件。 在系统OTA过程中,系统会自动解压安装。 前期准备 需要安装py…

学习Java日志框架之——搞懂日志门面(JCL+SLF4J)

文章目录一、什么是日志门面1、门面模式(外观模式)2、日志门面二、了解JCL1、JCL组件结构2、JCL案例(1)JCL默认实现(2)导入log4j测试原有程序三、SLF4J简介四、SLF4J基本使用1、入门案例2、动态打印信息3、…

一次内存泄露排查

前因: 因为测试 长时间压测导致 接口反应越来越慢,甚至 导致服务器 崩溃 排查过程 1、top 查看是 哪个进程 占用 内存过高 2、根据 进程 id 去查找 具体是哪个 程序的问题 ps -ef| grep 41356 可以看到 具体的 容器位置 排查该进程 对象存活 状态…

23年PMP考试会使用第七版教材吗?

大家都知道了,今年的考纲是改版了的,为啥要改版呢,因为《PMBOK指南》更新到第七版了,考纲自然也要更新,据PMI的市场调查,近年来,项目管理行业新趋势在第六版和旧考纲中未收纳,为了确…

三、数据链路层

(一)纠错与检错1、奇偶校验码(再研究下,原理知道,具体过程无法重现)分为奇校验和偶校验,奇偶校验位在首部或尾部,奇偶校验满信息位奇偶校验位(1)原理&#xf…