web前端-Gulp入门

web前端-Gulp入门

  • gulp的概述
  • 使用gulp
    • 准备工作
    • gulp的常用API
    • gulp的常用插件
    • gulpfile.js的初体验
    • 打包css文件
    • 打包scss文件
    • 打包js
    • 打包html
    • 打包images
    • 创建一个默认任务
    • 创建一个删除任务
    • gulp启动服务
    • 创建一个监控任务

gulp的概述

gulp: 前端自动化打包固件工具, gulp是基于流格式的一种打包构建工具,依赖node环境进行开发, 底层封装的内容就是node里面的读写文件。

什么是流?

  • 流文件: 流
    • 一种文件传输的格式
    • 一段一段的文件传输
  • 流格式: 流
    • 从头到尾的一个过程
    • 需要从 源 开始一步一步经过加工,每一个步骤都需要依赖上一步的结果,最终给出一个完成的成品。

gulp的安装

  • 是一个JavaScript相关的工具
  • 就是可以直接使用npm 进行安装
  • 需要安装在你的电脑环境里面, 一次安装多次使用
  • 打开终端,输入指令:npm install --global gulp

gulp的版本:

  • gulp@3 : 安装成功检测版本号,gulp 3.9.1
  • gulp@4: 安装成功检测版本号, gulp cli 2.3.0
  • 检查gulp是否安装成功:gulp -v / gulp --version

gulp的卸载:

  • gulp uninstall --global gulp

使用gulp

准备工作

  • 准备一个项目, 假如的项目有如下结构:
    在这里插入图片描述
  • 准备一个gulpfile.js的文件(必须有
    • gulp进行打包的依据
    • 每一个项目需要一个gulpfile.js
    • 我们在这个文件里面进行本项目的打包配置
    • gulp在 运行的时候,会自动读取 gulpfile.js 文件里面的配置
    • 按照你在 gulpfile.js 文件里面的配置进行打包工作
    • 注意: 直接写在项目跟目录, 和src同级

我们这里可以打印下gulp, 看看gulp中含有什么?
在这里插入图片描述

gulp的常用API

  • gulp.task() : 创建一个基于流的任务
    • 语法: gulp.task(任务名称, 任务处理函数)
    • 例子:gulp.task('htmlHandler', function () { 找到html文件,进行压缩,打包,放入指定目录 })
  • gulp.src(): 找到源文件
    • 语法 : gulp.src(任务名称,任务处理函数)
    • gulp.scr('./a/b.html') : 找到一个指定的文件
    • gulp.scr('./a/*.html') : 找到指定目录下,指定后缀的文件
    • gulp.scr('./a/b/**') : 找到指定目录下的所有文件
    • gulp.scr('./a/**/*') : 找到a目录下所有子项目里面的所有文件
    • gulp.scr('./a/**/*.html') : 找到a目录下所有子目录里面的所有.html文件
  • gulp.dest(): 把一个内容放入指定目录内
    • 语法: gulp.dest(路径信息)
    • 例子:gulp.dest(./abc):把接受的内容方法abc目录下
  • gulp.watch(): 监控指定项目目录下的文件, 一旦发生变化,从新执行后面的任务
    • 语法:gulp.wtach(路径信息, 任务名称)
    • 例子:gulp.watch(./src/pages/*.html, htmlhandle):当指定目录下面的html文件发生变化,就会执行htmlhandle这个任务。
  • gulp.series(): 逐渐执行多个任务,前一个任务结束,第二个任务开始
    • 语法: gulp.series(任务1, 任务2, 任务3,…)
  • gulp.parallel(): 并行开始多个任务
    • 语法: gulp.paraller(任务1, 任务2, 任务3,…)
  • pire(): 管道函数,所有gulp的API都是基于流,接受当前流,进入下一个流过程的管道函数
    • 例子: gulp.src().pipe(压缩任务).pire(转码).pire(gulp.dest('abc'))

gulp的常用插件

gulp的各种插件就是用来执行各种各样的压缩混淆转码任务的

  • gulp-cssmin
    • 下载: npm install gulp-cssmin -D
    • 导入: const cssmin = require(‘gulp-cssmin’)
    • 导入以后得到一个处理流文件的函数
    • 直接在管道函数里面执行就好了
  • gulp-autoprefixer
    • 下载: npm install gulp-autoprefixer -D
    • 导入 :
    • 导入以后得到一个处理流文件的函数
    • 直接在管道函数里面使用,需要传递参数:{ browsers: [要兼容的浏览器] }

gulpfile.js的初体验

执行一个gulp配置好的任务, 直接在终端,切换到gulpfile.js所在的目录, 执行命令 gulp 任务名称

  • gulp3的标注写法:
const gulp = require('gulp')

//1.导入gulp-cssmin
const cssmin = require('gulp-cssmin')

// 1.创建一个打包css的任务
gulp.task('cssHandler', function () {
  // 需要捕获到该任务的结束,需要把这个流retur出去, task就会处理流
  return gulp
  .src('./src/css/*.css')
  .pipe(cssmin())
  .pipe(gulp.dest('./dist/css/'))
})

如果不加上面的return,也可以执行得到结果,但是会报如下的警告, 把流return出去就不会有警告了。
在这里插入图片描述

  • gulp4的标准写法:
// gulp4的写法
const cssHandler = function () {
    return gulp
      .src('./src/css/*.css')
      .pipe(cssmin())
      .pipe(gulp.dest('./dist/css/'))
}
module.exports.cssHandler = cssHandler

在这里插入图片描述

打包css文件

//1. 导入gulp
const gulp = require('gulp');

//导入gulp-cssmin
const cssmin = require('gulp-cssmin')

// 导入 gulp-autoprefixer
const autoprefixer = require('gulp-autoprefixer')

// 创建打包css的任务函数
const cssHandler = function () {
  return gulp
      .src('./src/css/*.css') // 找到内容
      .pipe(autoprefixer(['last 2 versions'])) // 自动添加前缀 可以配置需要兼容的属性
      .pipe(cssmin()) // 压缩
      .pipe(gulp.dest('./dist/css/')) // 放到指定目录
}
// 导出
module.exports.cssHandler = cssHandler

我们除了在autoprefixer函数中配置需要兼容的属性除外, 还可以再package.json文件中配置(推荐
在这里插入图片描述在这里插入图片描述

打包scss文件

gulp-sass : 把sass转换成css的库

  • 下载: npm i gulp-sass -D
  • gulp-sass现在不在自带默认的 sass编辑器了, 需要我们自行下载, 我们可以直接使用npm安装下相关sass编辑器,npm i -D sass 或则 npm i -D node-sass,下载完成之后再编译。

如果没有下载上述两种sass编辑器种的一种, 会报如下错误:
在这里插入图片描述

//导入gulp-cssmin
const cssmin = require('gulp-cssmin')

// 导入 gulp-autoprefixer
const autoprefixer = require('gulp-autoprefixer')

// 导入gulp-sass
const sass = require('gulp-sass')(require('node-sass'))

// 创建一个打包sass的文件
const sassHandler = function () {
  return gulp
    .src('./src/sass/*.scss')
    .pipe(sass())
    .pipe(autoprefixer())
    .pipe(cssmin())
    .pipe(gulp.dest('./dist/sass/'))
}
// 到处打包sass的函数
module.exports.sassHandler = sassHandler

打包js

  • gulp-uglify: 压缩JS文件的插件
    • 下载:npm i -D gulp-uglify
    • 导入之后得到一个可以处理流文件的函数,直接在管道函数中使用了
    • 注意:你不能写ES6的语法,一旦有了ES6的语法就会报错
  • gulp-babel: 专门进行ES6转ES5的插件
    • gulp-babel的版本:
      • gulp-banel@7:大部分使用再gulp@3 里面
      • gulp-babel@8: 大部分使用再gulp@4 里面
    • 下载:
      • gulp-babel需要依赖另外两个包,我们要一起下载
      • 另外两个包: @babel/core @babel/preset-env
    • 导入:
      • 只需要导入一个包就可以了,它会自动导入另外两个包
      • const babel = requeire('gulp-babel')
    • 导入后得到一个可以处理流文件的函数,直接在管道函数内部使用,需要传递参数
//1. 导入gulp
const gulp = require('gulp');

// 导入gulp-uglify插件
const uglify = require('gulp-uglify')

// 导入babel 插件
const babel = require('gulp-babel')

// 创建一个大包js的任务函数
const jsHandler = function () {
  return gulp
    .src('./src/js/*.js') // 找到js文件
    .pipe(babel({
      // babel@7, preset:['es2015']
      presets: ["@babel/env"]
    })) // ES6 转 ES5
    .pipe(uglify()) // 压缩js文件
    .pipe(gulp.dest('./dist/js/'))
}

// 导出JS的打包函数
module.exports.jsHandler = jsHandler

打包html

  • gump-htmlmin: 压缩html文件的插件
    • 下载:npm i -D gulp-htmlmin
    • 导入以后得到一个可以流文件的函数,直接再管道函数里面调用,需要传递参数
//1. 导入gulp
const gulp = require('gulp');

// 导入gulp-htmlmin插件
const htmlmin = require('gulp-htmlmin')

// 创建一个打包html的任务函数
const htmlHandler = function () {
  return gulp
    .src('./src/pasge/*.html')
    .pipe(htmlmin({
      // 通过你配置的参数来压缩html文件
      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/pasge/'))
}

// 导出html的打包函数
module.exports.htmlHandler = htmlHandler

打包images

在开发环境中,我们一般不对图片做压缩处理, 直接移动到新的位置即可

//1. 导入gulp
const gulp = require('gulp');

// 创建一个打包images的任务函数
const imagesHandler = function () {
  return gulp
    .src('./src/images/**')
    .pipe(gulp.dest('./dist/images/'))
}

// 导出打包html的打包函数
module.exports.imagesHandler = imagesHandlers

创建一个默认任务

  • 配置一个默认任务
    • 默认任务的作用就是把所有的任务给我一起执行了
    • gulp.series/gulp.parallel(), 这两个方法返回一个函数,返回值可以直接当做任务函数使用,使用task的方式创建一个default任务
    • 默认任务为什么一定要叫做default, 因为你使用gulp指令的时候,应该是gulp 任务名称,当你有一个叫做default的任务的时候, 你可以直接执行指令gulp,它会自动去指定你的gulpfile.js文件中的default任务

在这里插入图片描述

创建一个删除任务

当我们修改文件之后,在次执行gulp任务的时候,是不会进行文件夹的清理的,在这种情况下可能会存在一些无用的文件,所以当我们修改文件重新打包之前,我们应该删除之前的旧的打包文件,然后再重新生成新的打包文件。

  • del: 删除文件目录, 导入之后得到一个函数,直接使用传递参数就可以了 。
    • 注意:del最新版本7.0.0不支持require导入方式支持, 可以降低版本到6.0.0
// 创建一个删除dist任务
const delHandle = function () {
  // del 直接执行就可以了, 不需要流
  // 参数以数组的形式传递你要删除的文件夹
  return del('./dist/')
}

module.exports.default = gulp.series(
  delHandle,
  gulp.parallel(cssHandler, sassHandler, jsHandler, htmlHandler,imagesHandler)
)

gulp启动服务

  • 利用gulp启动一个服务
    • gulp 是基于node环境的工具
    • node 就是可以做服务器的语言
    • gulp 可以启动一个基于node的服务器
  • gulp-webserver: 启动一个基于node书写的服务器
    • 下载: npm i -D gulp-webserver
    • 导入以后得到一个处理流文件的函数,我们在管道函数内调用就可以了,需要传递参数
// 创建一个启动服务器的任务
const webHandler = function () {
  return gulp 
    .src('./dist')
    .pipe(webserver({
      open: './pasge/index.html', // 默认打开哪一个文件(从dist目录以后的目录开始)
       livereload: true, // 当文件修改的时候自动刷新页面
      proxies:[ // 配置你的所有代理, 每一个代理都是一个对象数据类型
      // 注意: 如果没有代理,不要写空对象
      // 如果你想使用代理,必须要是在gulp-webserver启动的服务器上
        {
          source: '', // 代理标识符
          target: '', // 代理目标地址
        }
      ]
    }))
}

module.exports.default = gulp.series(
  delHandle,
  gulp.parallel(cssHandler, sassHandler, jsHandler, htmlHandler,imagesHandler),
  webHandler
)

创建一个监控任务

我们每次修改代码之后,都需要从新启动, 这样造成开发非常的不方便。 所以我们需要创建一个监控任务
在这里插入图片描述
上述例子是当你修改css文件时,watch监控到css文件的改变, 会执行cssHandler函数, 然后更新页面。 根据需要可以添加其他的监听

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

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

相关文章

Ansible playbook详解

playbook是ansible用于配置,部署,和被管理被控节点的剧本 playbook常用的YMAL格式:(文件名称以 .yml结尾) 1、文件的第一行应该以 "---" (三个连字符)开始,表明YMAL文件的开始。    2、在同一…

IIC子系统测温湿度

采用stm32MP157AAA芯片,温度传感器 si7006 0x40 1、在内核空间不支持浮点数进行打印,所以需要将读取到的数据拷贝到用户空间,执行用户程序打印 2、在probe函数中 分步注册字符设备驱动自动创建设备节点 3、在i2c驱动代码中,需要自…

通用的链栈实现(C++)

template<class T> class MyStack//链栈 { private:struct StackNode{T data;StackNode* next;StackNode(const T& val T(), StackNode* p nullptr) :data(val), next(p) {}//};StackNode* top;int cursize;void clone(const MyStack& s){Clear();cursize s.c…

cgo与调用c的回调函数指针

cgo直接调用函数&#xff0c;使用基本数据类型非常简单&#xff0c;包括一些结构体也比较简单&#xff0c;嵌套的稍微复杂些&#xff0c;但也可以&#xff0c;但有的时候&#xff0c;cgo调用c函数&#xff0c;会需要传递一个回调函数的指针&#xff0c;这时候就比较复杂了&…

office365 outlook邮件无法删除

是否遇到过&#xff0c;office365邮件存储满了&#xff0c;删除邮件无法删除&#xff0c;即便用web方式登录到outlook&#xff0c;删除邮件当时是成功的&#xff0c;但一会儿就回滚回来了&#xff0c;已删除的邮件&#xff0c;你想清空&#xff0c;最后清理后还是回到原样。 请…

YTM32的循环冗余校验CRC外设模块详解

YTM32的循环冗余校验CRC外设模块详解 文章目录 YTM32的循环冗余校验CRC外设模块详解引言原理与机制CRC算法简介从CRC算法到CRC硬件外设 应用要点&#xff08;软件&#xff09;CRC16 用例CRC32 用例 总结参考文献 引言 在串行通信帧中&#xff0c;为了保证数据在传输过程中的完…

基于Python优化图片亮度与噪点

支持添加噪点类型包括&#xff1a;添加高斯噪点、添加椒盐噪点、添加波动噪点、添加泊松噪点、添加周期性噪点、添加斑点噪点、添加相位噪点&#xff0c;还提供清除噪点的功能。 我们先看一下实测效果&#xff1a;&#xff08;test.jpg为原图&#xff0c;new.jpg为添加后的图片…

自动化测试的成本高效果差,那么自动化测试的意义在哪呢?

一、自动化测试的成本高效果差&#xff0c;那么自动化测试的意义在哪呢&#xff1f; 我觉得这个问题带有很强的误导性&#xff0c;是典型的逻辑陷阱之一。“自动化测试的成本高效果差”是真的吗&#xff1f;当然不是。而且我始终相信&#xff0c;回答问题的最好方式是把问题本身…

达索系统3DEXPERIENCE WORKS 2024流体仿真功能增强

设计工作中&#xff0c;网格划分和设计验证十分重要&#xff0c;它可以方便我们把复杂组件简单化处理&#xff0c;从而提升工作效率。 轻松应对&#xff0c;精准划分 在优化设计以获得更好的空气动力学性能时&#xff0c;需要了解空气在其周围产生的流动方式。达索系统3DEXPE…

(论文阅读29/100 人体姿态估计)

29.文献阅读笔记 简介 题目 DeepCut: Joint Subset Partition and Labeling for Multi Person Pose Estimation 作者 Leonid Pishchulin, Eldar Insafutdinov, Siyu Tang, Bjoern Andres, Mykhaylo Andriluka, Peter Gehler, and Bernt Schiele, CVPR, 2016. 原文链接 h…

STM32 X-CUBE-AI:Pytorch模型部署全流程

文章目录 概要版本&#xff1a;参考资料STM32CUBEAI安装CUBEAI模型支持LSTM模型转换注意事项模型转换模型应用1 错误类型及代码2 模型创建和初始化3 获取输入输出数据变量4 获取模型前馈输出模型应用小结 小结 概要 STM32 CUBE MX扩展包&#xff1a;X-CUBE-AI部署流程&#xf…

Accelerate 0.24.0文档 一:两万字极速入门

文章目录 一、概述1.1 PyTorch DDP1.2 Accelerate 分布式训练简介1.2.1 实例化Accelerator类1.2.2 将所有训练相关 PyTorch 对象传递给 prepare()方法1.2.3 启用 accelerator.backward(loss) 1.3 Accelerate 分布式评估1.4 accelerate launch1.4.1 使用accelerate launch启动训…

k8s集群搭建(ubuntu 20.04 + k8s 1.28.3 + calico + containerd1.7.8)

环境&需求 服务器&#xff1a; 10.235.165.21 k8s-master 10.235.165.22 k8s-slave1 10.235.165.23 k8s-slave2OS版本&#xff1a; rootvms131:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.5 LTS Release: …

Java自学第11课:电商项目(4)重新建立项目

经过前几节的学习&#xff0c;我们已经找到之前碰到的问题的原因了。那么下面接着做项目学习。 1 新建dynamic web project 建立时把web.xml也生成下&#xff0c;省的右面再添加。 会询问是否改为java ee环境&#xff1f;no就行&#xff0c;其实改过来也是可以的。这个不重要。…

css3 初步了解

1、css3的含义及简介 简而言之&#xff0c;css3 就是 css的最新标准&#xff0c;使用css3都要遵循这个标准&#xff0c;CSS3 已完全向后兼容&#xff0c;所以你就不必改变现有的设计&#xff0c; 2、一些比较重要的css3 模块 选择器 1、标签选择器&#xff0c;也称为元素选择…

滚珠螺杆在注塑机械手中起什么作用?

注塑机械手的配件中滚珠螺杆是重要的一环&#xff0c;在注塑机械手中起着重要的作用。注塑机械手是一种自动化设备&#xff0c;可以在注塑生产中实现自动化操作&#xff0c;而滚珠螺杆则是实现这一操作的关键部件之一。 滚珠螺杆是一种将旋转运动转化为直线运动的精密传动部件&…

在Linux系统下微调Llama2(MetaAI)大模型教程—Qlora

Llama2是Meta最新开源的语言大模型&#xff0c;训练数据集2万亿token&#xff0c;上下文长度是由Llama的2048扩展到4096&#xff0c;可以理解和生成更长的文本&#xff0c;包括7B、13B和70B三个模型&#xff0c;在各种基准集的测试上表现突出&#xff0c;最重要的是&#xff0c…

【Linux网络】本地DNS服务器搭建

目录 一、什么是DNS&#xff0c;相关介绍 1、dns是什么&#xff1a; 2、域名的分类&#xff1a; 3、服务器的类型 二、DNS解析的过程 三、DNS的相关配置文件学习 1、本地主机有关的DNS文件学习 2、本地的DNS缓存服务器的文件 3、bind软件的相关配置文件&#xff1a; 4…

Jmeter执行接口自动化测试-如何初始化清空旧数据

需求分析&#xff1a; 每次执行完自动化测试&#xff0c;我们不会执行删除接口把数据删除&#xff0c;而需要留着手工测试&#xff0c;此时会导致下次执行测试有旧数据我们手工可能也会新增数据&#xff0c;导致下次执行自动化测试有旧数据 下面介绍两种清空数据的方法 一、通…