Gulp入门使用(一)

2023-11-15

Gulp的简介

gulp,英文的意思是吞咽 (英 [gʌlp]) ( 美 [ɡʌlp] ),具体读啥大家自己看音标。
Gulp 是一个自动化工具,前端开发者可以使用它来处理常见任务:

  • 搭建web服务器
  • 文件保存时自动重载浏览器
  • 使用预处理器如Sass、Less
  • 优化资源,比如压缩CSS、JavaScript、压缩图片

以上应该是所有的主流打包,构建工具都支持的功能。

当然Gulp能做的远不止这些。如果你够疯狂,你甚至可以使用它搭建一个静态页面生成器。

基于本人水平的限制,这篇博客的目的是帮助大家了解Gulp的基础用法,让大家能看懂gulp的配置。

为什么是Gulp?

类似Gulp的工具,我们通常称之为构建工具。如今最流行的两个构建工具是Gulp和Grunt,以及后起之秀Webpack,这么说其实不是很准确,Webpack 是一个模块打包工具。它将一堆文件中的每个文件都作为一个模块,找出他们的依赖关系,将它们打包为可部署的静态资源。
官方对webpack的定位是模块打包器,而gulp/grunt属于构建工具。他们功能是有重叠的地方,但从本质上来讲不是一种东西。
说回来,为什么是Gulp,效率的东西先不谈,单说难易程度,gulp的配置文件更加的简洁,配置的写法逻辑对前端工作人员更加的友好。而且基于unix的pipe思想,在编写构建任务代码让人感觉非常舒服的,更利于开发人员的维护和阅读。

安装Gulp

安装Gulp之前你需要先安装Node.js。
安装完Node.js,使用cmd,用下面命令安装Gulp

npm install gulp -g

-g表示全局安装,这样你在电脑上任何位置都能只用gulp 命令。

下面我带大家从头到尾创建一个基于gulp的项目。

创建Gulp项目

首先,我们新建一个project文件夹,并在该目录下执行

npm init

npm init命令会为你创建一个package.json文件,这个文件保存着这个项目相关信息。比如你用到的各种依赖(这里主要是插件)

{
  "name": "gzy",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

创建完之后,我们执行下面的命令:

npm install gulp --save-dev

这一次,我们局部安装Gulp。使用–save-dev,将通知计算机在package.json中添加gulp依赖。

{
  "name": "gzy",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "gulp": "^4.0.0"
  }
}

目录结构

在这里插入图片描述
我们使用通用的webapp目录结构,dist文件夹用来存放生产环境下的内容。

第一个Gulp任务

(你需要先在根目录下创建一个gulpfile.js文件)。

先创建个简单的task

var gulp = require('gulp');

gulp.task('hello', function() {
console.log('Hello World!');
});

然后我们用webstorm或vscode打开我们创建的project项目。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
这是一个简单的task,但是正常使用的task也就比这个复杂一丢丢。
下面用编译Sass来举例子。

Gulp执行预处理

我们使用gulp-sass插件来编译Sass。
安装插件的步骤是这样的:

npm install gulp-sass --save-dev

在gulpfile中引入插件,用变量保存,并使用

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('hello', function() {
console.log('Hello World!');
});

gulp.task('sass', function(){
return gulp.src('source-files')
.pipe(sass()) // Using gulp-sass
.pipe(gulp.dest('destination'))
});

我们需要给sass任务提供源文件输出位置。所以我们先在项目中创建app/scss文件夹,里面有个styles.scss文件。
这个文件将在gulp.src中用到。

sass处理之后,我们希望它生成css文件并产出到app/css目录下,可以这样写:

gulp.task('sass', function(){
  return gulp.src('app/scss/styles.scss')
    .pipe(sass()) // Converts Sass to CSS with gulp-sass
    .pipe(gulp.dest('app/css'))
});

原来的目录:
在这里插入图片描述
指令完成后的指令:
在这里插入图片描述
styles.css是gulp智动为我们生成的。

在这个例子中我们是设置指定的目标文件:gulp.src(‘app/scss/styles.scss’),但文件多了,不可能一一在后面列出目标文件,这就不得不提Node中的通配符

Node中的通配符

通配符是一种匹配模式,允许你匹配到多个文件。不止是Node,很多平台都有,有点像正则表达式。

使用通配符,计算机检查文件名和路径进行匹配。

大部分时候,我们只需要用到下面4种匹配模式:

  1. .scss: * 号匹配当前目录任意文件,所以这里.scss匹配当前目录下所有scss文件.
  2. **/*.scss:匹配当前目录及其子目录下的所有scss文件。
  3. !not-me.scss:!号移除匹配的文件,这里将移除not-me.scss
  4. *.+(scss|sass):+号后面会跟着圆括号,里面的元素用|分割,匹配多个选项。这里将匹配scss和sass文件。

监听Sass文件

gulp提供和grunt一样的watch方法,对各种任务进行监听操作。
具体的语法如下:

gulp.watch('files-to-watch', ['tasks', 'to', 'run']);

通常我们监听的还不只是一个文件,把它变成一个任务:

gulp.task('watch', function(){
  gulp.watch('app/scss/**/*.scss', ['sass']);
  // Other watchers
})

上面的写法在新版的gulp已经不支持了。

gulp.task('watch1', function(){
    gulp.watch('app/scss/**/*.scss', gulp.series('sass'));
    // Other watchers
})

执行gulp watch命令。

在这里插入图片描述
有了监听,每次修改文件,Gulp都将自动为我们执行任务。

使用Browser Sync自动刷新

Browser Sync 帮助我们搭建简单的本地服务器并能实时刷新浏览器。

npm install browser-sync --save-dev

这里没有gulp-前缀,因为browser-sync支持Gulp,所以没有人专门去搞一个给Gulp用。

我们创建一个broswerSync任务,我们需要告知它,根目录在哪里。

我们先在头部应用需要的依赖。

var browserSync = require('browser-sync').create();

我们稍微修改一下之前的代码 sass1任务,让每次css文件更改都刷新一下浏览器:

gulp.task('sass1', function() {
    return gulp.src('app/scss/**/*.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
        .pipe(browserSync.reload({
            stream: true
        }))
});

然后我们监听html是否发生变化,如果变化重新渲染页面代码如下:

gulp.task('watch1',gulp.series('sass1',function(){
    browserSync.init({
        server: "./app"
    });
    gulp.watch('app/scss/**/*.scss', gulp.series('sass1'));
    gulp.watch("app/*.html").on('change', browserSync.reload);
}));
gulp.series('sass1'----------

这种写法是 gulp4.xx才出的语法,以前是[‘a’,‘b’]这种写法,意思是指在执行下面function内的任务前优先任务 a 和 任务b,
现在在gulp4不支持这种写法,需要通过 gulp.seriesgulp.parallel 的方式映入。

gulp.series:按照顺序执行
gulp.paralle:可以并行计算
gulp.task('my-tasks', gulp.series('a', 'b', 'c', function() {
  // Do something after a, b, and c are finished.
}));
gulp.task('build', gulp.parallel('styles', 'scripts', 'images', function () {
  // Build the website.
}));

也可以混合使用:

gulp.task('my-tasks', gulp.series('a', gulp.parallel('styles','scripts', 'images'), 'b', 'c', function() {
  // Do something after a, b, and c are finished.
}));

到目前为止,我们做了下面三件事:

1.可运转的web开发服务
2.使用Sass预处理器
3.自动刷新浏览器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gulp入门使用(一) 的相关文章

  • 在 package.json 中声明时 Reactify 转换未运行

    我正在尝试将reactify 转换与browserify 和gulp 结合使用 这个 gulp 任务有效 return browserify paths node modules app scripts entries app script
  • webpack 5 中是否可以让不同的入口包到不同的输出路径

    我正在使用 webpack 打包 google chrome 扩展 我想将文件夹结构保留在 dist 文件夹中 例如 我想将所有弹出资源打包在dist popup 这是我现在的配置 const path require path const
  • 使用 Webpack 进行缓存,索引源代码中的 [hash] 值,使用 React.js

    我正在构建一个同构应用程序 它完全是用react构建的 也就是说 html基础也在react中 我有我的根 html 作为应用程序组件 它看起来像这样 var AppTemplate React createClass displayNam
  • CSS 模块:如何禁用文件的本地范围?

    我在一个新的 React 项目中使用 CSS 模块 通过 Webpack css 加载器 尽管它工作得很好 但我在获取 SCSS 时遇到了困难反应选择 https github com JedWatson react select上班 我想
  • -bash: gulp: 在 Mac 中找不到命令

    我尝试在 mac 中安装 gulp 如下所示 Is iMac itop npm root Users itop node modules Is iMac itop npm config set prefix usr local Is iMa
  • 没有找到任务运行程序配置?

    我有 新安装的 Visual Studio Professional 2017 V 15 9 4 视觉工作室解决方案 https learn microsoft com en us visualstudio ide solutions an
  • npm install -D sass-loader node-sass Vue.js 2021

    您好 问题是为 Vue js 设置 SASS 我跑 Node js 15 7 0 Vue js vue cli 4 5 11 这是我在运行此命令时在控制台中遇到的错误 npm install D sass loader 节点 sass np
  • 解决方案:动态加载独立编译的 Webpack 2 包 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想分享如何捆绑一个充当插件主机以及它如何加载已安装的插件动态地 应用程序和插件都与 Webpack 捆绑在一起 应用程序和插件被编译和分
  • *.default不是构造函数,带有导入的js插件

    我尝试创建一个简单的表单验证 并通过示例项目中的纱线链接注册它以测试设置 但这绝对行不通 我不知道如何继续 export default class Proofr constructor console log test 然后生成这个 脚本
  • 如何避免在 webpack 生产构建中重复模块“bn.js”?

    我的应用程序使用了 webpack 4 不知何故 bn js包在生产构建中占用了大量资源 从图中可以看出 它占用了594 22KB 数据 有没有办法让1个文件bn js对于所有依赖于的包bn js 发生这种情况可能是因为您的依赖项都需要不同
  • Angular cli - 在“deployUrl”选项被弃用后在 webpack 中设置“publicPath”

    我希望在这里得到更多答案 开放问题角度 cli https github com angular angular cli issues 22113以及 从角度 13 开始 它说deployUrl正在被弃用 在我们的项目中 我们定义deplo
  • 如何将函数导入到Vue组件中?

    我正在尝试将单个函数导入到我的 Vue 组件中 我为我的函数创建了一个单独的 js 文件 randomId js exports randomId gt My function 在我的 Vue 组件中 我导入了 Random js let
  • ./types 的大小写与底层文件系统不匹配

    所以我从 eslint 收到了一些奇怪的警告 types 是流类型文件 我认为 eslint 将 checkbox 读取为小写 而实际上它是 Checkbox 大写 C I try git mv casesensitive tmp git
  • 永远运行 Gulp 脚本?

    是否可以运行 Gulp 脚本forever https www npmjs com package forever 我有 Gulp 脚本想要作为守护进程运行 所以我可以启动 停止 列出它 好的 所以我通过将 gulp 二进制文件从 usr
  • Webpack 和 Angular HTML 图像加载

    我一直对 webpack 和 Angular 感到头疼 这可能有一个简单的答案 但我无法弄清楚 我已经阅读了堆栈溢出中关于这个主题的几乎所有答案 但都无济于事 我有一个像这样的 html 页面 还有其他包含图像的模板 img
  • React JS 服务器端问题 - 找不到窗口

    你好 我正在尝试在我的reactJS项目中使用react rte 我有服务器端渲染 每次我想使用这个包时 我都会得到 return msie 6 9 b test window navigator userAgent toLowerCase
  • 在旧浏览器上使用 Fetch 的 ReactJS

    我正在使用 Webpack 和 Babel 实现 React JS 但是 我在让 Fetch 与 IE 11 配合使用时遇到问题 我的 babelrc 文件中有以下内容 presets env stage 0 react 以及我的 webp
  • 如何将 .env 文件变量传递给 webpack 配置?

    我是 webpack 的新手 几乎完成了所有构建部分 但现在的问题是我想将环境变量从 env 文件传递 到 webpack 配置 以便我可以通过以下方式将该变量传递到我的构建文件webpack DefinePlugin plugin 目前我
  • 禁用 chrome React DevTools 以进行生产

    我正在尝试使用 gulp 和 envify 对我的 React 应用程序进行浏览器化以设置 NODE ENV 因此 我可以删除反应警告 控制台中的错误报告 甚至我的代码来禁用某些功能 例如react addons perf的要求 而且效果很
  • 具有客户端/服务器节点设置的 Webpack?

    我正在尝试为带有节点后端服务器的 Angular2 应用程序设置基于 webpack 的流程 经过几个小时的努力 我已经成功地让客户端愉快地构建了 但我现在不知道如何集成我的服务器构建 我的服务器使用生成器 因此必须以 ES6 为目标 并且

随机推荐

  • 【Linux操作系统】【综合实验二 vi应用与shell脚本编辑】【浅试编辑命令】

    文章目录 一 实验目的 二 实验要求 三 实验内容 1 继续练习Linux系统的文件类 目录类 进程管理类与磁盘操作类常用命令 并使用常见的选择项 2 了解ed ex行编辑器与Emacs全屏幕编辑器的工作模式 基本操作命令 3 掌握vi的编
  • 静态测试

    之前对 静态测试 一直不怎么理解 一直徘徊在为什么要进行静态测试 看了下面这几篇文章 突然觉得的柳暗花明了 目前我正在测试的项目xx让我烦心的问题终于找到出路了 http qa taobao com p 8017 http qa taoba
  • 资产收集的方法总结

    资产收集的方法总结 文章目录 资产收集的方法总结 前言 一 资产收集基本名词概念 二 相关收集方法 1 fofa 2 google搜索语法 3 logo 4 favicon ico 5 关键字 6 维基百科 7 天眼查 企查查 8 微信公众
  • 设计模式之UML类图该怎么画

    关于可维护 可复用 可扩展 灵活性好的理解 生活中 印刷术和活字印刷 当需要对某些内容修改时 印刷术只要有一丁点变化 就需要重头再来 而活字印刷只需要进行部分修改即可 可维护 只更改要更改的内容 可复用 之前的内容并非用完就无用 后面仍可使
  • Caused by: java.lang.NoClassDefFoundError: javax/tools/ToolProvider

    解决方案 在pom文件中的scala maven plugin插件下面加入一个参数 pom xml配置如下
  • python + selenium实现自动登录操作(以淘宝为例)

    selenium操作不熟练的可以查看一下这篇文章 selenium操作大全 一 登录前准备操作 定位一下相对应html位置 输入一般为input标签 登录按钮一般为button 输入账号密码那块 定位代码 driver find eleme
  • 电脑主板跳线_电脑基础进阶必学知识,详解电脑主板跳线!

    在DIY装机时新手总会有不同的问题 虽然目前网上流传着各种版本的教学文章或者视频 但是细致的小技巧讲解还是有限 不少网友在装机的时候虽然大致明白各个硬件的组合 但是在跳线的环节可以难住了不少的人 也挡住了不少小白用户前进的脚步 确实机箱内部
  • 强化学习算法 DDPG 解决 CartPole 问题,代码逐条详解

    本文内容源自百度强化学习 7 日入门课程学习整理 感谢百度 PARL 团队李科浇老师的课程讲解 使用DDPG解决连续控制版本的CartPole问题 给小车一个力 连续量 使得车上的摆杆倒立起来 文章目录 一 安装依赖 二 导入依赖 三 设置
  • 微信小程序中实现车牌输入功能

    一 成品展示与介绍 在点击输入框的时候会弹出车牌输入键盘 二 相关思路解析 首先车牌号码由31位汉字 26位字母 10位数字组成的 开头第一位由省份简称的汉字 第二位字母根据省份下的城市或地区区分 最后的五位或者六位 是有字母和数字组成的
  • 开发工具篇 程序员计算器

    BYTE数据 到16进制 10进制
  • JVM--基础--27.2--工具--VisualVM--远程连接

    JVM 基础 27 2 工具 VisualVM 远程连接 1 准备工作 准备工作是为了测试使用 1 1 代码地址 https gitee com DanShenGuiZu learnDemo tree master visualvm lea
  • c#读取html 表格,c# – 如何将文本文件读取到DataTable

    我想从txt文件中提取数据并将其放入DataTable中 txt文件中的内容采用以下格式 sometext1 sometext2 sometext3 sometext4 sometext5 sometext6 sometext7 somet
  • java获取实时天气预报数据

    数据是从 www webxml com cn上免费获取的 有需要也可以去购买服务 api可以去该网站查看 这里用的是GET方式请求 每个城市citycode 也需要从这个网站上面去下载 解析xml用到的是xwork core 2 3 15
  • 月薪快6万了!

    和一位本科师兄约饭 比我大一级 当年他的成绩很好 完全能够保送更好高校的研究生 但在大家纷纷从众去读研的时候 他选择了直接工作 去了西二旗一家大厂 具体哪家这里就不明说了 圈子很小 很容易被定位 我问了下他目前的薪资情况 他说了几个数字 现
  • 第一章矩阵及其应用

    矩阵逆运算规律 由于矩阵运算默认不满足交换律 即AB BA 但若存在一钟矩阵B 满足AB BA 就满足了交换律 单位矩阵就是特殊的一种AB BA 单位矩阵定义是这样的 lt 设A为n阶方阵 则A aE aE A aA gt 也就是说 数量阵
  • Oracle 的drop table if exists功能

    Mysql 创建表之前判断表是否存在 如果存在则删除已有表 DROP TABLE IF EXISTS SH PLACARD INFO Oracle 创建表之前判断表是否存在 如果存在则删除已有表 declare num number beg
  • 如何使用JMeter进行压力测试

    一 前期准备 首先需要在官网下载jmeter 下载完之后打开bin目录下的jmeter bat 在jmeter bat中对所要压测的接口进行压力测试 二 具体步骤 1 创建线程组 在线程组中设置线程的个数 持续时间和循环次数 如下图所示 2
  • PMI632

    1 目录 drivers power supply qcom qpnp smb5 c charger driver drivers power supply qcom smb5 lib c 依赖的SMB library arch arm64
  • CTF_Web:php伪随机数mt_rand()函数+php_mt_seed工具使用

    CTF Web php伪随机数mt rand函数漏洞 0x00 问题描述 0x01 mt rand函数 0x02 CTF例题 0x03 php mt seed工具使用 0x04 参考文章 0x00 问题描述 最近在题目练习的时候遇到了一个伪
  • Gulp入门使用(一)

    Gulp入门使用教程 Gulp的简介 为什么是Gulp 安装Gulp 创建Gulp项目 目录结构 第一个Gulp任务 Gulp执行预处理 Node中的通配符 监听Sass文件 使用Browser Sync自动刷新 Gulp的简介 gulp