gulp怎么一次性完成gulp 多个任务务

是时候把你的 Gulp 升级到 4.0 了 - WEB前端 - 伯乐在线
& 是时候把你的 Gulp 升级到 4.0 了
不得不说的废话
随着前端工程化的推进,相信越来越多的项目都用上了自动化构建。
对前端构建来说,使用最多的莫过于和。
本文的主角是gulp,所以花一两句话来介绍gulp还是有必要的。
gulp是一款基于的前端构建工具,由于底层使用stream,可以将多个任务无缝串连在一起,相比使用临时文件的grunt要快不少;同时也不用像grunt一样写一大堆配置文件,每一个任务都可以可编程的来完全控制逻辑。
gulp比grunt“快”这是公认的事实,这里不再过多比较两者之间的差异,还是那句话,各有千秋吧。
gulp 4.0的变化
扯完了废话,开始进入正题。
gulp团队大概在两个月前提交了,新版本带来了新的api,新api给任务流程控制带来了“革命性”的进步。
但新版本并未提交到npm,可能现在连alpha都算不上吧,不过还是可以先进行体验的。
安装gulp 4.0
想体验4.0只有通过github安装,执行以下两条命令即可在本地畅爽地使用gulp 4.0了。
npm install gulpjs/gulp#4.0 -g
npm install gulpjs/gulp#4.0 --save-dev
gulp 4.0相对以前的版本发生了不少变化
使用新的任务系统bach,替换了老版本使用的orchestrator
也许会更快些?实际上gulp已经很快了,除非是超大型项目,否则几乎不用担心gulp构建会花太多时间,不过寻求更快总是好的。
移除了gulp.task传递三参数的用法
即这种用法将报错
JavaScript
gulp.task('watch', ['default'], function() {
// watch file
gulp.task('watch', ['default'], function() {&&&&// TODO&&&&// watch file});
在gulp4.0之前,这种用法将会保证default任务先执行完再执行watch任务,gulp的任务流程控制就是这么实现的,不过这也是老版本gulp的弱点之一。
对我们这些普通使用者来说,最大的变化有两点
gulp.task的变化
gulp官方建议:
当我们想在命令行通过敲gulp taskname的方式执行一个任务,这时候你应该使用gulp.task注册taskName
当一个较复杂的任务(如dist)由很多个子任务组合而成的时候,子任务使用具名函数即可,不用单独为每个子任务进行注册,而只需将dist使用gulp.task进行注册,以前的版本则必须将每一个子任务都先使用gulp.task进行注册,然后再组合出dist,详细用法见最后的例子。
gulp.task又增加了一种用法,即传递一个具名函数作为参数,将自动注册以该函数名命名的任务
JavaScript
function compile() {
gulp.src('./src/*.js')
.pipe(uglify())
.pipe(gulp.dest('./dist/js'))
gulp.task(compile);
function compile() {&&&&// TODO&&&&gulp.src('./src/*.js')&&&&&&&&.pipe(uglify())&&&&&&&&.pipe(gulp.dest('./dist/js'))}gulp.task(compile);
JavaScript
gulp.task('compile', function() {
gulp.src('./src/*.js')
.pipe(uglify())
.pipe(gulp.dest('./dist/js'))
gulp.task('compile', function() {&&&&// TODO&&&&gulp.src('./src/*.js')&&&&&&&&.pipe(uglify())&&&&&&&&.pipe(gulp.dest('./dist/js'))});
两者都可以通过命令行运行gulp compile执行任务
增加了gulp.series和gulp.parallel
哈哈,解放军来了。
如果你是gulp深度使用者,你一定不止一次吐槽过gulp的任务流程难以控制,就像一条复杂的电路一样,电路上很多电阻都是串联加并联的方式连接在一起,gulp一个复杂的任务同样也是由很多个子任务以串联(同步)加并联(异步)的方式连接在一起的。
老版本的gulp对多个异步任务很难控制,必须借助于第三方模块,如run-sequence、event-stream等,效果也并不理想。
现在gulp带来了两个新的api:gulp.series和gulp.parallel,这两个革命性的api将帮助开发者解决恼人的任务流程控制问题。
下面就来见识新api的神奇之处吧。
以开发中最常见的dist任务为例,使用gulp首先得分解任务,dist大致分解成子任务如下
删除开发目录dev,clean-dev
删除发布目录dist,clean-dist
合图并修改css中图片引用,sprite
预编译css(如sass)到dev,compile-css
预编译js到dev,compile-js
从src拷贝html到dev,copy-html
对dev下面的js/css进行md5,再拷贝到dist,reversion
替换dev下html中js/css进行过md5之后的文件路径,并拷贝到dist,replcae
这只是一个普通的dist任务,我将dist拆得比较细并省略了压缩合并等常规任务,大致由以上8个步骤组成。
拆的粒度完全由自己控制,达到方便复用又便于理解的目的就行。
使用老版本的gulp,首先需要对每一个任务进行注册,这里只是为了说明问题,我省略了任务的具体代码。
JavaScript
gulp.task('clean-dev', function() {// TODO});
gulp.task('clean-dist', function() {// TODO});
gulp.task('sprite', function() {// TODO});
gulp.task('compile-css', function() {// TODO});
gulp.task('compile-js', function() {// TODO});
gulp.task('copy-html', function() {// TODO});
gulp.task('reversion', function() {// TODO});
gulp.task('replcae', function() {// TODO});
gulp.task('clean-dev', function() {// TODO});gulp.task('clean-dist', function() {// TODO});gulp.task('sprite', function() {// TODO});gulp.task('compile-css', function() {// TODO});gulp.task('compile-js', function() {// TODO});gulp.task('copy-html', function() {// TODO});gulp.task('reversion', function() {// TODO});gulp.task('replcae', function() {// TODO});
然后,我们来理一理任务的流程,为了让任务执行效率更高,尽量保证能同时执行的都同时执行,这里简单画了个流程图来表示任务的流程,箭头表示先后顺序。
可以看到图中既存在同步又存在异步的任务,需要实现这样的流程,我们还需要修改和注册额外的几个任务,并借助run-sequence等第三方模块。
JavaScript
gulp.task('compile-css', ['sprite']);
gulp.task('dev', ['clean-dev'], function() {
runSecquence(['compile-css', 'compile-js', 'copy-html']);
gulp.task('md5', ['dev', 'clean-dist'], function() {
runSecquence('reversion');
gulp.task('dist', ['md5'], function() {
runSecquence('replcae');
12345678910
gulp.task('compile-css', ['sprite']);gulp.task('dev', ['clean-dev'], function() {&&&&runSecquence(['compile-css', 'compile-js', 'copy-html']);});gulp.task('md5', ['dev', 'clean-dist'], function() {&&&&runSecquence('reversion');});gulp.task('dist', ['md5'], function() {&&&&runSecquence('replcae');});
gulp官方推荐将任务最小化,每一个任务只做一件明确的事,可以看到任务拆得越细需要注册的任务就越多,为了处理同时涉及到同步和异步的任务,需要引进额外的中间任务来衔接,在代码上也不够自然。
如果使用gulp 4.0,只用这样就行了
JavaScript
function cleanDev() {// TODO}
function cleanDist() {// TODO}
function sprite() {// TODO}
function compileCss() {// TODO}
function compileJs() {// TODO}
function copyHtml() {// TODO}
function reversion() {// TODO}
function replcae() {// TODO}
gulp.task('dist', gulp.series(
gulp.parallel(
gulp.series(
gulp.parallel(
gulp.series(
compileCss
compileJs,
reversion,
123456789101112131415161718192021222324252627
function cleanDev() {// TODO}function cleanDist() {// TODO}function sprite() {// TODO}function compileCss() {// TODO}function compileJs() {// TODO}function copyHtml() {// TODO}function reversion() {// TODO}function replcae() {// TODO}&gulp.task('dist', gulp.series(&&&&gulp.parallel(&&&&&&&&gulp.series(&&&&&&&&&&&&cleanDev,&&&&&&&&&&&&gulp.parallel(&&&&&&&&&&&&&&&&gulp.series(&&&&&&&&&&&&&&&&&&&&sprite,&&&&&&&&&&&&&&&&&&&&compileCss&&&&&&&&&&&&&&&&),&&&&&&&&&&&&&&&&compileJs,&&&&&&&&&&&&&&&&copyHtml&&&&&&&&&&&&)&&&&&&&&),&&&&&&&&cleanDist&&&&),&&&&reversion,&&&&replcae));
gulp.series和gulp.parallel都可以接受以gulp.task注册的任务名干脆就是一个(多个)函数,省去了一大堆gulp.task的代码,同时也达到了任务复用的目的,将子任务经过不同的组合又可以产生新的任务。
结合流程图,上面的代码还是很好理解的。
另外再说一点,只要在gulpfile.js中没有使用gulp.task传三个参数的用法,gulp 4.0也是兼容老版本的gulpfile.js的。
中也列出了一些其他的说明,想升级到4.0又想完全兼容老版本gulpfile.js的开发者最好还是看看咯。
可能感兴趣的话题
o 176 回复
关于伯乐前端
伯乐前端分享Web前端开发,包括JavaScript,CSS和HTML5开发技术,前端相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线Gulp简易入门~
作者: hiweb.cc
Gulp是一款基于Node.js开发的“简单高效”的前端自动化构建工具(/);
前端自动化构建工具主要解决以下一些问题前端开发问题(说的简单一点就是解决前端开发中代码调试和部署的问题):
代码压缩(CSS、JavaScript)
文件合并(CSS、JavaScript)
图片压缩优化
文件复制、移动
更改页面文件引用路径、MD5戳、时间戳
前端模板引擎
CSS预处理器编译(SASS、LESS等)
前端模块化
和Gulp同类的工具还有很多,例如Grunt、FIS、Mod.js、Ant等等,但是最具代表性和最流行的还是Grunt和Gulp,这两个工具安装大同小异,主要是配置文件上有很大的不同:
Grunt的配置文件编写难度较高、Gulp配置语法则要简单一些,当然如果要配置一个大型项目的话,都有些复杂
Grunt在构建过程中会产生一些临时文件,A任务处理完会生成一个临时文件,B任务会读取这个临时文件,继续做自己的操作,然后再生成一个临时文件,给C任务用,以此类推,其它任务可能会基于临时文件再做处理并生成最终的构建后文件;Gulp的优势就是利用Node.js中流的方式进行文件的处理,通过管道将多个任务和操作连接起来,因此只有一次I/O的过程,处理速度要更快,通过下图你可以很清晰的了解两个工具在处理流程上的差异
安装Node.js(https://nodejs.org),Gulp是基于Node.js构建的
打开命令行工具(window下的dos、mac下的Terminal)
执行 npm install -g cnpm --registry=https://registry.npm.taobao.org 切换到淘宝npm镜像(npm下载速度好慢),用cnpm代替npm命令,详细见http://npm.taobao.org/
执行 cnpm install gulp -g 安装Gulp到全局
命令行里切到项目目录下,例如D:\gulp ,执行d: 后 再执行 cd gulp
执行 cnpm init 依次填写项目信息后会在根目录创建一个package.json的文件,用于管理依赖,如果不懂填写信息的意思就一路回车键即可
执行 cnpm install gulp --save-dev 将Gulp安装到项目根目录,--save-dev意思是将要安装的Gulp作为项目依赖保存到package.json中
不要关闭命令行工具,然后在项目根目录新建一个Gulpfile.js的文件
打开Gulpfile.js后,写入以下代码
var gulp = require('gulp');
gulp.task('default', function() {
console.log('ok');
然后在命令行工具中执行gulp,如果输出了ok表示任务执行成功
Gulp主要就4个api,分别是gulp.task()定义任务,gulp.src()获取内容,gulp.dest()输出内容,gulp.watch()监听内容变化
为什么只有这几个api而已?那如何做到文章开头的那些功能呢?看看Gulp的构建流程就知道了:
首先通过task方法定义一个任务,任务中用src方法获取到要处理的文件,然后把获取到的文件内容交由第三方插件处理,接着再通过dest方法输出到指定目录(像一条管道一样),我们还可以通过wacth方法让某个文件内容变换时自动执行指定的任务。由此可以看出Gulp本身的功能是十分简单的,真正强大的是这之间处理内容的插件,Gulp提供了各式各样的插件,可以参见/plugins/
Gulp的api可以查看文档,都比较容易理解
.cn/docs/api/
上一篇: 没有了gulp详细入门教程
Ooo_My_God发表于 分类: 阅读(18895) 评论()
简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器;她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;使用她,我们不仅可以很愉快的编写代码,而且大大提高我们的工作效率。
gulp是基于Nodejs的自动任务运行器, 她能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的这些步骤。在实现上,她借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入,使得在操作上非常简单。通过本文,我们将学习如何使用Gulp来改变开发流程,从而使开发更加快速高效。 gulp 和 grunt 非常类似,但相比于 grunt 的频繁 IO 操作,gulp 的流操作,能更快地更便捷地完成构建工作。 本示例以gulp-less为例(将less编译成css的gulp插件)展示gulp的常规用法,只要我们学会使用一个gulp插件后,其他插件就差看看其帮助文档了。让我们一起来学习gulp吧! ^_^ gulp常用地址: gulp官方网址: gulp插件地址: gulp 官方API: gulp 中文API: 目录:
在学习前,先谈谈大致使用gulp的步骤,给读者以初步的认识。首先当然是安装nodejs,通过nodejs的npm全局安装和项目安装gulp,其次在项目里安装所需要的gulp插件,然后新建gulp的配置文件gulpfile.js并写好配置信息(定义gulp任务),最后通过命令提示符运行gulp任务即可。 安装nodejs -& 全局安装gulp -& 项目安装gulp以及gulp插件 -& 配置gulpfile.js -& 运行任务 1、安装nodejs 1.1、说明:gulp是基于nodejs,理所当然需要安装nodejs; 1.2、安装:打开,点击硕大的绿色Download按钮,它会根据系统信息选择对应版本(.msi文件)。然后像安装QQ一样安装它就可以了(安装路径随意)。 2、使用命令行(如果你熟悉命令行,可以直接跳到) 2.1、说明:什么是命令行?命令行在OSX是终端(Terminal),在windows是命令提示符(Command Prompt); 2.2、注:之后操作都是在windows系统下; 2.3、简单介绍gulp在使用过程中常用命令,打开命令提示符执行下列命令(打开方式:window + r 输入cmd回车): node -v查看安装的nodejs版本,出现版本号,说明刚刚已正确安装nodejs。PS:未能出现版本号,请尝试注销电脑重试; npm -v查看npm的版本号,npm是在安装nodejs时一同安装的nodejs包管理器,那它有什么用呢?; cd定位到目录,用法:cd + 路径 ; dir列出文件列表; cls清空命令提示符窗口内容。
3、npm介绍 3.1、说明:npm(node package manager)nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等); 3.2、使用npm安装插件:命令提示符执行npm install &name& [-g] [--save-dev]; 3.2.1、&name&:node插件名称。例:npm install gulp-less --save-dev 3.2.2、-g:全局安装。将会安装在C:\Users\Administrator\AppData\Roaming\npm,并且写入系统环境变量;
非全局安装:将会安装在当前定位目录;
全局安装可以通过命令行在任何地方调用它,本地安装将安装在定位目录的node_modules文件夹下,通过require()调用; 3.2.3、--save:将保存配置信息至package.json(package.json是); 3.2.4、-dev:保存至package.json的devDependencies节点,不指定-dev将保存至dependencies节点;一般保存在dependencies的像这些express/ejs/body-parser等等。 3.2.5、为什么要保存至package.json?因为node插件包相对来说非常庞大,所以不加入版本管理,将配置信息写入package.json并将其加入版本管理,其他开发者对应下载即可(命令提示符执行npm install,则会根据package.json下载所有需要的包,npm install --production只下载dependencies节点的包)。 3.3、使用npm卸载插件:npm uninstall &name& [-g] [--save-dev]
PS:不要直接删除本地插件包 3.3.1、删除全部插件:npm uninstall gulp-less gulp-uglify gulp-concat ……???太麻烦 3.3.2、借助rimraf:npm install rimraf -g 用法:rimraf node_modules 3.4、使用npm更新插件:npm update &name& [-g]
[--save-dev] 3.4.1、更新全部插件:npm update [--save-dev] 3.5、查看npm帮助:npm help 3.6、当前目录已安装插件:npm list PS:npm安装插件过程:从http://registry.npmjs.org下载对应的插件包(该网站服务器位于国外,所以经常下载缓慢或出现异常),解决办法往下看↓↓↓↓↓↓。 4、选装cnpm 4.1、说明:因为npm安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事。32个?!来自官网:“这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。”; 4.2、官方网址:; 4.3、安装:命令提示符执行npm install cnpm -g --registry=https://registry.npm.taobao.org;
注意:安装完后最好查看其版本号cnpm -v或关闭命令提示符重新打开,安装完直接使用有可能会出现错误; 注:cnpm跟npm用法完全一致,只是在执行命令时将npm改为cnpm(以下操作将以cnpm代替npm)。 5、全局安装gulp 5.1、说明:全局安装gulp目的是为了通过她执行gulp任务; 5.2、安装:命令提示符执行cnpm install gulp -g; 5.3、查看是否正确安装:命令提示符执行gulp -v,出现版本号即为正确安装。 6、新建package.json文件 6.1、说明:package.json是基于nodejs项目必不可少的配置文件,它是存放在项目根目录的普通json文件; 6.2、它是这样一个json文件(注意:json文件内是不能写注释的,复制下列内容请删除注释):
JavaScript
12345678910111213141516171819
{&&"name": "test",&& //项目名称(必须)&&"version": "1.0.0",&& //项目版本(必须)&&"description": "This is for study gulp project !",&& //项目描述(必须)&&"homepage": "",&& //项目主页&&"repository": {&&&&//项目资源库&&&&"type": "git",&&&&"url": "https://git.oschina.net/xxxx"&&},&&"author": {&&&&//项目作者信息&&&&"name": "surging",&&&&"email": ""&&},&&"license": "ISC",&&&&//项目许可协议&&"devDependencies": {&&&&//项目依赖的插件&&&&"gulp": "^3.8.11",&&&&"gulp-less": "^3.0.0"&&}}
6.3、当然我们可以手动新建这个配置文件,但是作为一名有志青年,我们应该使用更为效率的方法:命令提示符执行cnpm init
6.4、查看package.json帮助文档,命令提示符执行cnpm help package.json 特别注意:package.json是一个普通json文件,所以不能添加任何注释。参看
7、本地安装gulp插件 7.1、安装:定位目录命令后提示符执行cnpm install --save-dev; 7.2、本示例以gulp-less为例(编译less文件),命令提示符执行cnpm install gulp-less --save-dev;
7.3、将会安装在node_modules的gulp-less目录下,该目录下有一个gulp-less的使用帮助文档README.md; 7.4、为了能正常使用,我们还得本地安装gulp:cnpm install gulp --save-dev; PS:细心的你可能会发现,我们全局安装了gulp,项目也安装了gulp,全局安装gulp是为了执行gulp任务,本地安装gulp则是为了调用gulp插件的功能。 8、新建gulpfile.js文件(重要) 8.1、说明:gulpfile.js是gulp项目的配置文件,是位于项目根目录的普通js文件(其实将gulpfile.js放入其他文件夹下亦可)。 8.2、它大概是这样一个js文件(更多插件配置请):
JavaScript
12345678910111213141516
//导入工具包 require('node_modules里对应模块')var gulp = require('gulp'), //本地安装gulp所用到的地方&&&&less = require('gulp-less'); //定义一个testLess任务(自定义任务名称)gulp.task('testLess', function () {&&&&gulp.src('src/less/index.less') //该任务针对的文件&&&&&&&&.pipe(less()) //该任务调用的模块&&&&&&&&.pipe(gulp.dest('src/css')); //将会在src/css下生成index.css});&gulp.task('default',['testLess', 'elseTask']); //定义默认任务 elseTask为其他任务,该示例没有定义elseTask任务&//gulp.task(name[, deps], fn) 定义任务&&name:任务名称 deps:依赖任务名称 fn:回调函数//gulp.src(globs[, options]) 执行任务处理的文件&&globs:处理的文件路径(字符串或者字符串数组) //gulp.dest(path[, options]) 处理完后文件生成路径
8.3、该示例文件请 9、运行gulp 9.1、说明:命令提示符执行gulp 任务名称; 9.2、编译less:命令提示符执行gulp testLess; 9.3、当执行gulp default或gulp将会调用default任务里的所有任务[‘testLess’,’elseTask’]。 10、使用webstorm运行gulp任务 10.1、说明:使用webstorm可视化运行gulp任务; 10.2、使用方法:将项目导入webstorm,右键gulpfile.js 选择”Show Gulp Tasks”打开Gulp窗口,若出现”No task found”,选择右键”Reload tasks”,双击运行即可。
11、总结 11.1、安装nodejs; 11.2、新建package.json文件; 11.3、全局和本地安装gulp; 11.4、安装gulp插件; 11.5、新建gulpfile.js文件; 11.6、通过命令提示符运行gulp任务。 12、结束语 12.1、本文有任何错误,或有任何疑问,欢迎留言说明。 教程索引:
如果觉得我的文章对您有用,请随意打赏。您的支持将是我继续创作的动力!
下一篇:&>>
相关推荐  评论

我要回帖

更多关于 gulp 任务依赖 的文章

 

随机推荐