grunt已经扯了七篇了,殊为不易。最后一篇扯点早应该提及的东西,就是module.exports = function(grunt) {}传入的这个grunt。之前的代码grunt一般只出现在Gruntfile.js这几个地方。

require('load-grunt-tasks')(grunt);
require('time-grunt')(grunt);
grunt.initConfig({
...
});
grunt.registerTask('default', [...]);

  但grunt的内容远远不止这些,它包含9个对象属性,而上面的initConfig、registerTask不过是某些属性对象的方法,是为了方便用户调用所取的别名而已。

  9个对象将分别进行介绍。

  1. config
    grunt.config.init(obj): grunt.initConfig()的元神,不必多说了吧。
    grunt.config(prop[, value]): 可以叫语法糖么,当参数为一个的时候调用grunt.config.get()。当参数为两个的时候调用grunt.config.set()。
    grunt.config.get/set(prop[, value]): 设置或者获取prop
    grunt.config.getRaw(prop): 获取prop的原始code
    grunt.config.process(templateString): 返回<%=var.prop%>这种模板对应的值。一般来说,设置的prop当value为string时(比如src,dest)可以直接使用模板,但是当value为function时,想要通过模板获取字符串就需要用到这个方法了。
    举个栗子,自己感受吧。

    'use strict';
    
    module.exports = function(grunt) {
    
        require('load-grunt-tasks')(grunt);
    require('time-grunt')(grunt); var path = {
    src: 'src',
    dest: 'dest'
    } grunt.config.init({
    path: path,
    copy: {
    test: {
    files: [
    {
    expand: true,
    cwd: '<%=path.src%>/',
    src: '{,*/}*',
    dest: '<%=path.dest%>'
    }
    ]
    }
    }
    }); grunt.config('clean', {
    test: '<%=path.dest%>'
    }); console.log(grunt.config('path').dest); //output: dest
    console.log(grunt.config.process('<%=path.dest%>')); //output: dest
    console.log(grunt.config.get('clean').test); //output: dest
    console.log(grunt.config.getRaw('clean').test); //output: <%=path.dest%> grunt.registerTask('default', ['clean', 'copy']);
    }
  2. event
    grunt.event.on(type, listener): 设置某类型事件的监听函数
    grunt.event.once(type, listener): 设置某类型事件的一次性监听函数
    grunt.event.many(type, count, listener): 设置某类型事件的多次性监听函数
    grunt.event.off(type, listener): 取消某类型事件的某个监听函数
    grunt.event.removeAllListeners([type]): 取消某类型事件的全部监听函数
    grunt.event.emit(type[, arg1[, arg2...]]): 发出某类型时间
    需要注意的是,grunt中没有原生的event type,全部自己定义自己发出。
    这部分方法比较简单,和jQuery的命名很相似,所以直接给出代码和输出过了吧。
    'use strict';
    
    module.exports = function(grunt) {
    
        function foron(count) {
    console.log('test for off ' + count);
    } grunt.event.on('test', foron);
    grunt.event.on('test', function(count) {
    console.log('test for on ' + count);
    }); grunt.event.once('test', function(count) {
    console.log('test for once ' + count);
    }); grunt.event.many('test', 2, function(count) {
    console.log('test for many ' + count);
    }); grunt.event.emit('test', 1);
    grunt.event.emit('test', 2);
    grunt.event.emit('test', 3);
    grunt.event.off('test', foron);
    grunt.event.emit('test', 4);
    grunt.event.removeAllListeners();
    grunt.event.emit('test', 5); grunt.registerTask('default', []);
    }

    输出如下:

    test for off
    test for on
    test for once
    test for many
    test for off
    test for on
    test for many
    test for off
    test for on
    test for on
  3. fail
    grunt.fail.warn(msg[, errorcode]): grunt.warn()的本尊,显示一条警告信息然后退出grunt的本次执行,执行grunt时使用--force参数无视警告信息继续执行
    grunt.fail.fatal(msg[, errorcode]): grunt.fatal()的本尊,显示一条错误信息然后退出grunt的本次执行
    Gruntfile.js中一般是用不到的,如果你编写plugin就肯定用的到了。
  4. file 文件操作,封装了nodejs中的fs模块
    grunt.file.defaultEncoding: 文件编码,默认是'utf8'
    grunt.file.preserveBOM: 是否在档首保留BOM,默认false

    grunt.file.read(filepath[, options]): 读取并返回文件内容,options.encoding为null时返回Buffer,其他返回String
    grunt.file.readJSON(filepath[, options]): 读取并返回文件内容的JSON对象表示,常见var pack = grunt.file.readJSON('package.json');
    grunt.file.readYAML(filepath[, options]): 同上,我表示不懂YAML
    grunt.file.write(filepath, contents[, options]): 将contents写入filepath,contents可以是String或Buffer

    grunt.file.copy(srcpath, destpath[, options]): 拷贝文件,会自动创建文件夹
    grunt.file.delete(filepath[, options]): 删除文件

    grunt.file.mkdir(dirpath[, options]): 创建文件夹
    grunt.file.recurse(rootdir, callback): 遍历文件夹下的所有文件(包括子文件夹下的),并执行callback(abspath, rootdir, subdir, filename)

    grunt.file.expand([options, ]patterns): 返回patterns匹配的所有路径,比如我之前的项目结构grunt.file.expand('src/**')返回的如下

    [ 'src',
    'src/css',
    'src/css/base.css',
    'src/css/main.css',
    'src/image',
    'src/image/haiys02.jpg',
    'src/index.html',
    'src/js',
    'src/js/hellogrunt.js',
    'src/js/helloworld.js' ]

    grunt.file.expandMapping(patterns, dest[, options]): 返回patterns匹配路径和原路径的键值对,比如grunt.file.expandMapping('**', 'dest', {cwd: 'src'})返回

    [ { src: [ 'src' ], dest: 'dest' },
    { src: [ 'src/css' ], dest: 'dest/css' },
    { src: [ 'src/css/base.css' ], dest: 'dest/css/base.css' },
    { src: [ 'src/css/main.css' ], dest: 'dest/css/main.css' },
    { src: [ 'src/image' ], dest: 'dest/image' },
    { src: [ 'src/image/haiys02.jpg' ],
    dest: 'dest/image/haiys02.jpg' },
    { src: [ 'src/index.html' ], dest: 'dest/index.html' },
    { src: [ 'src/js' ], dest: 'dest/js' },
    { src: [ 'src/js/hellogrunt.js' ],
    dest: 'dest/js/hellogrunt.js' },
    { src: [ 'src/js/helloworld.js' ],
    dest: 'dest/js/helloworld.js' } ]

    grunt.file.match([options, ]patterns, filepaths): 返回filepaths中匹配patterns的路径
    grunt.file.isMatch([options, ]patterns, filepaths): filepaths中一旦有path命中即返回true

    grunt.file.exists(path1[, path2...]): 返回paths是否存在
    grunt.file.isLink/Dir/File(path1[, path2...]): 返回paths是否为链接、文件夹、文件

    grunt.file.isPathAbsolute(path1[, path2...]): 返回paths是否为绝对路径
    grunt.file.arePathsEquivalent(path1[, path2...]): 返回paths是否相同
    grunt.file.doesPathContain(dir, path1[, path2...]): 返回paths是否在dir中
    grunt.file.isPathCwd(path1[, path2...]): 返回paths是否为cwd
    grunt.file.isPathInCwd(path1[, path2...]): 返回paths是否在cwd中,cwd不在cwd中
    grunt.file.setBase(path1[, path2...]): 设置当前的cwd

  5. log/verbose
    grunt.log.write[ln](msg): 打印 msg
    grunt.log.error[lns](msg): 打印 红色'>>' msg
    grunt.log.ok[lns](msg): 打印 绿色'>>' msg
    grunt.log.subhead(msg): 打印 高亮msg
    grunt.log.writeflags(obj, prefix): 打印 prefix: obj.toString()
    grunt.log.debug(msg): 当指定--debug时打印 [D] msg
  6. option
    grunt.option(key[, value]): 读取或设置option grunt --key1=value1 --key2=value2
    grunt.option.init([obj]): 初始化option对象
    grunt.option.flags(): 将option对象以'key=value'字符串数组方式返回
  7. task
    grunt.task.registerTask(taskname, taskslist)/(taskname, desc, taskFunction): grunt.registerTask的真身,注册可执行的任务
    grunt.task.registerMultiTask(taskname, desc, taskFunction): grunt.registerMultiTask的真身,注册新的task类型,需指定target才能执行,function内部通过this.target获取当前target,通过this.data获取当前target的value
    'use strict';
    
    module.exports = function(grunt) {
    
        require('time-grunt')(grunt);
    
        grunt.initConfig({
    log: {
    foo: [1, 2, 3],
    bar: 'hello world',
    baz: {
    options: {
    bool: false
    }
    }
    }
    }); grunt.task.registerMultiTask('log', 'Log stuff.', function() {
    grunt.log.writeln(this.target + ': ' + this.data);
    }); grunt.registerTask('default', ['log']);
    }

    输出如下:

    Running "log:foo" (log) task
    foo: 1,2,3 Running "log:bar" (log) task
    bar: hello world Running "log:baz" (log) task
    baz: [object Object]

    grunt.task.renameTask: 重命名task type,原task type将不可使用
    grunt.task.loadTasks: grunt.loadTasks的真身,指定需要加载的文件的目录
    grunt.task.loadNpmTasks: grunt.loadNpmTasks的真身,指定需要加载的plugin
    以下语句效果相同

    grunt.loadTasks('node_modules/grunt-contrib-clean/tasks/');
    grunt.loadNpmTasks('grunt-contrib-clean');

    grunt.task.run(tasksList): 执行任务队列
    grunt.task.clearQueue(): 清空任务队列
    grunt.task.normalizeMultiTaskFiles(): 将target将要处理的文件以src-dest-orig对象数组的形式序列化,以config中Gruntfile.js为例,添加代码

    console.log(grunt.task.normalizeMultiTaskFiles(grunt.config.process('<%=copy.test%>')));

    打印出的内容如下:

    [ { src: [ 'src/css' ],
    dest: 'dest/css',
    orig: { expand: true, cwd: 'src/', src: [Object], dest: 'dest' } },
    { src: [ 'src/css/base.css' ],
    dest: 'dest/css/base.css',
    orig: { expand: true, cwd: 'src/', src: [Object], dest: 'dest' } },
    { src: [ 'src/css/main.css' ],
    dest: 'dest/css/main.css',
    orig: { expand: true, cwd: 'src/', src: [Object], dest: 'dest' } },
    { src: [ 'src/image' ],
    dest: 'dest/image',
    orig: { expand: true, cwd: 'src/', src: [Object], dest: 'dest' } },
    { src: [ 'src/image/haiys02.jpg' ],
    dest: 'dest/image/haiys02.jpg',
    orig: { expand: true, cwd: 'src/', src: [Object], dest: 'dest' } },
    { src: [ 'src/index.html' ],
    dest: 'dest/index.html',
    orig: { expand: true, cwd: 'src/', src: [Object], dest: 'dest' } },
    { src: [ 'src/js' ],
    dest: 'dest/js',
    orig: { expand: true, cwd: 'src/', src: [Object], dest: 'dest' } },
    { src: [ 'src/js/hellogrunt.js' ],
    dest: 'dest/js/hellogrunt.js',
    orig: { expand: true, cwd: 'src/', src: [Object], dest: 'dest' } },
    { src: [ 'src/js/helloworld.js' ],
    dest: 'dest/js/helloworld.js',
    orig: { expand: true, cwd: 'src/', src: [Object], dest: 'dest' } } ]
  8. template
    grunt.template.process(templateString, options): 处理模板字符串,与grunt.config.process相似但不同,返回string,options中的data属性存放context
    grunt.template.date(date, format): 格式化日期,format 'yyyy-mm-dd HH:MM:ss'
    grunt.template.today(format): 格式化今天的日期
  9. util
    grunt.util.kindOf(value): 返回值的类型,比typeof详细
    grunt.util.error(msg[, origError]): 返回一个错误
    grunt.util.linefeed: 当前系统的换行符
    grunt.util.normalizelf(string): 将string中的换行符替换成当前系统的换行符
    grunt.util.recurse(array/object, callback, continueFunction):  递归传入array/object的值,如果continueFunction返回false,则返回原值,continueFunction返回true,则返回callback的值。
    var arr = [1, 2, 3],
    result = grunt.util.recurse(arr, function(value) {
    console.log('value ' + value);
    return value * value;
    }, function(value) {
    if(value % 2 === 0)
    return false;
    });
    console.log('result ' + result);

    输出:

    value
    value
    result ,,

    grunt.util.repeat(n, str): 返回重复n次str的值
    grunt.util.pluralize(n, str, separator): 以separator分隔str并返回第n个元素
    grunt.util.spawn(options, doneFunction): 创建子进程执行任务,子进程退出时调用doneFunction
    options{cmd: command, grunt: false, args: arguments, opts: options, fallback: value}
    grunt.util.toArray(obj): 转换为数组
    grunt.util.callbackify: 将一个同步函数转换为异步函数,即将带返回值的函数转换为一个传入回调函数的函数

    function add1(a, b) {
    return a + b;
    }
    function add2(a, b, callback) {
    callback(a + b);
    } var fn1 = grunt.util.callbackify(add1);
    var fn2 = grunt.util.callbackify(add2); var result1 = fn1(1, 2, function(result) {
    console.log('1 plus 2 equals ' + result);
    });
    var result2 = fn2(1, 2, function(result) {
    console.log('1 plus 2 equals ' + result);
    }); console.log(result1);
    console.log(result2);

    输出:

    1 plus 2 equals 3
    1 plus 2 equals 3
    undefined
    undefined

  好了,这大体就是整个grunt的api介绍了,现在写一个比较完善和优美的Gruntfile.js应该不是什么问题了吧。
  以后有机会可能会补充些编写grunt plugin的内容,现在就告一段落了。

  

grunt对象之api的更多相关文章

  1. request对象常用API 获取请求参数的值 request应用 MVC设计模式

    1 request对象常用API   1)表示web浏览器向web服务端的请求   2)url表示访问web应用的完整路径:http://localhost:8080/day06/Demo1     ...

  2. JavaScript 对象所有API解析【2020版】

    JavaScript 对象所有API解析[2020版] 写于 2019年08月20日,虽然是2019年写的文章,但现在2020年依旧不过时,现在补充了2019年新增的ES10 Object.fromE ...

  3. JSP - 9大内置对象及其API

    内置对象:不需要预先声明就可以在脚本代码和表达式中随意使用,有以下特点 1.由JSP规范提供,不用编写者实例化 2.提供Web容器实现和管理 3.所有JSP页面均可用 4.只有在脚本元素的表达式或者代 ...

  4. js学习---常用的内置对象(API)小结 :

    内置对象(API): 日期 Date: getFullYear() 返回完整的4位的年份  如:2016 getMonth()    返回月份,从0开始 getDate()   返回当前月的第几天,当 ...

  5. JQUERY-事件-动画-类数组对象-添加自定义API

    正课: 1. 事件: 2. 动画: 3. 类数组对象操作: 4. 添加自定义API: 1. 事件: 1. 页面加载后执行: 2个时机 1. DOM内容加载完成: 仅包括html, js DOMCont ...

  6. 字符串、数组、对象常用API

    常用的字符串API  1.常见方法和属性 length 属性,获取字符串的字符数量 charAt(i) 返回给定位置的字符 charCodeAt( ) 返回给定位置的字符的字符编码 <scrip ...

  7. Servlet中常用对象及API类之间的关系

    Servlet最常用的对象: 请求对象:ServletRequest和HttpServletRequest,通过该对象获取来自客户端的请求信息 响应对象:ServletResponse和HttpSer ...

  8. 数组和对象常用API

    数组API: 1. forEach 遍历所有元素 var arr = [1,2,3] arr.forEach(function(item,index){ // 遍历数组的所有元素 console.lo ...

  9. Java 其他对象的 API

    System 类 (java.lang 包下) 该类中的方法和属性都是静态的. 常见方法 // 1, 获取当前时间的毫秒值 long currentTimeMillis(); // 2, 获取系统的属 ...

随机推荐

  1. Hibernate批量操作(二)

    Hibernate提供了一系列的查询接口,这些接口在实现上又有所不同.这里对Hibernate中的查询接口进行一个小结. 我们首先来看一下session加载实体对象的过程:Session在调用数据库查 ...

  2. 实例甜点 Unreal Engine 4迷你教程(6)之三个重要基础操作SpawnActor、TArray的Add和Remove

    本小节的教程需要完成前置教程:建议阅读<实例甜点 Unreal Engine 4迷你教程(5)>,因为5里面提到了本节的工程,不过也可以在不看5的前提下直接阅读本教程. 第一步:Empty ...

  3. rpmrebuild备份glibc

    任务: 备份已安装的glibc为RPM包,还原. 准备: 下载rpmrebuild 上传至服务器 链接: https://pan.baidu.com/s/1pKNGnur 密码: wgy9 操作: 1 ...

  4. JSONP 爬虫

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.mavne 依赖: <!--html 解析 : jsoup HTML parser library @ ...

  5. 自适应Simpson积分

    自适应Simpson积分 作用 如标题所示,这玩意就是当你不会微积分的时候来求积分的. 总所周知,积分的定义就是函数的某一段与坐标轴之间的面积. 那么,自适应Simpson积分就是一种可以再某些精度下 ...

  6. MySQL进程处于Waiting for table flush的分析

      最近遇到一个案例,很多查询被阻塞没有返回结果,使用show processlist查看,发现不少MySQL线程处于Waiting for table flush状态,查询语句一直被阻塞,只能通过K ...

  7. 字符串拼接data-id时注意事项

    今天测试下一个ajax请求,结果后台接收不到data-id的数据,导致后台无法进行正确的数据库查询. 我的评论页面是使用字符串拼接后,再放到页面里的,其中有关data-id的部分是这样的: '< ...

  8. Android开发中小知识

    1. Eclipse中代码对齐的快捷键:Ctrl+Shift+F 2.API打开显示“已取消到该网页的导航”——解决办法:右键文件属性,点击解除锁定即可

  9. sqlserver-4064

    早上忘记了SQLServer的sa帐户密码,在网上搜索才弄清楚了解决办法:1.在SQLServer企业管理器中输入以下命令:ALTER LOGIN sa ENABLE GO ALTER LOGIN s ...

  10. 利用CSS hover伪类改变其他元素的总结

    :hover 伪类经常用于页面的一些鼠标交互.链接点击变化,增强页面的用户体验,但是可以用来改变其他元素样式,可以在不使用JS 的情况下,达到想要的页面效果. 1.hover改变自身的效果: 鼠标悬浮 ...