Gulp.Task 正解

news2024/9/28 17:35:49

gulp task 实现过程

今天从源码的角度分析下 gulp 中 task 的实现过程。多个 task 是如何执行??? 等等

gulp 插件分布图

在这里插入图片描述

其实通过上述截图可以看到,其实整个 gulp 内部什么逻辑都没有,都是由一个一个插件组成的。上述的截图绘制了重要的插件,更详细的插件可以观看源码。

简单实例

default 以及默认回调

function defaultTask(cb) {
  console.log("执行了默认的task 任务");
  cb();
}

exports.default = defaultTask;

串行 执行插件

const { series } = require("gulp");

const clean = (cb) => {
  console.log("clean task");
  cb();
};

const build = (cb) => {
  console.log("build task");
  cb();
};

exports.default = series(clean, build);

通过 promise 表示完成

const { series } = require("gulp");

const task1 = () => {
  return new Promise((resolve) => {
    console.log("task1 ...");
    resolve();
  });
};

const task2 = (done) => {
  console.log("task2 ...");
  done();
};

exports.default = series(task1, task2);

API【task】注册

const { task, series } = require("gulp");

task("build", function (done) {
  console.log("build exec success ...");
  done();
});

exports.default = series("build");

分析 task 注册过程

在这里插入图片描述

上述 通过几段 js 代码来实现了 task 任务注册逻辑,接下来讲述下源码中是如何实现 task 的。实现 task 大体分为两种方式:

  • 通过调用 task API 来实现任务注册
  • 通过gulpfile.js(exports.xxx = xx) 中导出方法 来实现自动注册

手动注册 task 任务

  • 首先我们是通过插件gulp 来导出 task。但是 task 本身从插件undertaker中继承过来的,所以我们移步看插件 undertaker 实现原理

    let Undertaker = require("undertaker");
    Undertaker.call(this);
    // ......
    this.task = this.task.bind(this);
    
  • 然后我们查看插件【undertaker】中 task.js, 这个导出的 task 方法,其实就是我们调用的真正 task 方法

  • task 方法中 定义了_setTask, _getTask 方法。但是 task 的核心本质是,如下代码

    this._tasks = {};
    
    UndertakerRegistry.prototype.get = fn;
    UndertakerRegistry.prototype.set = fn;
    
  • 其实就是将 name, fn 存放到对象中。需要的时候从对象中获取。

通过 gulpfile.js 自动注册

  • 通过脚手架【gulp-cli】来读取 gulpfile.js 文件
  • 执行的位置【gulp-cli/lib/versioned/^4.0.0/index.js
  • 然后通过代码registerExports(gulpInst, exported); 注册到gulp实例上
    • gulpInst 其实就是 gulp 实例
    • exported 其实就是导出对象exports
  • 执行对应注册 task 的 js。如:register-exports.js
  • 注册详细步骤 跟 【手动注册task任务】 保持一致

一次执行series 的过程

在这里插入图片描述

上述的截图中参照【series.js 实现方式】【一次 series 执行流程】

series.js 实现方式

  • 调用函数series 函数 , 这个函数会返回真正要执行的函数,具体步骤如下:
    • 步骤 1:const create = bach.series 执行如左侧代码 create 函数就是为了执行内部的 next 以及 dispatch 方法
    • 步骤 2:var args = normalizeArgs(this._registry, arguments); 执行左侧代码。目的是为了将函数格式化。格式化的方式大致分为以下两种:
      • 第一种:如果参数是函数,直接返回函数
      • 第二种:如果参数是字符串,通过_registry.tasks 找到对应名称的 函数,并且返回
    • 步骤 3:var fn = create(args, extensions); 将上述步骤 2 的参数给 create 方法,返回需要的函数
  • 这里说下 函数series 返回 fn 函数后 具体的逻辑:
    • 上述【步骤 2】中会返回一个函数数组,数组会传递到mapSeries函数中。 如下图
    • 在这里插入图片描述
    • 然后会执行核心方法【mapSeries】(位置: 3.mapSeries.js 内容)。
    • 既然 mapSeries 的第一个参数 args 是一个函数数组,那么首先以 index = 0 为条件,获取第一个函数
    • 第一个函数执行成功后,index 自增,再次执行 next 函数,一次类推实现串行执行

一次执行的过程

主要是看懂上述series.js 实现方式 原理。

在这里插入图片描述
上述截图中:gulpInst => gulp 实例, runMethod => 表示 series 参数。 toRun => 默认就是[default]. 此gulpInst[runMethod](toRun)函数 其实就是上述series.js 实现方式 返回的 fn 函数

结束

上述是基于Gulp.Task的源码分析,以后会有更多的源码分析,如果觉得小编写还可以的话,转移GitHub 给star

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

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

相关文章

Java多线程案例之单例模式(饿汉,懒汉)

目录 一、饿汉模式 二、懒汉模式 前言:单例模式是校招中最常见的设计模式之一。下面我们来谈谈其中的两个模式:懒汉,饿汉。 何为设计模式? 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多…

《Linux性能优化实战》学习笔记 Day04

06 | 锁:如何根据业务场景选择合适的锁? 原文摘抄 当你无法判断锁住的代码会执行多久时,应该首选互斥锁,互斥锁是一种独占锁。 如果你能确定被锁住的代码执行时间很短,就应该用自旋锁取代互斥锁。 对于 99% 的线程…

工信部电子标准院:龙蜥操作系统获评“优秀”

近日,工信部中国电子技术标准化研究院公布第二批通过开源项目成熟度评估的开源项目名单,龙蜥操作系统(Anolis OS)凭借在生态构建、技术创新、应用落地等方面的成熟能力与卓越表现,顺利通过评估并获得优秀贰级&#xff…

简单说说什么是真的懂一道题了

昨天写了Richard的2022年一年级入学小结后,后台有读者问我怎么算真的懂一个知识点了,今天来简单说两句,大家都知道,求123…n的和,高斯的幼年成名作。Richard同学在上中班的时候,我就给他科普过高大神的事迹…

2023牛客寒假算法基础集训营3 -- E-公平守望的灯塔(向量 简单几何)

题目如下: 示例1 输入 1 0 0 1输出 0 0说明 输出1 1也是可以的。 思路 or 题解: 我们可以迅速找到 CCC 有两个位置满足题意,但 CCC 的坐标不一定是整数,我们需要 checkcheckcheck MMM 是 ABABAB 的中点 我们可以求出来 AM→…

「栈和队列」简析

前言 前言:研究一个数据结构的时候,首先讲的是增删改查。 文章目录前言一、简介1. 结构2. 特点3. 存储二、栈1. 类比举例2. 操作3. 实现1)顺序栈(常用)a. 核心b. 要素c. 入栈d. 出栈2)链式栈三、队列1. 类比…

Spring的Aware接口讲解,内含几篇参考文章

Aware接口文章一、使用Aware与不使用Aware的效果二、ApplicationContext实例介绍Aware三、从Aware顶级接口实现自己的XXXAware一、使用Aware与不使用Aware的效果 参考文章:Spring中的aware接口 定义BeanNameAware接口 public interface BeanNameAware extends Aw…

树的应用举例——并查集和树状数组

并查集 并查集是利用森林来描述一些不相交的集合,并支持集合的合并操作和查询操作。 假设有n个元素,分为m个不相交集合,一个集合构成一棵树,同一棵树(集合)中的元素地位相等。例如下图的森林表示一个包含…

【Python】Numpy多项式详解

文章目录多项式简介构造函数与图像运算符重载常用方法多项式简介 Numpy.polynomial中封装了六种多项式类,除了常规的多项式a0a1x⋯anxna_0a_1x\cdotsa_nx^na0​a1​x⋯an​xn之外,还有五种在数学、物理中常用的正交多项式,例如Hermite多项式…

祝贺!2022 Rust中文社区线上Hackathon评审结果出炉!

完全超出预期(的优秀!)!这次黑客松共有9支队伍闯入最后的评审会。他们是:233bithttps://github.com/rustcc/hackathon2022/tree/master/233bitRust 实现的 合成材料计算器EvolutionLabhttps://github.com/rustcc/hacka…

来自AI浩的新年祝福

大家好,感谢大家这一年来的关注和支持,在新春即将到来之际,AI浩祝大家: 祝大家新的一年里生活能够像下面的兔子那样,多彩多姿! 祝愿大家,快乐常伴,笑口常开! 在新的…

chfs安装使用注意事项及如何实现http外网访问

对于分享电脑上的文件,或与手机互传文件,除了 QQ、微信还有很多专业的工具,Cute Http File Server (缩写为 chfs),就是一个免费小巧的 HTTP 文件共享服务器工具,它可以跨平台支持 Windows、Mac 和 Linux,只…

37岁被裁,但毫无遗憾:小镇出身,一穷二白,完整吃过互联网+房地产红利,现在上海有千万房产!...

有人被裁是失业,有人被裁是退休,有时候人类的悲欢真的不相通,来看看这位网友的故事:37岁,年底被裁,但是不留遗憾了。算是完整吃过一波互联网房地产红利,小镇出身,一穷二白&#xff0…

蚂蚁整改,暗藏深意

‍数据智能产业创新服务媒体——聚焦数智 改变商业互联网金融可以提升金融服务的效率和质量,促进传统产业转型升级,是资本竞相追逐的丛林,也是互联网巨头间相互争抢的战略高地。通过上市公司分拆子公司进行上市,可以获得一系列好…

C语言结构体 笔记

C语言提供结构体来管理不同类型的数据组合。C语言中的结构体类似于Java中的类。声明结构体类型定义变量名定义变量名和初始化结构体对齐结构体的大小必须是其最大成员的整数倍!(1)例如,此结构体的大小为16。因为double类型占8个字节&#xff…

聊一聊用户增长

#01 什么是用户增长 用户增长基本上会涉及生意场上的各行各业,你开个店面希望有更多的客户光顾,你做了个APP希望有更多的用户经常使用,你搭建了个电商平台希望有更多的人下单买东西。 用户增长,即以提升用户LTV为目的&#xff08…

MongoDB学习笔记【part1】概念与安装

一、NoSQL简介 NoSQL Not Only SQL,不仅仅是SQL,泛指非关系型数据库。NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。 特点:不遵循SQL标准、不支持ACID(原子、一致…

Linux常用命令——sysctl命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) sysctl 时动态地修改内核的运行参数 补充说明 sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项&#xff…

FANUC机器人INTP-250或251用户坐标系或工具坐标系与示教资料不符报警的处理办法

FANUC机器人INTP-250或251用户坐标系或工具坐标系与示教资料不符报警的处理办法 在机器人的日常使用过程中,有可能会碰到这样的情况: 点位的示教是在工具坐标系1、用户坐标系0下示教的,如下图所示, 但是使用过程中可能被自己或别人不小心修改成了工具坐标系2、用户坐标系…

HTML学习02

表格标签的学习 表格 table 行 tr列 td表头列 thtable中有如下属性 border:表格边框的粗细width:表格的宽度cellspacing:单元格间距cellpadding:单元格填充. tr中有一个属性: align -> center , left , right …