本节书摘来自异步社区《JavaScript开发框架权威指南》一书中的第2章,第2.4节,作者:【美】Tim Ambler , Nicholas Cloud著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.4 处理任务

对于配置来说,Grunt的config()方法既是“getter”,也是“setter”。在清单中,我们可以看到一个基本的Grunt任务是如何通过此方法来存取配置的。

清单2-9 管理一个基本Grunt任务的配置

module.exports = function(grunt) {grunt.config('basic-task', {'message': 'Hello, world.'});grunt.registerTask('basic-task', function() {grunt.log.writeln(grunt.config('basic-task.message'));});
};

注意:
 

清单2-9中“点记法”(dot notation)是用来访问多级嵌套的配置参数的。采用同样的方式,点记法还可以用于设置多级嵌套的配置参数值。而且无论在哪里遇到不存在的配置路径,Grunt都会为其创建一个新的空对象,而不抛出异常。
2.4.2 任务描述
随着时间的推移,项目复杂性会逐渐增加,因此需要不断添加新的Grunt任务。但是随着任务的增多,任务的可用性、用途以及调用方法等越来越难以追踪。幸运的是,Grunt已经为我们提供了一条解决此问题的途径。如清单所示,我们可以为任务设定相应的描述。

清单2-10 为Grunt任务设置描述

// example-task-description/Gruntfile.jsmodule.exports = function(grunt) {grunt.config('basic-task', {'message': 'Hello, world.'});grunt.registerTask('basic-task', 'This is an example task.', function() {grunt.log.writeln(grunt.config('basic-task.message'));});grunt.registerTask('default', 'This is the default task.', ['basic-task']);
};

要为任务设置描述,只要在调用registerTask()时多传入一个参数即可。如果在命令行中请求帮助信息,Grunt就会将这些任务描述打印出来。清单截取了其中的一个片段。

清单2-11 在命令行中请求帮助信息

$ grunt --help
...
Available tasksbasic-task This is an example task.default This is the default task.
...

2.4.3 异步任务
默认情况下,Grunt任务是同步执行的。只要任务函数返回,即可认为任务已经执行完毕。然而,有时候我们需要在任务中使用异步函数,而且必须等待其执行完毕才能将控制权交还给Grunt。清单中展示了这个问题的解决方法。在任务中调用async()方法将通知Grunt此任务是异步执行的。该方法返回一个回调函数,用于在任务完成时调用。在此之前,Grunt暂不会执行任何额外的任务。

清单2-12 异步Grunt任务

// example-async/tasks/list-files.jsvar glob = require('glob');
module.exports = function(grunt) {grunt.registerTask('list-files', function() {/*** Grunt将一直等待我们调用done()函数来通知它异步任务执行完毕。*/var done = this.async();glob('*', function(err, files) {if (err) {grunt.fail.fatal(err);}grunt.log.writeln(files);done();});});
};

2.4.4 任务依赖
对于复杂的Grunt工作流程,我们最好将其看作由一系列协同工作以达成最终结果的任务步骤组成。这种情况下,为任务指定一个或多个其他任务作为先决条件往往很有帮助,如清单所示。

清单2-13 声明任务依赖

// example-task-dependency/tasks/step-two.jsmodule.exports = function(grunt) {grunt.registerTask('step-two', function() {grunt.task.requires('step-one');});
};

本例中,step-two任务要求step-one必须在其之前运行。任何试图直接调用step-two的行为都将导致错误发生,如清单所示。

清单2-14 依赖项运行之前直接运行任务导致Grunt报错

$ grunt step-two
Running "step-two" task
Warning: Required task "step-one" must be run first. Use --force to continue.Aborted due to warnings.

2.4.5 多任务
除基本任务之外,Grunt还支持“多任务”(multi-task)。多任务差不多是Grunt里最复杂的概念,所以如果你一开始感到困惑,别担心,这很正常。事实上,只要看过几个例子之后,它们的用途就会变得清晰起来,你也会从此踏上精通Grunt的道路。继续之前,还是让我们先看一个比较简单的多任务示例及其配置(见清单)。

清单2-15 Grunt多任务

// example-list-animals/tasks/list-animals.jsmodule.exports = function(grunt) {/*** Our multi-task's configuration object. In this example, 'mammals'* and 'birds' each represent what Grunt refers to as a 'target.'*/grunt.config('list-animals', {'mammals': {'animals': ['Cat', 'Zebra', 'Koala', 'Kangaroo']},'birds': {'animals': ['Penguin', 'Sparrow', 'Eagle', 'Parrot']}});grunt.registerMultiTask('list-animals', function() {grunt.log.writeln('Target:', this.target);grunt.log.writeln('Data:', this.data);});
};

多任务的使用极其灵活,其设计目的就是在单个项目中支持多种配置(称作“目标”,targets)。清单中的多任务有两个目标:mammals和birds。如清单所示,该任务可以按照任一目标运行。

清单2-16 按照特定目标运行清单中的任务

$ grunt list-animals:mammals
Running "list-animals:mammals" (#list-animals) task
Target: mammals
Data: { animals: [ 'Cat', 'Zebra', 'Koala', 'Kangaroo' ] }Done, without errors.

运行多任务时也可以不传入任何参数。这种情况下,任务会为每个可用的目标都运行一次。清单展示了在不指定目标的情况下运行多任务所产生的结果。

清单2-17 在不指定目标的情况下,运行清单中的多任务

$ grunt list-animals
Running "list-animals:mammals" (#list-animals) task
Target: mammals
Data: { animals: [ 'Cat', 'Zebra', 'Koala', 'Kangaroo' ] }Running "list-animals:birds" (#list-animals) task
Target: birds
Data: { animals: [ 'Penguin', 'Sparrow', 'Eagle', 'Parrot' ] }

上述示例中,我们的多任务运行了两次,每个目标一次(mammals和birds)。注意在清单中,我们的多任务引用了两个属性:this.target和this.data。这些属性使得多任务能够获取与当前正在运行的目标相关的信息。

2.4.6 多任务选项
在配置多任务时,任何存储在options键下的值(见清单)都会受到特殊处理。

清单2-18 Grunt多任务与Options配置项

// example-list-animals-options/tasks/list-animals.jsmodule.exports = function(grunt) {grunt.config('list-animals', {'options': {'format': 'array'},'mammals': {'options': {'format': 'json'},'animals': ['Cat', 'Zebra', 'Koala', 'Kangaroo']},'birds': {'animals': ['Penguin', 'Sparrow', 'Eagle', 'Parrot']}});grunt.registerMultiTask('list-animals', function() {var options = this.options();switch (options.format) {case 'array':grunt.log.writeln(this.data.animals);break;case 'json':grunt.log.writeln(JSON.stringify(this.data.animals));break;default:grunt.fail.fatal('Unknown format: ' + options.format);break;}});};

多任务选项为开发者提供了一种机制,即为任务定义和全局选项可以被目标任务的选项覆写。本例中,动物列表的全局选项format在任务层级被定义为'array'。目标mammals将其覆写为'json',但是目标birds没有。这样,mammals将显示为JSON串,而birds则继承全局选项的设定仍然显示为数组。

今后你遇到的绝大多数Grunt插件都会是可配置的多任务。由此而来的灵活性使得我们可以针对不同的应用环境,以不同的方式运行同一个任务。一个常见的情景就是为不同的构建环境创建不同的输出目标。例如,在编译程序时,针对本地开发环境和产品发布可以选用不同的任务运行配置。

2.4.7 模板配置
Grunt配置对象支持配置嵌入式的模板字符串,可用于之后的其他配置。Grunt支持的模板格式遵循Lodash和Underscore,具体细节会涵盖在后续的章节中。清单和清单中的示例显示了该功能可以如何使用。

清单2-19 Gruntfile样例,Grunt配置对象的pkg键中保存了项目package.json的内容

// example-templates/Gruntfile.jsmodule.exports = function(grunt) {grunt.initConfig({'pkg': grunt.file.readJSON('package.json')});grunt.loadTasks('tasks');grunt.registerTask('default', ['test']);
};

清单2-20 使用自身配置的后续加载任务,可以使用模板来引用其他配置

// example-templates/tasks/test.jsmodule.exports = function(grunt) {grunt.config('test', {'banner': '<%= pkg.name %>-<%= pkg.version %>'});grunt.registerTask('test', function() {grunt.log.writeln(grunt.config('test.banner'));});
};

清单展示了Gruntfile配置样例,其通过使用一系列与文件系统交互的内置方法,实现了加载项目Package.Json文件的内容,这些内置方法会在本章后续内容中讨论。文件内容随后存储在Grunt配置对象的pkg属性中。在清单中可以看到,通过使用配置模板,任务能够直接引用配置对象pkg的信息。

2.4.8 命令行选项

通过如下格式可以为Grunt传递额外配置项。

$ grunt count --count=5
清单中的例子展示了Grunt任务是如何通过grunt.option()方法获取信息的。从清单可以看到调用该任务的结果。

清单2-21 简单Grunt任务计数到指定数字

// example-options/tasks/count.jsmodule.exports = function(grunt) {grunt.registerTask('count', function() {var limit = parseInt(grunt.option('limit'), 10);if (isNaN(limit)) grunt.fail.fatal('A limit must be provided (e.g. --limit=10)');console.log('Counting to: %s', limit);for (var i = 1; i <= limit; i++) console.log(i);});
};
清单2-22 执行清单中任务的输出结果$ grunt count --limit=5
Running "count" task
Counting to: 5
1
2
3
4
5Done, without errors.

2.4.9 提供反馈
为了在执行任务时为用户提供反馈信息,Grunt提供了一些内置方法,其中某些方法你已经在本章中看过。当然,我们不会在此处列出所有方法,但表中列出了一些常用的。

2.4.10 错误处理
在任务执行的过程中,会遇到错误。当遇到这种情况时,知道如何合理地处理它们是很重要的。当面对一个错误时,开发者需要使用Grunt的错误API。它很易于使用,因为它只提供了两个方法(见表)。

《JavaScript开发框架权威指南》——2.4 处理任务相关推荐

  1. 《JavaScript开发框架权威指南》——1.4 查找、添加和删除Bower包

    本节书摘来自异步社区<JavaScript开发框架权威指南>一书中的第1章,第1.4节,作者:[美]Tim Ambler , Nicholas Cloud著,更多章节内容可以访问云栖社区& ...

  2. 中文书籍对《人月神话》的引用(20211105更新161-165本):大师品软件、JavaScript开发框架权威指南

    中文书籍对<人月神话>的引用(第001到160本)>> <人月神话>于1975年出版,1995年出二十周年版.自出版以来,该书被大量的书籍和文章引用,直到现在热潮不 ...

  3. 《JavaScript权威指南》笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> <JavaScript权威指南>真是名符其实的好书!真遗憾初学JavaScript时没有立即读这本书,甚为遗憾.不 ...

  4. 经典的《JavaScript 权威指南》中的“对象”不经典

    这些天在为Qomo项目写"JavaScript面向对象的支持"这组文章.也一直在期待网上购得的那本<JavaScript 权威指南>(第四版)快快到来. 在前公司,有这 ...

  5. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  6. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! JavaScript 权威指南-学习笔记 ...

  7. Javascript权威指南学习笔记一:数据类型

    决定从最基础的开始学JavaScript,最近看了<<Javascript权威指南>>第3章,记些笔记备忘. 本章一个重点是类型.按我的理解应该如下表所示: 复合类型中,关联数 ...

  8. 《JavaScript权威指南》——JavaScript核心

    前言 这本由David Flanagan著作,并由淘宝前端团队译的<JavaScript权威指南>,也就是我们俗称的"犀牛书",算是JS界公认的"圣经&quo ...

  9. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

最新文章

  1. 2022-2028年中国六氟化硫行业市场研究及前瞻分析报告
  2. elasticsearch docker无法挂载_使用Docker安装Graylog日志收集系统
  3. php 情书,PHP好玩的代码一(笛卡尔的情书)
  4. c语言编程常见问题解答,C语言编程常见问题解答之常用函数的包含文件
  5. 浅谈堆栈问题-C++
  6. nginx负载均衡核心模块(upstream和proxy模块)及常用参数介绍
  7. 一键获取喜马拉雅音频文件(Python3爬虫)
  8. 如何写网站建设策划书
  9. 服务器没读取到磁盘阵列信息,服务器磁盘阵列常见问题及解决方法
  10. fastapi+tortoise单元测试
  11. 芯片在计算机中作用是什么,逻辑芯片的作用是什么
  12. python两列时间间隔计算器_计算两列之间的Pandas DataFrame时间差异(以小时和分钟为单位)...
  13. 全面解说OCA全贴合优势
  14. CSS字体透明度怎么设置?
  15. 使用“微信公众平台-公众号开放接口”的方法
  16. 软件工程课程实践-项目开发总结报告
  17. 【大话Java面试】-如何通俗易懂的理解Redis的回收算法LRU?
  18. struts2马士兵笔记
  19. 桥接模式和中继模式的区别【转】
  20. PowerPC MMU机制读书笔记

热门文章

  1. Tcl Tutorial 笔记7 ·for incr
  2. 新手学v-text指令
  3. springboot报错Table 'wechat.hibernate_sequence' doesn't exist
  4. 乘积取中法matlab,迭代取中法、乘同余法及混合同余法产生随机数方法
  5. 的有效性最好_股票职业玩家教韭菜实战,验证技术指标的有效性,资产增值是王道...
  6. c程序语言编写 计算器,C语言编写简单计算器
  7. python 通用数据库类型_Python开发基础之Python常用的数据类型
  8. sourcetree提示无效路径_关于今明可转债申购的温馨提示
  9. 航空航天工程用不用学c语言,2020年北京航空航天软件工程991答疑
  10. windows查看usb信息命令_Linux dumpe2fs命令:查看文件系统信息