热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浏览gulp源码小结

gulp源码简介gulp源码中心部份寥寥60+行。然则经由过程这60+行代码,gulp给我们带来的确是前端自动化构建的方便。以往认为其源码一定蛮庞杂,却没想到倒是这么60+行,这6

gulp源码简介

gulp源码中心部份寥寥60+行。然则经由过程这60+行代码,gulp给我们带来的确是前端自动化构建的方便。以往认为其源码一定蛮庞杂,
却没想到倒是这么60+行,这60+行的背地,是来自于模块化的支持。

gulp的四个接口离别来源于orchestrator,vinyl-fs两个模块。
所以gulp的一切特征都来自于这两个模块。
Orchestrator是用来使命治理,以及宣布一些事宜,vinyl-fs 则供应代表gulp魂魄的流式文件体系。
研讨清晰了这两个模块,也就了解了gulp。

  • gulp.task = Gulp.prototype.task = Gulp.prototype.add;

  • Gulp.prototype.src = vfs.src;

  • Gulp.prototype.dest = vfs.dest;

  • Gulp.prototype.watch = function(glob, opt, fn) { ... return vfs.watch(glob, opt, fn);};

同时gulp自身是直接继续于Orchestrator模块。

function Gulp() {
Orchestrator.call(this); // gulp直接继续于Orchestrator模块
}

orchestrator模块引见

A module for sequencing and executing tasks and dependencies in maximum concurrency

译:以最大并发才能递次实行使命与其依靠的一个功能模块

var Orchestrator = function () {
EventEmitter.call(this); //继续了EventEmitter对象
this.dOneCallback= undefined; // 当task里一切的使命完成时挪用这个函数
this.seq = []; // task以及task里依靠的实行递次,(start里会有多个task,每一个task又有可能有多个依靠,每一个依靠又可能有多个依靠,所以须要保留其实行递次)
this.tasks = {}; // 使命对象,包含使命名,依靠,回调函数
this.isRunning = false; // 示意当前是不是在实行使命
};

Orchestrator应用seq这个行列数组存储须要实行的task,如许假如盘算机有才能实行,它就从行列里取走一个,假如另有才能就再取走一个,
所以这实际上是in maximum concurrency即以最大的并发才能来实行。

关于seq的组织,则是引入sequencify模块递归盘算其依靠并压入行列。

同时经由过程继续EventEmitter对象,Orchestrator宣布了一些列可定阅的事宜,用于插件以及命令行里的gulp在事宜发作时输出响应的信息。

`var events = [‘start’,’stop’,’err’,’task_start’,’task_stop’,
‘task_err’,’task_not_found’,’task_recursion’];`

体系暴露了这些事宜以供插件挪用,而且供应了2个要领

  • listenToEvent是监听某一个事宜

  • onAll是不论events里的谁人就监听

vinyl-fs模块引见

重要依靠于vinyl与glob-watcher。后者供应看管文件变化的watch接口,
前者则在file的基础上封装一些属性与要领,组织出奇特的vinyl文件对象。
Gulp运用的是Stream,但却不是一般的Node Stream,而是基于vinyl对象的vinyl File Object Stream

组织函数以下

function File(file) {
if (!file) file = {};
// 保留该文件的途径变化纪录
var history = file.path ? [file.path] : file.history;
this.history = history || [];
this.cwd = file.cwd || process.cwd(); // 当前文件地点目次,即current work directory
this.base = file.base || this.cwd; // 用于相对途径,代表根目次
this.stat = file.stat || null; // 运用 fs.Stats获得的效果
this.cOntents= file.contents || null; // 文件内容
this._isVinyl = true; // 文件对象是不是是vinyl对象,vinyl对象即对file对象封装后的效果
}

Gulp为何不运用一般的Node Stream呢?

一般的Node Stream只传输String或Buffer范例,也就是只关注内容。但Gulp不只用到了文件的内容,而且还用到了这个文件的相干信息(比方途径)。

因而,Gulp的Stream是Object作风的,也就是Vinyl File Object了。所以须要有有contents、path如许的多个属性了。

写在末端

浏览gulp代码的这一次,是我第一次浏览这类开源的模块化项目。深深的被震动到了,熟悉到了模块化的巨大力量。正如7层盘算级机收集模子。
将层级笼统出来,每一层只须要关注本身那一层的事变,直接挪用下一层供应的API。就可以完成非常庞杂的事变,而不须要通常亲力亲为,一行行
代码,一个个小问题顺次处理。可以解放双手做更多的事变。

参考文档

  1. 探讨Gulp的Stream

  2. 从零单排之gulp实战

  3. 开源Nodejs项目引荐gulp中心模块:Orchestrator

WilsonLiu’s blog首发地点:http://blog.wilsonliu.cn


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
author-avatar
等待1314578
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有