Gulp, 比Grunt更好用的前端构建工具
Gulp, 比Grunt更好用的前端构建工具
本文主要从两个方面介绍Gulp:一,Gulp相对于Grunt的优势; 二,Gulp的安装和使用流程
Gulp相对于Grunt的优势
gulp.js 的作者 Eric Schoffstall 在他介绍 gulp.js 的 presentation 中总结了 Grunt 的几点不足之处:
插件很难遵守单一责任原则。因为 Grunt 的 API 设计缺憾,使得许多插件不得不负责一些和其主要任务无关的事情。比如说要对处理后的文件进行更名操作,你可能使用的是
uglify
插件,也有可能使用的是concat
插件(取决于工作流的最后一个环节是谁)。我的看法:这或许是个问题,对很多人来说 Grunt 插件多少存在“职责不明”和“越俎代庖”的情况。在我看来,这也是 Grunt 一个设计思想:把对文件的操作抽象为一个独立的组件(Files),任何插件都以相同的规则来使用它。遗憾在于,使用它的过程发生在每个插件的独立配置对象里,所以总给人一种“把不该这个插件做的事情丢给它来做”的别扭感觉。
用插件做一些本来不需要插件来做的事情。因为 Grunt 提供了统一的 CLI 入口,子任务由插件定义,由 CLI 命令来调用执行,因此哪怕是很简单的外部命令(比如说运行
karma start
)都得有一个插件来负责封装它,然后再变成 Grunt CLI 命令的参数来运行,多此一举。我的看法:举双手双脚赞成!
试图用配置文件完成所有事,结果就是混乱不堪。规模较大,构建/分发/部署流程较为复杂的项目,其
Gruntfile
有多庞杂相信有经历的人都有所体会。而 gulp.js 奉行的是“写程序而不是写配置”,它走的是一种 node way。我的看法:对于 node.js 开发者来说这是好事,符合他们的一贯作风;不过对于那些纯前端工程师来说(数量不小),这似乎没有什么显著的改善。况且近来 Grunt 社区涌现了不少插件来帮助开发者组织/管理/简化臃肿的
Gruntfile
,效果都还不错。所以关于这一点,就见仁见智吧。落后的流程控制产生了让人头痛的临时文件/文件夹所导致的性能滞后。这是 gulp.js 下刀子的重点,也是本标题里“流式构建”所解决的根本问题。流式构建改变了底层的流程控制,大大提高了构建工作的效率和性能,给用户的直观感觉就是:更快。
我的看法:关于流式构建,短短几句话无法讲清它的来龙去脉,但是在 node.js 的世界里,
streaming
确实是至关重要的。我推荐一份阅读材料:Stream Handbook,读过之后相信心里就有数了。
作为对比和总结,作者列出了 gulp.js 的五大特点:
- 使用 gulp.js,你的构建脚本是代码,而不是配置文件;
- 使用标准库(node.js standard library)来编写脚本;
- 插件都很简单,只负责完成一件事-基本上都是 20 行左右的函数;
- 任务都以最大的并发数来执行;
- 输入/输出(I/O)是基于“流式”的。
Gulp的安装和使用流程
第一步:安装命令行工具
$ 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 () {
});
第四步:运行!
var gulp = require('gulp'); gulp.task('default', function () {
});
So far so good! 看起来和 Grunt 没差太远吧?的确如此,gulp.js 的学习曲线还是相当平缓的。接下来,为了能够顺利的编写构建脚本,我们来学习几个核心的 API 函数——别担心,gulp.js 的 API 非常简单,我们只需要了解四个就足以应对绝大多数的脚本编写了(而且用过 Grunt 的话,这四个都不是什么新鲜货)。
gulp.task(name[, deps], fn)
:注册任务name
是任务名称;deps
是可选的数组,其中列出需要在本任务运行要执行的任务;fn
是任务体,这是 gulp.js 的核心了,需要花时间吃透它,详情见此。gulp.src(globs[, options])
:指明源文件路径
用过 Grunt 的话,globs
一定不会陌生,这里没什么变化;options
是可选的,具体请查看 gulp.js APIgulp.dest(path)
:指明任务处理后的目标输出路径gulp.watch(glob[, options], tasks)/gulp.watch(glob[, options, cb])
:监视文件的变化并运行相应的任务。你没看错,watch
作为核心 API 出现在 gulp.js 里了,具体用法还是要多看文档,不过接下来我们会演示简单的例子。
范例
我们练习一个最常见的范例,写一个 node.js 程序时所需要的构建脚本。为此我们要做三件事情(括号内列出对应插件的名字,更多插件请到此处寻找):
- 语法检查 (
gulp-jshint
) - 合并文件 (
gulp-concat
) - 压缩代码 (
gulp-uglify
) - 文件重命名(
gulp-rename
)
另外,我们可能还需要文件更名操作,所以 gulp-rename
也会很有用。接着我们需要先在项目下安装这些插件:
$ npm install <PLUGIN_NAME> --save-dev
最后我们完成所有任务的编写,完整的代码如下:
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 完成绝大多数的构建工作了。下一步,我也为你准备了几条建议:
- 花点时间浏览一下 gulp.js 插件库,大致了解下利用已有的插件你都可以做哪些事情
- 对于常用的插件,仔细阅读它们自己的文档,以便发挥出它们最大的功效
- 抽时间学习 gulp.js API,特别是
gulp.task()
里关于任务体的详细描述,学会如何执行回调函数(callback),如何返回promise
等等 - 尝试编写适合自己工作流程和习惯的任务,如果它工作良好,把它做成插件发布给大家吧!
Gulp, 比Grunt更好用的前端构建工具的更多相关文章
- Gulp.js----比Grunt更易用的前端构建工具
Gulp.js----比Grunt更易用的前端构建工具 Grunt一直是前端构建工具,然而他也不是毫无缺陷的,gulp的作者 Eric Schoffstall 在他介绍 gulp.js 的 prese ...
- Gulp前端构建工具
Gulp, 比Grunt更好用的前端构建工具 Gulp, 比Grunt更好用的前端构建工具 本文主要从两个方面介绍Gulp:一,Gulp相对于Grunt的优势: 二,Gulp的安装和使用流程 Gulp ...
- Gulp vs Grunt 前端构建工具对比
Gulp vs Grunt 前端工程的构建工具对比 1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Jav ...
- 前端构建工具之gulp(一)「图片压缩」
前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...
- 前端构建工具gulp介绍
2016年3月3日 10:46:08 晴 前端构建工具gulpjs的使用介绍及技巧 gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简 ...
- 前端构建工具gulp之基本介绍
1.基本介绍 gulp.js是一个自动化构建工具,是自动化项目的构建利器.可以对网站的资源进行优化,将开发过程中一些重复的任务通过执行命令自动完成.这样能很大的提高我们的工作效率. gulp.js是基 ...
- 前端构建工具 Gulp.js 上手实例
在软件开发中使用自动化构建工具的好处是显而易见的.通过工具自动化运行大量单调乏味.重复性的任务,比如图像压缩.文件合并.代码压缩.单元测试等等,可以为开发者节约大量的时间,使我们能够专注于真正重要的. ...
- 前端读者 | 前端构建工具Gulp
@羯瑞 整理 前言 前端工具现在层出不穷,网上搜下一大片,就看你怎么去使用了,基于项目看用什么样的构建工具.有的工具提供的功能还是非常强大的. FIS.百度团队的产品.现在百度的多个产品中使用.面向前 ...
- 前端构建工具gulp使用
前端自动化流程工具,用来合并文件,压缩等. Gulp官网 http://gulpjs.com/ Gulp中文网 http://www.gulpjs.com.cn/ Gulp中文文档 https://g ...
随机推荐
- 20135202闫佳歆--week 8 进程的切换和系统的一般执行过程--学习笔记
此为个人笔记存档 week 8 进程的切换和系统的一般执行过程 一.进程调度与进程切换 1.不同的进程有不同的调度需求 第一种分类: I/O密集型(I/O-bound) 频繁的进行I/O 通常会花费很 ...
- Core Data 概述
Core Data是一个模型层的技术.Core Data帮助你建立代表程序状态的模型层.Core Data也是一种持久化技术,它能将模型对象的状态持久化到磁盘,但它最重要的特点是:Core Data不 ...
- mac 80端口映射 配置
mac 80端口映射 配置 macbook 下,要绑定 80 端口的话. 一种方式是用 root 权限启动,即 sudo 启动服务进程.但 sudo 指令存在一定的安全问题,能不使用的情况下我们都尽量 ...
- WebGame开发总结
不知不觉我们的项目开发有2年了,这两年来走了很多弯路,也收获了很多,今天在这里做一个总结. 项目基本情况: 服务器端采用c++和c#混合开发,网络层采用c++开发,业务逻辑用c#开发.客户端采用sil ...
- Newtonsoft.Json之JArray, JObject, JPropertyJValue
JObject staff = new JObject(); staff.Add(new JProperty("Name", "Jack")); staff.A ...
- javamail技术
package com.zh.javaEmail; import java.util.*; import javax.mail.*; import javax.mail.internet.*; imp ...
- myeclipse6.0 序列号生成器源码
import java.io.*; public class Test{ private static final String LL = "Decompiling this copyrig ...
- Spring 事物机制
Spring两种事物处理机制,一是声明式事物,二是编程式事物 声明式事物 1)Spring的声明式事务管理在底层是建立在AOP的基础之上的. 其本质是对方法前后进行拦截,然后在目标方法开始之前创建或 ...
- 该如何理解AMD ,CMD,CommonJS规范--javascript模块化加载学习总结
是一篇关于javascript模块化AMD,CMD,CommonJS的学习总结,作为记录也给同样对三种方式有疑问的童鞋们,有不对或者偏差之处,望各位大神指出,不胜感激. 本篇默认读者大概知道requi ...
- 与Java Web Service相关的若干概念(JAX-WS,JAX-RS)
WS ,JAX-WS ,JAX-RS,REST,Restlet,SOAP l JWS: 是指与webservice相关的J2EE(其实现在应该叫做Java EE吧)技术叫做 JWS(全称就是 jav ...