资讯专栏INFORMATION COLUMN

Gulp使用入门

ShevaKuilin / 624人阅读

摘要:是一款流式构建系统,如果说是基于任务执行器,就是基于的文件流任务执行器,比起有如下特点使用方便通过代码优于配置的策略,可以让简单的任务简单,复杂的任务更可管理。

作者:Jogis
原文链接:https://github.com/yesvods/Blog/issues/1
转载请注明原文链接以及作者信息

提到 Gulp,不得不说到的是较早的 JS 项目自动化构建工具——Grunt。

前端开发过程中,特别是最近几年多了 CoffeeScript、Sass、Less 等一些预编译语言,很多代码每次写完需要手动到工作目录去编译才能执行。此外,项目预发布时候需要进行 js、css 文件合并、压缩、重命名等操作,实在是很繁琐。此前很多工程师使用的是 Makefile 构建项目,但是这要求需要一定Linux基础,而且编写配置文件会增大非常多工作量, Grunt 的出现,解放了前端工程师的双手=_=

Grunt 通过 CLI 配合配置文件 gruntfile.js 去完成自动化构建任务,社区有非常多的 Grunt 插件,比如 concat(合并文件)、 uglify(js压缩),只需要在 gruntfile.js 中配置好路径等一些参数,运行以下命令就可以自动执行。

grunt takeName

Gulp是一款 The streaming build system(流式构建系统),如果说 Grunt 是基于 gruntfile.js 任务执行器,Gulp 就是基于 NodeJS 的文件流任务执行器,比起 Grunt 有如下特点

使用方便
通过代码优于配置的策略,Gulp 可以让简单的任务简单,复杂的任务更可管理。

构建快速
通过流式操作,减少频繁的 IO 操作,更快地构建项目。

插件高质
Gulp 有严格的插件指导策略,确保插件能简单高质的工作。

易于学习
少量的API,掌握 Gulp 可以毫不费力。构建就像流管道一样,轻松加愉快。

Gulp实现

Gulp 主要 API 为 gulp.src(使用glob模式匹配获得文件流集)、gulp.dest(输出gulp文件流集到指定路径,路径指定相对于gulpfile.js配置文件)、gulp.watch(监听glob模式匹配的文件集,有改动时执行相应gulp任务),如图:

orchestrator

译作管弦乐演奏家,大多数就是一个老头拿着个小棍的形象,就像这样:

一个npmjs模块,就是一个以最大并发方式去排序或执行一系列的任务。这些任务就是我们之后会用到的 Gulp 任务,比如说 css 命名的任务,里面包括css的浏览器前缀添加、合并、压缩等操作。orchestrator 通过实例化一个对象,在对象上调用 add 来添加特定命名的任务、添加任务时候可以声明任务依赖,比如:

var Orchestrator = require("orchestrator");
var orchestrator = new Orchestrator();
orchestrator.add("thing1", function(){
  // do stuff
});
orchestrator.add("thing2", function(){
  // do stuff
});
orchestrator.add("mytask", ["thing1","thing2"], function() {
  // Do stuff
});

以上代码,添加了3个 Gulp 任务,mytask 任务依赖于 thing1 和 thing2 ,即必须执行完后面两个任务,mytask才能执行,通过任务依赖,很容易理清和构建任务时候的执行顺序。需要注意的是,在填写 do stuff 时候,要确保其返回一个 promise 或者是 event stream(最常用),比如一个简单的任务是这样定义的:

var map = require("map-stream");

orchestrator.add("thing4", function(){
  var stream = map(function (args, cb) {
    cb(null, args);
  });
  // do stream stuff
  return stream;
});

或则是返回一个 promise:

var Q = require("q");

orchestrator.add("thing3", function(){
  var deferred = Q.defer();

  // do async stuff
  setTimeout(function () {
    deferred.resolve();
  }, 1);

  return deferred.promise;
});

orchestrator 调用 start 来执行特定名称的任务,可一次执行多个:

orchestrator.start("one", "two");

以上两个是 orchestrator 最常用的用于实现 Gulp 的函数,除此之外,还有任务检测,任务暂停,任务事件监听,想详细了解可访问npmjs:https://www.npmjs.org/package/orchestrator

vinyl-fs

这是 Gulp 采用的一个虚拟文件系统,可以读取 glob 模式匹配到的文件并转成文件流,可以获取文件流并转成文件集。其中 vinyl-fs 使用 vinyl 虚拟文件描述类,来对 glob 匹配到的文件进行描述,所谓的描述,只是简单的文件名与路径,以及文件内容,可以说是一个文件的封装,可以看看 vinyl 是如何描述一个或一组文件的:

var File = require("vinyl");

var coffeeFile = new File({
  cwd: "/",
  base: "/test/",
  path: "/test/file.coffee",
  contents: new Buffer("test = 123")
});

除了 vinyl ,vinyl-fs 还需要依赖 glob-stream 读写文件流,如图:

glob-stream

大家可能有疑问,读写文件流,为什么不用 nodejs 内核的 steam 类来读写呢,骚安勿燥,Gulp 既然是基于 nodejs 构建,最终自然也是依赖 nodejs 内核实现它的功能的。

只是,stream 类读取文件流只针对一个文件路径,glob-stream 就是实现从获取 glob 模式匹配文件集,到转换成文件路径,再到读取,还是有一段距离的。如图:

glob-stream 通过 minimatch 来进行 glob 模式匹配,通过其他路径模块,获得一组文件路径,然后就是 ordered-read-streams 发光发热时候啦,对这组文件路径一个个地读啊,然后就获得一组文件流啦。

好啦,终于分析完 Gulp 的实现,通过对其中模块的阅读,其实 Nodejs 模块有点像乐高积木,内核给出的就是最基本的积木啦,不过你可以无限次使用它们,来堆出一个个小的物体,通过小小的物体组合,来组成非常徇丽多姿的乐高作品啦~

当然,也是有一些 c++ 实现的nodejs模块,主要是用于一些需要高性能运算的地方,不过npmjs.org上介绍到的模块,大部分的依赖都是基于 nodejs 内核实现滴。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86176.html

相关文章

  • 简简单单学习gulp入门使用

    摘要:的使用首先,我们需要在官网下载插件,地址如下在这个网站我们可以寻找到自己需要的插件以为例,然后在项目下打开命令提示行,输入以下命令然后我们在里输入一下代码引入插件调用插件输出位置 gulp的入门与使用 安装 使用 gulp的入门 安装 安装gulp需要使用到nodo.js,安装链接如下:http://jingyan.baidu.com/arti... 安装完成之后我们以全局安装gu...

    meteor199 评论0 收藏0
  • gulp 入门配置

    摘要:使用进行本地开发自动刷新,配合对和进行压缩处理,最终打包到目录安装以及其他插件代码示例安装依赖本地安装所用到的地方同步执行任务获取组件是否开启浏览器提示端口监听目录下所有文件清楚目录下所有文件定 使用 browser-sync 进行本地开发自动刷新,配合gulp-uglify、gulp-minify-css对js和css进行压缩处理,最终打包到dist目录 安装gulp 以及其他插件 ...

    AlienZHOU 评论0 收藏0
  • gulp入门

    摘要:通过输入文件流,将文件写入硬盘,并输出所有数据,能继续向下游,所以文件流可以继续被处理并被写入到其他地方。如果写入文件夹不存在,就会创建它。第二个参数,当前任务依赖的任务列表,依赖任务在当前任务运行之前完成。 gulp 简介 用自动化构建工具增强你的工作流程。 通过代码优于配置的策略,Gulp 让简单的任务简单,复杂的任务可管理。 利用 Node.js 流的威力,你可以快速构建项目并...

    kycool 评论0 收藏0
  • Glup快速入门整理

    摘要:下载打包插件引入引入的插件是个方法,必须记住调用。神来之笔其他的插件不用再引入了使用方法所有的插件用引出,其他插件的方法名统一为插件的功能名字即插件名字的最后一部分如将转换为将转换为的文件输出到下实时刷新 Gulp介绍 中文主页: http://www.gulpjs.com.cn/ gulp是与grunt功能类似的前端项目构建工具, 也是基于Nodejs的自动任务运行器 能自动化...

    HmyBmny 评论0 收藏0
  • Glup快速入门整理

    摘要:下载打包插件引入引入的插件是个方法,必须记住调用。神来之笔其他的插件不用再引入了使用方法所有的插件用引出,其他插件的方法名统一为插件的功能名字即插件名字的最后一部分如将转换为将转换为的文件输出到下实时刷新 Gulp介绍 中文主页: http://www.gulpjs.com.cn/ gulp是与grunt功能类似的前端项目构建工具, 也是基于Nodejs的自动任务运行器 能自动化...

    jhhfft 评论0 收藏0

发表评论

0条评论

ShevaKuilin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<