[黄映焜/Tunny,20140711]
Grunt是一个javaScript任务管理器,对于需要反复重复的任务,例如压缩、编译、单元测试、代码检查等,自动化工具可以减轻你的劳动,简化你的工作。
本文将通过官方示例整理一些入门级知识,适合需要了解Grunt的开发者阅读。
Grunt的task配置都是在 Gruntfile 中的grunt.initConfig方法中指定的。
当运行一个任务时,Grunt会自动查找配置对象中的同名属性。
多任务(multi-task)可以通过任意命名的“目标(target)”来定义多个配置。
同时指定任务(task)和目标(target),例如grunt concat:foo或者grunt concat:bar,将只会处理指定目标(target)的配置,而运行grunt concat将遍历所有目标(target)并依次处理。
在一个任务配置中,options属性可以用来指定覆盖内置属性的默认值。此外,每一个目标(target)中还可以拥有一个专门针对此目标(target)的options属性。目标(target)级的options将会覆盖任务级的options。
grunt.initConfig({ // Grunt的配置 concat: { // concat任务的配置信息 options: { // 这里是任务级的Options,覆盖默认值 }, foo: { files: { // 文件对象格式 'dest/a.js': ['src/aa.js', 'src/aaa.js'], 'dest/a1.js': ['src/aa1.js', 'src/aaa1.js'], }, options: { // "foo" target options may go here, overriding task-level options. }, }, bar: { //bar任务的配置信息 files: [ // 文件数组格式 {src: ['src/bb.js', 'src/bbb.js'], dest: 'dest/b/', nonull: true}, {src: ['src/bb1.js', 'src/bbb1.js'], dest: 'dest/b1/', filter: 'isFile'}, ], }, }, uglify: { // uglify任务的配置信息 bar: { src: ['src/bb.js', 'src/bbb.js'], // 简洁格式 源文件 dest: 'dest/b.js', // 目标文件 }, }, //任意数据});
如果没有指定一个任务,并且已经定义一个名为 "default" 的任务,那么该任务将会默认被执行
grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);/*定义一个 'default' 任务,如果运行Grunt时没有指定任何任务,它将自动执行'jshint'、'qunit'、'concat' 和 'uglify' 任务*/
简洁格式
所有的文件格式都支持src和dest属性,此外"Compact"[简洁]和"Files Array"[文件数组]格式还支持以下一些额外的属性:
文件对象格式
这种形式支持每个目标对应多个src-dest形式的文件映射,属性名就是目标文件,源文件就是它的值(源文件列表则使用数组格式声明)。可以使用这种方式指定数个src-dest文件映射, 但是不能够给每个映射指定附加的属性。
文件数组格式
这种形式支持每个目标对应多个src-dest文件映射,同时也允许每个映射拥有额外属性.
filter属性可以给你的目标文件提供一个更高级的详细帮助信息。只需要使用一个有效的fs.Stats 方法名。下面的配置仅仅清理一个与模式匹配的真实的文件:
grunt.initConfig({ clean: { foo: { src: ['tmp/**/*'], filter: 'isFile', }, },});
或者创建你自己的filter函数,根据文件是否匹配来返回true或者false。下面的例子将仅仅清理一个空目录:
grunt.initConfig({ clean: { foo: { src: ['tmp/**/*'], filter: function(filepath) { return (grunt.file.isDir(filepath) && require('fs').readdirSync(filepath).length === 0); }, }, },});
通配符
foo/*.js //匹配位于foo/目录下的所有的.js结尾的文件
foo/**/*js //匹配foo/目录以及其子目录中所有以.js结尾的文件
Grunt允许指定一个数组形式的文件路径或者一个通配符模式
// 指定单个文件:
{src: 'foo/this.js', dest: ...}
// 指定一个文件数组:
{src: ['foo/this.js', 'foo/that.js', 'foo/the-other.js'], dest: ...}
// 使用一个匹配模式:
{src: 'foo/th*.js', dest: ...}
动态构建文件对象
当你希望处理大量的单个文件时,这里有一些附加的属性可以用来动态的构建一个文件列表。这些属性都可以用于Compact和Files Array文件映射格式。
grunt.initConfig({ uglify: { static_mappings: { files: [ {src: 'lib/a.js', dest: 'build/a.min.js'}, {src: 'lib/b.js', dest: 'build/b.min.js'}, {src: 'lib/subdir/c.js', dest: 'build/subdir/c.min.js'}, {src: 'lib/subdir/d.js', dest: 'build/subdir/d.min.js'}, ], }, dynamic_mappings: { files: [ { expand: true, // Enable dynamic expansion. cwd: 'lib/', // Src matches are relative to this path. src: ['**/*.js'], // Actual pattern(s) to match. dest: 'build/', // Destination path PRefix. ext: '.min.js', // Dest filepaths will have this extension. }, ], }, },});
使用<% %>分隔符指定的模板会在任务从它们的配置中读取相应的数据时将自动扩展扫描。模板会被递归的展开,直到配置中不再存在遗留的模板相关的信息(与模板匹配的)。
grunt.initConfig({ concat: { sample: { options: { banner: '/* <%= baz %> *//n', // '/* abcde *//n' }, src: ['<%= qux %>', 'baz/*.js'], // [['foo/*.js', 'bar/*.js'], 'baz/*.js'] dest: 'build/<%= baz %>.js', // 'build/abcde.js' }, }, //用于任务配置模板的任意属性 foo: 'c', bar: 'b<%= foo %>d', // 'bcd' baz: 'a<%= bar %>e', // 'abcde' qux: ['foo/*.js', 'bar/*.js'],});
Grunt有grunt.file.readJSON和grunt.file.readYAML两个方法分别用于引入JSON和YAML数据。
[版本v2.0]
黄映焜/Tunny Wong:
2014-07-11发表v1.0
2014-07-13第一次更新v2.0
新闻热点
疑难解答