前端工程化--gulp的使用

news2025/3/31 18:12:04

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()
    • 监视文件的变化

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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文件就是一个模块. 模块可以…

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

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

【Linux】应用层协议 HTTP

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

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

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

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

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

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

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

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

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

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

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

用Deepseek写扫雷uniapp小游戏

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

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

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

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

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

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

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

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

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

vim的一般操作(分屏操作) 和 Makefile 和 gdb

目录 一. vim的基本概念 二. vim基础操作 2.1 插入模式 aio 2.2 [插入模式]切换至[正常模式] Esc 2.3[正常模式]切换至[末行模式] shift ; 2.4 替换模式 Shift R 2.5 视图(可视)模式 (可以快速 删除//注释 或者 增加//注释) ctrl v 三&…

Apache Shiro 统一化实现多端登录(PC端移动端)

Apache Shiro 是一个强大且易用的Java安全框架,提供了身份验证、授权、密码学和会话管理等功能。它被广泛用于保护各种类型的应用程序,包括Web应用、桌面应用、RESTful服务、移动端应用和大型企业级应用。 需求背景 在当今数字化浪潮的推动下&#xff…

NAT—地址转换(实战篇)

一、实验拓扑: 二、实验需求: 1.实现内网主机访问外网 2.实现外网客户端能够访问内网服务器 三、实验思路 1.配置NAT地址池实现内网地址转换成公网地址,实现内网主机能够访问外网。 2.配置NAT Sever实现公网地址映射内网服务器地址&…

用HTML和CSS生成炫光动画卡片

这个效果结合了渐变、旋转和悬浮效果的炫酷动画示例&#xff0c;使用HTML和CSS实现。 一、效果 二、实现 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&quo…

FPGA_YOLO(三)

上一篇讲的是完全映射&#xff0c;也就是block中的所包含的所有的卷积以及归一&#xff0c;池化卷积 举例总共6个等都在pl侧进行处理&#xff08;写一个top 顶层 里面conv 1 bn1 relu1 pool1 conv1*1 conv 2 bn2 relu2 pool2 conv1*1 ....总共6个 &#xff09;&#xff0c;…

旅游CMS选型:WordPress、Joomla与Drupal对比

内容概要 在旅游行业数字化转型进程中&#xff0c;内容管理系统&#xff08;CMS&#xff09;的选择直接影响网站运营效率与用户体验。WordPress、Joomla和Drupal作为全球主流的开源CMS平台&#xff0c;其功能特性与行业适配性存在显著差异。本文将从旅游企业核心需求出发&…