“流式”前端构建工具——gulp.js 简介

Grunt 一直是前端领域构建工具(任务运行器或许更准确一些,因为前端构建只是此类工具的一部分用途)的王者,然而它也不是毫无缺陷的,近期风头正劲的 gulp.js 隐隐有取而代之的态势。那么,究竟是什么使得 gulp.js 备受关注呢?

Grunt 之殇

gulp.js 的作者 Eric Schoffstall 在他介绍 gulp.js 的 presentation 中总结了 Grunt 的几点不足之处:

  1. 插件很难遵守单一责任原则。因为 Grunt 的 API 设计缺憾,使得许多插件不得不负责一些和其主要任务无关的事情。比如说要对处理后的文件进行更名操作,你可能使用的是 uglify 插件,也有可能使用的是 concat 插件(取决于工作流的最后一个环节是谁)。

    我的看法:这或许是个问题,对很多人来说 Grunt 插件多少存在“职责不明”和“越俎代庖”的情况。在我看来,这也是 Grunt 一个设计思想:把对文件的操作抽象为一个独立的组件(Files),任何插件都以相同的规则来使用它。遗憾在于,使用它的过程发生在每个插件的独立配置对象里,所以总给人一种“把不该这个插件做的事情丢给它来做”的别扭感觉。

  2. 用插件做一些本来不需要插件来做的事情。因为 Grunt 提供了统一的 CLI 入口,子任务由插件定义,由 CLI 命令来调用执行,因此哪怕是很简单的外部命令(比如说运行 karma start)都得有一个插件来负责封装它,然后再变成 Grunt CLI 命令的参数来运行,多此一举。

    我的看法:举双手双脚赞成!

  3. 试图用配置文件完成所有事,结果就是混乱不堪。规模较大,构建/分发/部署流程较为复杂的项目,其 Gruntfile 有多庞杂相信有经历的人都有所体会。而 gulp.js 奉行的是“写程序而不是写配置”,它走的是一种 node way

    我的看法:对于 node.js 开发者来说这是好事,符合他们的一贯作风;不过对于那些纯前端工程师来说(数量不小),这似乎没有什么显著的改善。况且近来 Grunt 社区涌现了不少插件来帮助开发者组织/管理/简化臃肿的 Gruntfile,效果都还不错。所以关于这一点,就见仁见智吧。

  4. 落后的流程控制产生了让人头痛的临时文件/文件夹所导致的性能滞后。这是 gulp.js 下刀子的重点,也是本标题里“流式构建”所解决的根本问题。流式构建改变了底层的流程控制,大大提高了构建工作的效率和性能,给用户的直观感觉就是:更快。

    我的看法:关于流式构建,短短几句话无法讲清它的来龙去脉,但是在 node.js 的世界里,streaming 确实是至关重要的。我推荐一份阅读材料:Stream Handbook,读过之后相信心里就有数了。

作为对比和总结,作者列出了 gulp.js 的五大特点:

  1. 使用 gulp.js,你的构建脚本是代码,而不是配置文件;
  2. 使用标准库(node.js standard library)来编写脚本;
  3. 插件都很简单,只负责完成一件事-基本上都是 20 行左右的函数;
  4. 任务都以最大的并发数来执行;
  5. 输入/输出(I/O)是基于“流式”的。

gulp.js 之道

gulp.js 的官方文档都在 Github 上,本文是一个简介,更具体的细节还请自行阅读文档。在这里我就 gulp.js 的安装和使用流程做一个简述,先一起来领略一下 gulp.js 的风采吧。

第一步:安装命令行工具

$ npm install -g gulp

第二步:在你的项目下把 gulp 安装为开发依赖组件(假设你已经创建好了 package.json

$ cd <YOUR_PROJECT>
$ npm install gulp --save-dev

第三步:在项目的根路径下创建 Gulpfile.js,初始内容为:

var gulp = require(‘gulp‘);

gulp.task(‘default‘, function () {
});

第四步:运行!

$ gulp

So far so good! 看起来和 Grunt 没差太远吧?的确如此,gulp.js 的学习曲线还是相当平缓的。接下来,为了能够顺利的编写构建脚本,我们来学习几个核心的 API 函数——别担心,gulp.js 的 API 非常简单,我们只需要了解四个就足以应对绝大多数的脚本编写了(而且用过 Grunt 的话,这四个都不是什么新鲜货)。

范例

我们练习一个最常见的范例,写一个 node.js 程序时所需要的构建脚本。为此我们要做三件事情(括号内列出对应插件的名字,更多插件请到此处寻找):

  1. 语法检查(gulp-jshint
  2. 合并文件(gulp-concat
  3. 压缩代码(gulp-uglify

另外,我们可能还需要文件更名操作,所以 gulp-rename 也会很有用。接着我们需要先在项目下安装这些插件:

$ npm install

最后我们完成所有任务的编写,完整的代码如下:

var gulp = require(‘gulp‘);
var jshint = require(‘gulp-jshint‘);
var concat = require(‘gulp-concat‘);
var uglify = require(‘gulp-uglify‘);
var rename = require(‘gulp-rename‘);

// 语法检查
gulp.task(‘jshint‘, function () {
    return gulp.src(‘src/*.js‘)
        .pipe(jshint())
        .pipe(jshint.reporter(‘default‘));
});

// 合并文件之后压缩代码
gulp.task(‘minify‘, function (){
     return gulp.src(‘src/*.js‘)
        .pipe(concat(‘all.js‘))
        .pipe(gulp.dest(‘dist‘))
        .pipe(uglify())
        .pipe(rename(‘all.min.js‘))
        .pipe(gulp.dest(‘dist‘));
});

// 监视文件的变化
gulp.task(‘watch‘, function () {
    gulp.watch(‘src/*.js‘, [‘jshint‘, ‘minify‘]);
});

// 注册缺省任务
gulp.task(‘default‘, [‘jshint‘, ‘minify‘, ‘watch‘]);

可以看出,基本上所有的任务体都是这么个模式:

gulp.task(‘任务名称‘, function () {
    return gulp.src(‘文件‘)
        .pipe(...)
        .pipe(...)
        // 直到任务的最后一步
        .pipe(...);
});

非常容易理解!获取要处理的文件,传递给下一个环节处理,然后把返回的结果继续传递给下一个环节……直到所有环节完成。pipe 就是 stream 模块里负责传递流数据的方法而已,至于最开始的 return 则是把整个任务的 stream 对象返回出去,以便任务和任务可以依次传递执行。

或许写成这样会更直观:

gulp.task(‘task_name‘, function () {
    var stream = gulp.src(‘...‘)
        .pipe(...)
        .pipe(...)
        // 直到任务的最后一步
        .pipe(...);
    return stream;
});

至此,你已经可以使用 gulp.js 完成绝大多数的构建工作了。下一步,我也为你准备了几条建议:

  1. 花点时间浏览一下 gulp.js 插件库,大致了解下利用已有的插件你都可以做哪些事情
  2. 对于常用的插件,仔细阅读它们自己的文档,以便发挥出它们最大的功效
  3. 抽时间学习 gulp.js API,特别是 gulp.task() 里关于任务体的详细描述,学会如何执行回调函数(callback),如何返回 promise 等等
  4. 尝试编写适合自己工作流程和习惯的任务,如果它工作良好,把它做成插件发布给大家吧!
时间: 2024-08-04 14:14:06

“流式”前端构建工具——gulp.js 简介的相关文章

前端构建工具gulp.js的使用介绍及技巧

一.gulp的安装 1.首先确保已经安装了node.js的环境,然后以全局的方式安装gulp 全局安装gulp--->>>npm install -g gulp 2.全局安装后,切换到gulp项目中在单独安装一次,将目录切换到gulp项目中去 局域安装gulp--->>>npm install gulp 3.安装依赖,即在安装的时候把gulp写进项目package.json文件的依赖中 npm install --save-dev gulp 二.开始使用gulp 1.和

记学习前端构建工具gulp的过程,略心酸

初学前端的时候就听过友人说,前端不好学,很多软件都是要自己下载安装插件的,当时是很不以为然的,不就是下载几个软件外加安装插件吗?!怎么会很难呢!后面才发现自己真的错了. 今天刚好准备好好看看前端构建工具gulp的使用,于是乎就各种上网查资料.刚开始的时候有点摸不着头脑,这个东西不是一个软件,拿来就用,需要自己配置环境,自己根据需求安装package,完全是自己DIY的一个工具. 下面就把整个安装过程,记录下来,方便以后查看吧. 先明确几个概念:1.gulp是基于node.js环境下工作的:2.命

(转载)前端构建工具gulp使用

前端构建工具gulp使用 前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中文文档 https://github.com/lisposter/gulp-docs-zh-cn Gulp插件网 http://gulpjs.com/plugins/ Awesome Gulp https://github.com/alferov/awesome-gulp StuQ-Gulp实战和原

(转)前端构建工具gulp入门教程

前端构建工具gulp入门教程 老婆婆 1.8k 2013年12月30日 发布 推荐 10 推荐 收藏 83 收藏,20k 浏览 本文假设你之前没有用过任何任务脚本(task runner)和命令行工具,一步步教你上手Gulp.不要怕,它其实很简单,我会分为五步向你介绍gulp并帮助你完成一些惊人的事情.那就直接开始吧. 第一步:安装Node 首先,最基本也最重要的是,我们需要搭建node环境.访问http://nodejs.org,然后点击大大的绿色的install按钮,下载完成后直接运行程序,

自动化前端构建工具--gulp

Gulp是一个基于任务的javascript工程命令行流式构建工具.为什么要用Gulp呢?前端开发进入到工程化阶段,我们需要压缩合并文件,加MD5戳:如果使用 CoffeeScript/ES6 去代替 Javascript,那么需要编译成jacascript:如果使用less或者sass,需要编译成css.所有的这些操作,在修改文件后,都要重新执行一遍,非常的繁琐.Gulp就是为我们完成这一套重复而机械的工作的.他可以在自动检测文件,每次发生修改,自动编译打包等. 下面介绍用法. 首先安装gul

前端自动化工具 -- gulp 使用简介

gulp是基于流的前端自动化构建工具. 之前也谈到了 grunt的用法,grunt其实就是配置+配置的形式. 而gulp呢,是基于stream流的形式,也就是前一个函数(工厂)制造出结果,提供后者使用. 同样的,也是包括基本用法和各插件的使用. 一.环境配置 gulp是基于nodejs的,所以没有 nodejs 环境的要先去安装好 然后给系统配上gulp环境 npm install -g gulp 再到某一工程目录下 跟grunt一般,也是需要package.json包依赖文件和一个入口文件 g

前端构建工具gulp

前段时间做一个项目,试着用gulp来构建前端代码.今天简单总结了一下: 一:安装gulp环境 1. 安装node 在node官方文档下载匹配的版本  我下载的是如下图的版本.http://nodejs.cn/download/ 下载好以后, 可以一直点击下一步,进行默认安装 安装好以后,在控制台输入cmd,打开命令提示符,输入node -v  查看node是否安装成功以及node的版本. 2.全局安装gulp 在命令提示符中时输入 npm install gulp -g 二:项目流程 1.生成项

前端构建工具gulp的使用

前言:之前一直说着做项目的时候要用gulp ,webpack,结果实习后一直用thinkphp之后就不怎么接触,不会用gulp/webpack,总觉得不是一个合格的前端开发工作者呀! 最近做毕设用的是nodejs 的express,gulp使用的是nodejs中stream来读取和操作数据,所以有nodejs的基础的话,gulp非常容易理解 一,gulp的安装 首先要确保安装好了nodejs的环境,然后以全局的方式安装gulp npm install -g gulp 全局安装后,还要在每个要使用

前端构建工具gulp使用

因为之前一直有人给我推荐gulp,说他这里好哪里好的.实际上对我来说够用就行.grunt熟悉以后实际上他的配置也不难,说到效率的话如果真是要完整打包上线也不在乎那么几秒时间,对于项目来说线上效率关键,但是线下效率只要不是让人无法忍受页没有太多问题.不过不管怎么说,需要亲自用过gulp之后才能品评他和grunt之间的优劣. 一:安装gulp环境 1. 安装node 在node官方文档下载匹配的版本  我下载的是如下图的版本.http://nodejs.cn/download/ 下载好以后, 可以一