当前位置: 首页 > article >正文

前端工程化--gulp的使用

gulp

介绍

  • gulp 是一个基于 Nodejs 的自动化构建工具,中文主页
  • 能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的合并、压缩、检查、监听文件变化、浏览器自动刷新、测试等任务

使用步骤:

  1. 安装 nodejs

  2. 全局安装 gulp

    npm install gulp -g
    
  3. 局部安装gulp

    npm install gulp --save-dev
    
  4. 创建一个简单的应用,文件结构如下:

    |- gulpfile.js  // gulp配置文件
    |- package.json
    
  5. 配置编码: gulpfile.js

    //引入gulp模块
    const gulp = require('gulp');
    //定义任务
    gulp.task('任务名', function() {// 将任务代码放在这
    });
    
  6. 构建命令:

    gulp 任务名
    

    The following tasks did not complete: default

    Did you forget to signal async completion?

    错误的解决方法:

    1. 返回一个可读流
    2. 传入一个回调并执行
    3. 回调函数设置为 async 函数

gulp 插件

gulp 插件是专门针对 gulp 开发的工具包(npm包),用来实现特定的功能。

gulp-jshint 语法检查:

JSHint 是一个 JavaScript 的代码质量检查工具。gulp-jshint 是为 gulp 封装的插件

使用步骤:

  1. 安装插件

    npm install jshint gulp-jshint --save-dev
    
  2. 创建配置文件 .jshintrc
    (选项配置地址 https://jshint.com/docs/options/)

    {"esversion": 6,  "asi":true,				// 允许不写结尾处的分号"undef": true, 			// 使用之前必须定义"devel": true, 			// 没有定义也可以使用 console,alert 进行调试"eqeqeq": true,			// 强制使用 === "unused": true, 		// 定义了必须使用"globals": { 			// 配置全局变量,直接使用不会报错"$": true }
    }
    
  3. gulpfile.js 引入 jshint

    const jshint = require('gulp-jshint')
    
  4. 定义任务

    gulp.task('jshint', function() {// 任务代码return gulp.src('./src/js/*.js').pipe(jshint()).pipe(jshint.reporter('default'));
    });
    
  5. 运行命令

    gulp jshint 
    
gulp-babel 语法转换

Babel 是一个 JavaScript 编译器,可以将新的 JS 语法(ES6、7、8)转化为浏览器识别的 ES5 语法。
gulp-babel 是 babel 为 gulp 封装的插件

  1. 安装插件:

    npm install --save-dev gulp-babel @babel/core @babel/preset-env
    

    @babel/core 是 babel 的核心包

    @babel/preset-env 预设的包 (babel-preset-es2015)

  2. gulpfile.js 引入:

    const babel = require('gulp-babel');
    
  3. 定义任务:

    gulp.task('babel', () => {return gulp.src('./src/js/*.js').pipe(babel({ //进行语法转换presets: ['@babel/env']})).pipe(gulp.dest('build/js'))//输出到指定目录
    });
    
  4. 运行命令:

    gulp babel
    

经过 babel 转换后的 ES6 模块化语法变成了 CommonJs 语法,还需要用 browserify 转换

gulp-browserify 转换 CommonJs 模块化语法
  1. 安装插件:

    npm install --save-dev gulp-browserify
    
  2. 安装插件(用于重命名)

    npm install --save-dev gulp-rename
    
  3. 引入:

    const browserify = require('gulp-browserify');
    const rename = require('gulp-rename');
    
  4. 定义任务:

    gulp.task('browserify', function() {return gulp.src('./build/js/index.js').pipe(browserify())					//将CommonJs语法转换为浏览器能识别的语法.pipe(rename('built.js'))			//为了防止冲突将文件重命名.pipe(gulp.dest('build/js'))		//输出到指定位置
    });
    
  5. 运行命令

    gulp browserify
    
配置默认任务,让多个任务依次执行

定义默认任务

gulp.task('default', gulp.series('jshint', 'babel', 'browserify'));
gulp-uglify 压缩 JavaScript
  1. 安装插件

    npm install --save-dev gulp-uglify
    
  2. 引入插件

    const uglify = require('gulp-uglify');
    
  3. 定义任务

    gulp.task('uglify', function () {return gulp.src('build/js/built.js').pipe(uglify())  //压缩js.pipe(rename('dist.min.js')).pipe(gulp.dest('dist/js'))
    });
    
  4. 运行命令

    gulp uglify
    
gulp-less 编译 less 文件及使用 less-plugin-autoprefix 扩展前缀
  1. 安装插件

    npm install gulp-less less-plugin-autoprefix
    
  2. 引入插件

    const less = require('gulp-less');
    const LessAutoprefix = require('less-plugin-autoprefix');
    const autoprefix = new LessAutoprefix({ browsers: ['last 2 versions'] });
    
  3. 定义任务:

    gulp.task('less', function () {return gulp.src('./src/css/*.less').pipe(less({plugins: [autoprefix]//自动扩展前缀})).pipe(gulp.dest('./build/css'));
    });
    
  4. 运行命令:

    gulp less 
    
使用 gulp-concat 合并 CSS 文件
  1. 安装插件

    npm install --save-dev gulp-concat
    
  2. 引入

    const concat = require('gulp-concat');
    
  3. 定义任务

    gulp.task('concat', function () {return gulp.src('./build/css/*.css').pipe(concat('built.css')).pipe(gulp.dest('./build/css/concat'));
    });
    
  4. 运行命令:gulp concat

gulp-cssmin 压缩 CSS 文件
  1. 安装插件:

    npm install --save-dev gulp-cssmin
    
  2. 引入

    const cssmin = require('gulp-cssmin');
    
  3. 定义任务

    gulp.task('cssmin', function () {return gulp.src('build/css/concat/built.css').pipe(cssmin()).pipe(rename('dist.min.css')).pipe(gulp.dest('dist/css'));
    });
    
gulp-htmlmin 压缩 HTML 文件
  1. 安装插件
    npm install --save gulp-htmlmin
    
  2. 引入
    const htmlmin = require('gulp-htmlmin');
    
  3. 定义任务
    gulp.task('htmlmin', () => {return gulp.src('src/index.html').pipe(htmlmin({collapseWhitespace: true ,//去除空格removeComments:true //去除注释})).pipe(gulp.dest('dist'));
    });
    
自动化配置
  1. 安装模块

    npm install gulp-livereload gulp-connect opn --save-dev
    
  2. 引入模块

    const livereload = require('gulp-livereload');
    const connect = require('gulp-connect');
    const opn = require('opn');
    
  3. 自动执行任务,编译代码

    //1. 在所有可能要执行任务后面加上 .pipe(livereload());
    gulp.task('watch', function () {//2. 启动热加载服务livereload.listen();//3. 通过自己服务器打开项目,自动刷新connect.server({root: 'dist',port: 3000,livereload: true  // 自动刷新});//3. 自动打开浏览器opn('http://localhost:3000/index.html');//4. 监视指定文件(第一个参数),一旦文件发生变化,就自动执行后面的任务(第二个参数)gulp.watch('src/css/*.less', gulp.series(['less', 'concat', 'cssmin']));gulp.watch('./src/js/*.js', gulp.series(['jshint', 'babel', 'browserify', 'uglify']));gulp.watch('./src/index.html', gulp.series('htmlmin'));
    });
    

备注:必须要在 src 文件夹中修改 index.html 中引入样式和脚本的路径,gulp 不会自动处理路径。

相关插件:

  • gulp-concat : 合并文件(js/css)
  • gulp-uglify : 压缩js文件
  • gulp-rename : 文件重命名
  • gulp-less : 编译less
  • gulp-livereload : 实时自动编译刷新

重要API

  • gulp.src(filePath/pathArr) :
    • 指向指定路径的所有文件, 返回文件流对象
    • 用于读取文件
  • gulp.dest(dirPath/pathArr)
    • 指向指定的所有文件夹
    • 用于向文件夹中输出文件
  • gulp.task(name, [deps], fn)
    • 定义一个任务
  • gulp.watch()
    • 监视文件的变化

相关文章:

前端工程化--gulp的使用

gulp 介绍 gulp 是一个基于 Nodejs 的自动化构建工具,中文主页能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的合并、压缩、检查、监听文件变化、浏览器自动刷新、测试等任务 使用步骤: 安装 nodejs 全局安装 gulp npm install…...

谈谈对spring IOC的理解,原理和实现

一、IoC 核心概念 1. 控制反转(Inversion of Control) 传统编程中对象自行管理依赖(主动创建),而IoC将控制权转移给容器,由容器负责对象的创建、装配和管理,实现依赖关系的反向控制。 2. 依赖…...

Windows 10 ARM64平台MFC串口程序开发

Windows 10 IoT ARM64平台除了支持新的UWP框架,也兼容支持老框架MFC。使得用户在Windows 10 IoT下可以对原MFC工程进行功能升级,不用在新框架下重写整个工程。熟悉MFC开发的工程师也可以在Windows 10 IoT平台下继续使用MFC进行开发。 本文展示MFC串口程序…...

31天Python入门——第16天:模块与库详解

你好,我是安然无虞。 文章目录 Python模块模块之间的调用 Python包库的概念Python标准库安装第三方库 \_\_name\_\_ \_\_main\_\_ Python模块 在 Python 中, 模块是一个包含函数、变量和类等代码定义的py文件. 所以也可以说, 普通的py文件就是一个模块. 模块可以…...

设计模式(创建型)- 原型模式

目录 定义 类图 角色 优缺点 优点 缺点 应用场景 案例展示 浅克隆 深克隆 定义 原型模式旨在创建重复的对象,同时确保良好的性能表现。它通过复制现有对象(原型)来创建新对象,而非使用传统的构造函数创建方式。这种设计…...

Redis + Caffeine多级缓存电商场景深度解析

Redis Caffeine多级缓存 Redis Caffeine多级缓存电商场景深度解析一、实施目的二、具体实施2.1 架构设计2.2 组件配置2.3 核心代码实现 三、实施效果3.1 性能指标对比3.2 业务指标改善3.3 系统稳定性 四、关键策略4.1 缓存预热4.2 一致性保障4.3 监控配置Prometheus监控指标 …...

spring-ai ollama小试牛刀

序 本文主要展示下spring-ai ollama的使用 示例 pom.xml <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency>这里以ollama示例 配置 spring:ai:olla…...

在 CentOS 系统中开机自动执行 Shell 脚本

在 CentOS 系统中&#xff0c;可以通过以下方法设置开机自动执行 Shell 脚本。推荐使用 systemd 服务&#xff08;现代 Linux 系统的标准方式&#xff09;&#xff0c;也可以使用传统的 /etc/rc.local 方法。 方法 1&#xff1a;使用 Systemd 服务&#xff08;推荐&#xff09;…...

【Linux】应用层协议 HTTP

应用层协议 HTTP 一. HTTP 协议1. URL 地址2. urlencode 和 urldecode3. 请求与响应格式 二. HTTP 请求方法1. GET 和 POST (重点) 三. HTTP 状态码四. HTTP 常见报头五. 手写 HTTP 服务器 HTTP&#xff08;超文本传输协议&#xff09;是一种应用层协议&#xff0c;用于在万维网…...

Linux下的socket演示程序3(udp)

server.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>#define SER_PORT 8888 //端口号 #define SER_IP "10.148.4.168" //服务器IP…...

数据可视化TensorboardX和tensorBoard安装及使用

tensorBoard 和TensorboardX 安装及使用指南 tensorBoard 和 TensorBoardX 是用于可视化机器学习实验和模型训练过程的工具。TensorBoard 是 TensorFlow 官方提供的可视化工具&#xff0c;而 TensorBoardX 是其社区驱动的替代品&#xff0c;支持 PyTorch 等其他框架。以下是它…...

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline&#xff1a;端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE&#xff08;Variational AutoEncoder&#xff09;图像尺寸与 UNet 和 VAE 的关系EMA&#xff08;Exponential Moving…...

AWTK-WEB 快速入门(6) - JS WebSocket 应用程序

WebSocket 可以实现双向通信&#xff0c;适合实时通信场景。本文介绍一下使用 Javacript 语言开发 AWTK-WEB 应用程序&#xff0c;并用 WebSocket 与服务器通讯。 用 AWTK Designer 新建一个应用程序 先安装 AWTK Designer&#xff1a; https://awtk.zlg.cn/web/index.html …...

tcl语法中的命令

tcl语法中存在多少个命令呢&#xff1f; 如下&#xff0c; after errorInfo load pwd tcl_rcFileName append eval lrange re_syntax tcl_startOfNextWord apply exec lrepeat read tcl_startOfPreviousWord argc exit lreplace refchan tcl_traceCompile argv expr lreverse r…...

ESLint报错:Could not find config file.

如果你的ESLint的版本大于 8&#xff0c;同时使用 .eslinrc.js 和 .eslintignore 作为配置文件&#xff0c;且目前用的是 VSCODE &#xff0c;就有可能遇到报错&#xff1a; Could not find config file. 这个是因为 VSCode 中 ESLint 插件的配置 eslint.useFlatConfig 的问题…...

北斗导航 | 基于北斗三号短报文通信的北斗-YOLO融合系统原理,算法公式,系统流程框图,matlab代码,应用场景

以下是关于基于北斗三号短报文通信的北斗-YOLO融合系统的详细解析,包含原理、算法公式、系统流程、Matlab代码框架和应用场景。一、系统原理 北斗-YOLO融合系统结合了北斗三号短报文通信(双向通信能力)和YOLO目标检测算法,用于在无地面网络覆盖区域实现实时目标检测与数据传…...

Vue3 中使用 vuedraggable 实现拖拽排序功能,分组拖拽

Vue3 中使用 vuedraggable 实现拖拽排序功能&#xff0c;分组拖拽 安装draggable npm install vuedraggablenext --save基础用法示例 <template><div class"app-container"><draggable v-model"list" item-key"id":group"…...

使用VSCODE导致CPU占用率过高的处理方法

1&#xff1a;cpptools 原因&#xff1a;原因是C/C会在全局搜索文件&#xff0c;可以快速进行跳转&#xff1b;当打开的文件过大&#xff0c;全局搜索文件会占用大量CPU&#xff1b; 处理方法&#xff1a; 1&#xff1a;每次只打开小文件夹&#xff1b; 2&#xff1a;打开大文…...

【力扣hot100题】(004)盛水最多的容器

现在能这么快做出来纯粹是因为当时做的时候给我的印象实在太深了。 犹记得这题是当年开启我用CSDN记录leetcode日记历史的开端。 总之印象太深了不会都不行啊&#xff01;&#xff01;记得当年是想到用各种动态规划回溯等等等等最终发现是最简单贪心和双指针。 解法也是非常简…...

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏&#xff0c;承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏&#xff0c;包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者&#xff0c;都能从本文中获得启发。 …...

宝塔面板部署 Laravel 项目无法访问静态资源的解决方法

提示:“奔跑吧邓邓子” 的常见问题专栏聚焦于各类技术领域常见问题的解答。涵盖操作系统(如 CentOS、Linux 等)、开发工具(如 Android Studio)、服务器软件(如 Zabbix、JumpServer、RocketMQ 等)以及远程桌面、代码克隆等多种场景。针对如远程桌面无法复制粘贴、Kuberne…...

C/C++中的条件编译指令#if

#if 是 C/C 中的预处理指令&#xff0c;用于条件编译。它允许根据预定义的条件来决定是否编译某段代码。#if 通常与 #define、#ifdef、#ifndef、#else 和 #endif 等指令一起使用。 基本语法 #if 条件表达式// 如果条件表达式为真&#xff0c;编译这部分代码 #else// 如果条件…...

【设计模式】策略模式(Strategy Pattern)详解

策略模式&#xff08;Strategy Pattern&#xff09;详解 一、策略模式的定义 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一组算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以相互替换&#xff0c;从而让算法的…...

Eclipse IDE for ModusToolbox™ 3.4环境通过JLINK调试CYT4BB

使用JLINK在Eclipse IDE for ModusToolbox™ 3.4环境下调试CYT4BB&#xff0c;配置是难点。总结一下在IDE中配置JLINK调试中遇到的坑&#xff0c;以及如何一步一步解决遇到的问题。 1. JFLASH能够正常下载程序 首先要保证通过JFLASH(我使用的J-Flash V7.88c版本)能够通过JLIN…...

修改git在提交代码时的名称

在git中&#xff0c;如果想修改提交代码作者的名字&#xff0c;可以进行以下操作&#xff1a; 1.在桌面或者文件夹内右击鼠标&#xff0c;点开Git Bash here。 2.进入后&#xff0c;通过git config user.name 回车查看当前名称。 3.通过git config --global user.name "…...

前端显示no data(没有数据,一片空白)

◎浏览器查看显示 message: "Request failed with status code 404", name: "AxiosError", code: "ERR_BAD_REQUEST" ◎后端gateway 模块显示: 无需验证&#xff0c;通行。/business/admin/save 显示正确的路径&#xff0c;但是没有返回结果…...

CCF编程能力等级认证GESP—C++7级—20250322

CCF编程能力等级认证GESP—C7级—20250322 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)图上移动等价消除 单选题&#xff08;每题 2 分&#xff0c;共 …...

【Linux】深入解析Linux命名管道(FIFO):原理、实现与实战应用

本文承接上文匿名管道&#xff1a;【Linux】深度解析Linux进程间通信&#xff1a;匿名管道原理、实战与高频问题排查-CSDN博客 深入探讨Linux进程间通信&#xff08;IPC&#xff09;&#xff0c;以匿名管道为核心&#xff0c;详细阐述其通信目的、实现前提及机制。涵盖数据传输…...

第十四届蓝桥杯省赛电子类单片机学习记录(客观题)

01.一个8位的DAC转换器&#xff0c;供电电压为3.3V&#xff0c;参考电压2.4V&#xff0c;其ILSB产生的输出电压增量是&#xff08;D&#xff09;V。 A. 0.0129 B. 0.0047 C. 0.0064 D. 0.0094 解析&#xff1a; ILSB&#xff08;最低有效位&#xff09;的电压增量计算公式…...

Python高效编程技巧与AI专用库:NumPy/Pandas数据处理与Matplotlib/Seaborn可视化实战

Python高效编程技巧与AI专用库&#xff1a;NumPy/Pandas数据处理与Matplotlib/Seaborn可视化实战 引言&#xff1a;Python高效AI开发的核心技能栈 在AI项目中&#xff0c;数据处理和可视化占据了70%以上的工作量。低效的代码会导致模型训练缓慢&#xff0c;而糟糕的数据可视化…...