热门标签 | 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


推荐阅读
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 单元测试:使用mocha和should.js搭建nodejs的单元测试
    2019独角兽企业重金招聘Python工程师标准BDD测试利器:mochashould.js众所周知对于任何一个项目来说,做好单元测试都是必不可少 ... [详细]
  • 在PHP中,为了更高效地打开和读取目录并列出其中的文件,可以使用一个自定义函数来返回查询目录下的文件和文件夹列表。该函数会将结果以数组形式返回,并明确区分每个条目是文件还是目录,从而提供更友好和实用的输出。此外,该函数还可以进一步扩展,支持递归查询子目录,以便更全面地获取目录结构信息。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • Webpack 初探:Import 和 Require 的使用
    本文介绍了 Webpack 中 Import 和 Require 的基本概念和使用方法,帮助读者更好地理解和应用模块化开发。 ... [详细]
  • VB.net 进程通信中FindWindow、FindWindowEX、SendMessage函数的理解
    目录一、代码背景二、主要工具三、函数解析1、FindWindow:2、FindWindowEx:3、SendMessage: ... [详细]
  • 本文介绍了如何在 Vue 3 组合 API 中正确设置 setup() 函数的 TypeScript 类型,以避免隐式 any 类型的问题。 ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • 本文探讨了如何在 Java 中将多参数方法通过 Lambda 表达式传递给一个接受 List 的 Function。具体分析了 `OrderUtil` 类中的 `runInBatches` 方法及其使用场景。 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
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社区 版权所有