Gulp学习之委以重任task函数做了什么事情
gulp.task()函数用来定义一个gulp要执行的任务。其格式如下
gulp.task(name [, deps] [, fn])
该函数有三个参数:name,deps和fn
name 任务的名称,字符串类型,这个参数是必须的。
gulp.task('mytask')
执行该任务
gulp] # gulp mytask
Starting 'mytask'...
Finished 'mytask' after 120 μs
我们定义的这个任务其实什么也没有做。通常情况下是需要有一个回调函数来执行该任务的内容。也就是fn参数
fn 回调函数,要执行的任务都在该回调函数中实现。
gulp.task('mytask',function(){
console.log('mytask');
})
执行该任务
gulp] # gulp mytask
Starting 'mytask'...
mytask
Finished 'mytask' after 360 μs
通过上面两个例子,我们看到,在命令行执行gulp的时候,都需要加上任务名称。如果想省略的话需要使用默认的任务名称’default’
gulp.task('default',function(){
console.log('default');
})
继续执行上面代码
gulp] # gulp
Starting 'default'...
default
Finished 'default' after 360 μs
但是一般情况下,我们只是使用default作为一个入口。并不定义实际的内容。其实真正的工作都是由其依赖的任务来做。这就需要使用到参数’deps’。
deps 当前任务执行所依赖的任务,该参数是一个数组。也就是说只有在deps中定义的任务完成的情况下当前任务才会执行。
gulp.task('mytask',function(){
console.log('mytask');
})
gulp.task('task',function(){
console.log('task');
})
gulp.task('default',['mytask','task'],function(){
console.log('default');
});
为了说明其顺序,我们在default中加入一个回调函数。执行代码:
gulp] # gulp Starting 'mytask'... mytask Finished 'mytask' after 309 μs Starting 'task'... task Finished 'task' after 179 μs Starting 'default'... default Finished 'default' after 170 μs
我们知道,js是事件驱动的。所以说所有的这些任务都是异步执行的。它们之间的运行没有先后之分,互相之间是平行的。
gulp.task('mytask',function(){
setTimeout(function(){
console.log('mytask')
},1000)
})
gulp.task('default',['mytask'],function(){
console.log('default');
});
执行结果如下
gulp] # gulp
Starting 'mytask'...
Finished 'mytask' after 983 μs
Starting 'default'... default
Finished 'default' after 168 μs
mytask
其中,mytask是在整个程序执行完的1秒以后打印出来的。这种异步的方式导致的一个比较严重的问题就是在实际编译文件过程中,我们会看到程序已经运行完成了,但是我们的文件还在编译。
要解决这个问题就要使程序是同步执行的而不是异步。在官方文档中给出了三种方法:一是在fn中接收一个回调函数作为参数;二是返回一个stream;三是返回一个promise。
gulp.task('mytask',function(){
setTimeout(function(){
console.log('mytask')
},1000)
})
我们看这个例子
gulp] # gulp mytask
Starting 'mytask'...
Finished 'mytask' after 1.01 ms
mytask
在显示Finished以后才打印的mytask。下面可以通过第一种回调函数的方式来实现同步执行。
gulp.task('mytask',function(cb){
return setTimeout(function(){
console.log('mytask');
cb();
},1000);
})
执行结果如下
gulp] # gulp mytask
Starting 'mytask'...
mytask
Finished 'mytask' after 1 s
现在的结果就是我们想要的了。但是,有一点需要注意的是如果我们在fn种接收了一个回调函数作为参数,那么就必须调用该回调函数,否则程序是没法向下执行的。尤其是在有多个依赖任务的程序中,假如在依赖的任务的fn中接收了回调函数为参数,但是并没有调用该回调函数,那这样造成的结果就是程序执行到该任务就结束了。也就是说后续的任务不再被执行。
gulp.task('task',function(cb){
console.log('task');
})
gulp.task('default',['task'],function(){
console.log('default');
});
运行该程序发现结果会是惊人的
gulp] # gulp
Starting 'task'...
task
很明显这段程序没有执行完就停止了。解决的方法就是在task任务中调用cb();
gulp.task('task',function(cb){
console.log('task');
cb();
})
下面回到我们的主线,在说完接收回调函数来使程序达到同步执行后。我们继续看剩下的两种方式。
由于这篇文章尽量不涉及到其它的函数,旨在说明gulp.task的工作方式。所以这里对于剩下的两种方式我们直接使用官网给出的例子
返回 stream
gulp.task('somename', function() {
var stream = gulp.src('client/**/*.js')
.pipe(minify())
.pipe(gulp.dest('build'));
return stream;
});
返回 promise
var Q = require('q');
gulp.task('somename', function() {
var deferred = Q.defer();
// do async stuff
setTimeout(function() {
deferred.resolve();
}, 1);
return deferred.promise;
});
总结
默认情况下,gulp对于是一次性加载所有的任务,这些任务是并行执行的。我们要想有一个按照一定顺序执行的任务序列,需要做的是:首先为某些任务指定其依赖完成的任务;然后是给任务完成以后通知程序执行下一个任务(通过我们上面介绍的三种方式,可根据实际情况选择)。
同样,我们摘用官网的例子。
var gulp = require('gulp');
// takes in a callback so the engine knows when it'll be done
gulp.task('one', function(cb) {
// do stuff -- async or otherwise
cb(err); // if err is not null and not undefined, the run will stop, and note that it failed
});
// identifies a dependent task must be complete before this one begins
gulp.task('two', ['one'], function() {
// task 'one' is done now
});
gulp.task('default', ['one', 'two']);
参考:gulp官网
相关文章
Angular CLI Webpack 配置
发布时间:2023/04/12 浏览次数:123 分类:Angular
-
Angular CLI 提供了用于创建项目、添加和运行测试、生成组件、服务、管道、脚手架模块、特性等的命令。CLI 还提供了一个 webpack 配置文件。
在 PHP 中创建一个 Webhook
发布时间:2023/03/29 浏览次数:143 分类:PHP
-
本教程展示了如何在 PHP 中创建 webhook。我们将创建一个 webhook.log 文件。该文件将包含一些数组格式的文本,我们将从 example.json 文件中检索这些文本。我们将使用 PHP 脚本来解码这个
修复 Node.js 中的 Error: Cannot Find Module 'Webpack'
发布时间:2023/03/27 浏览次数:102 分类:Node.js
-
在这篇文章中,我们将学习如何解决Node.js 中的 Error: cannot find module 'webpack' 。
在 Ubuntu 和 Debian 上配置 Apache Web 服务器
发布时间:2023/03/17 浏览次数:146 分类:操作系统
-
本教程展示了在 Ubuntu 和 Debian 上安装和设置 apache 网络服务器以及使用访问日志。
解决 Cannot find module 'webpack' 错误
发布时间:2022/09/16 浏览次数:162 分类:学无止境
-
要解决“Cannot find module 'webpack'”错误,需要确保通过运行 npm i -g webpack 命令全局安装 webpack,并通过运行 npm link webpack 命令创建从全局安装的包到 node_modules 的符号链接。
使用 NodeJS 的 WebSocket REST API — Express.js 风格
发布时间:2022/08/25 浏览次数:138 分类:学无止境
-
正如我们在之前的文章HTTP REST API 和 WebSocket REST API 之间的性能差异中看到的,当我们谈论响应时间、服务器资源和 Internet 带宽时,HTTP 和 WebSocket REST API 之间的差异非常大。 结合在客户
HTTP REST API 和 WebSocket REST API 之间的性能差异
发布时间:2022/08/16 浏览次数:327 分类:网络
-
什么是 REST API? REST 或 RESTful API 设计(Representational State Transfer)是一种使用现有协议的架构风格。 REST API 设计有六个关键约束:
Spring Boot 保护 Web 应用程序
发布时间:2022/05/29 浏览次数:128 分类:教程更新
-
如果在 classpath 上添加了 Spring Boot Security 依赖项,则 Spring Boot 应用程序会自动要求所有 HTTP 端点的基本身份验证。 端点“/”和“/home”不需要任何身份验证。 所有其他端点都需要身份