grunt实用总结

文章梗概如下:

  1. 如何让Grunt在项目跑起来
  2. 初识:Gruntfile.js
  3. 术语扫盲:task & target
  4. 如何运行任务
  5. 任务配置
  6. 自定义任务
  7. 文件通配符:glob模式
  8. 文件通配符:例子
  9. 常用API
  10. 如何初始化Gruntfile.js
  11. 通过模板初始化Gruntfile.js
  12. 获取命令行参数
  13. 插件编写

入门简介:http://www.cnblogs.com/chyingp/p/what-is-grunt.html

如何让Grunt在项目跑起来

搞定下面三点,就可以愉快地使用grunt了。

  • 安装grunt-cli:globally,命令行工具,所有项目共用
  • 安装grunt:locally,每个项目单独安装
  • 项目根目录下配置文件:Gruntfile.js

初识:Gruntfile.js

module.exports = function(grunt) {
  // 任务配置
  grunt.initConfig({
    concat: {   // concat任务
        foo: {  // 一个任务可以包含多个子任务(官方术语叫做targetsample)
            src: ['a.js', 'b.js'],
            dest: 'ab.js'
        }
    }
  });

  // 配置任务
  grunt.loadNpmTasks('grunt-contrib-concat');
};

剩下的事情:

grunt concat

术语扫盲:task & target

task就是任务,target就是子任务。一个任务可以包含多个子任务。如下所示

 grunt.initConfig({
    concat: {   // task
        foo: {  // target
            src: ['a.js', 'b.js'],
            dest: 'ab.js'
        },
        foo2: {
            src: ['c.js', 'd.js'],
            dest: 'cd.js'
        }
    }
  });

如何运行任务

首先需要配置任务,比如压缩文件

grunt.initConfig({
    uglify: {
        src: 'main.js'
    }
});

然后运行任务

grunt uglify

任务配置

grunt里绝大多数都是文件操作,所以任务配置这一块会重点讲。简单举个例子,我们要将a.jsb.js合并成ab.js,该怎么做呢。

有四种配置方式

  1. Compact Formate
  2. Files Object(不推荐)
  3. Files Array
  4. Older Formats(不推荐,已废弃)

Compact Formate

特点:

  1. 每个target只支持一个src-dest
  2. 支持除了srcdest之外的参数
    concat: {
     foo: {
         src: ['a.js', 'b.js'],
         dest: 'ab.js'
     }
    }
    

File Object

特点:

  1. 每个target支持多个src-dest
  2. 不支持除了srcdest之外的参数
    concat: {
     foo: {
         files: {
             'ab.js': ['a.js', 'b.js']
         }
     }
    }
    

File Array

特点:

  1. 每个target支持多个src-dest
  2. 支持除了srcdest之外的参数
    concat: {
     foo: {
         files: [{
             src: ['a.js', 'b.js'],
             dest: 'ab.js'
         }]
     }
    }
    

中级配置

下面配置的意思:将src目录下的所有swf文件拷贝到dest目录下,并且与原来的目录结构保持一致。

例子:src/flash/upload.swf - dest/upload.swf

copy: {
    dist:{
        files: [{
            expand:true, // 设置为true,表示要支持cwd等更多配置
            cwd: 'src/flash', // 所有的源文件路径,都是相对于cwd
            src:'**/*.swf', // 表示sr/flashc目录下的所有swf文件,这里用了通配符
            dest: 'dist'  // 目标路径

        }]
    },

自定义任务

如果现有插件不能满足你的需求,自己写一个插件又太麻烦,可以考虑自定义任务

// 自定义任务
grunt.registerTask('hello', function(name){
    console.log('hello  ' + name);
});

然后,运行任务

grunt hello:casper

输出:

hello casper

文件通配符:glob模式

  1. * 匹配任意多个字符,除了/
  2. ? 匹配除了/之外的单个字符
  3. ** 匹配任意多个字符,包括/
  4. {} 匹配用逗号分割的or列表
  5. ! 用在模式的开通,表示取反
// You can specify single files:
{src: 'foo/this.js', dest: ...}
// Or arrays of files:
{src: ['foo/this.js', 'foo/that.js', 'foo/the-other.js'], dest: ...}
// Or you can generalize with a glob pattern:
{src: 'foo/th*.js', dest: ...}

// This single node-glob pattern:
{src: 'foo/{a,b}*.js', dest: ...}
// Could also be written like this:
{src: ['foo/a*.js', 'foo/b*.js'], dest: ...}

// All .js files, in foo/, in alpha order:
{src: ['foo/*.js'], dest: ...}
// Here, bar.js is first, followed by the remaining files, in alpha order:
{src: ['foo/bar.js', 'foo/*.js'], dest: ...}

// All files except for bar.js, in alpha order:
{src: ['foo/*.js', '!foo/bar.js'], dest: ...}
// All files in alpha order, but with bar.js at the end.
{src: ['foo/*.js', '!foo/bar.js', 'foo/bar.js'], dest: ...}

// Templates may be used in filepaths or glob patterns:
{src: ['src/<%= basename %>.js'], dest: 'build/<%= basename %>.min.js'}
// But they may also reference file lists defined elsewhere in the config:
{src: ['foo/*.js', '<%= jshint.all.src %>'], dest: ...}

常用API

常用API:文件

文件操作

grunt.file.read(filepath [, options])   // 读文件
grunt.file.readJSON(filepath [, options])   // 读文件:json
grunt.file.write(filepath, contents [, options])    // 写文件
grunt.file.copy(srcpath, destpath [, options])  // 拷贝文件
grunt.file.delete(filepath [, options]) // 删除文件

目录操作

grunt.file.mkdir(dirpath [, mode])  // 创建
grunt.file.recurse(rootdir, callback)   // 遍历

文件类型

grunt.file.exists(path1 [, path2 [, ...]])  // 指定的路径是否存在
grunt.file.isDir(path1 [, path2 [, ...]])   // 指定的路径是否目录
grunt.file.isFile(path1 [, path2 [, ...]])  // 指定的路径是否文件

路径

grunt.file.isPathAbsolute(path1 [, path2 [, ...]])  // 是否绝对路径
grunt.file.arePathsEquivalent(path1 [, path2 [, ...]])  // 是否等价路径
grunt.file.doesPathContain(ancestorPath, descendantPath1 [, descendantPath2 [, ...]]) // 后面的路径是否都是ancestorPath的子路径

API:日志

grunt.log.write(msg)
grunt.log.writeln(msg)

grunt.log.error([msg])  // 打印日志,并中断执行
grunt.log.errorlns(msg)

grunt.log.debug(msg)    // 只有加了--debug参数才会打印日志

API:任务

主要有以下几个

grunt.task.loadNpmTasks(pluginName) // 加载grunt插件

grunt.task.registerTask(taskName, description, taskFunction)    // 注册任务 || 给一系列任务指定快捷方式

grunt.task.run(taskList)    // 代码内部运行任务

grunt.task.loadTasks(tasksPath) // 加载外部任

grunt.task.registerMultiTask(taskName, description, taskFunction)   // 注册插件

定义任务

// 自定义任务
grunt.registerTask('hello', function(name){
    console.log('hello  ' + name);
});

指定别名

指定默认task(运行grunt任务时,如没有指定任务名,默认运行grunt default)

grunt.registerTask('default', ['concat']);

给一系列的任务指定别名

grunt.registerTask('dist', ['clean', 'concat', 'uglify']);

初始化Gruntfile.js

  1. 简单拷贝:简单粗暴有效
  2. 通过模板初始化:(推荐)

通过模板初始化Gruntfile.js

首先,你本地要确保安装了grunt-init,然后将 Gruntfile.js模板 下载到指定目录。具体目录参考这里。然后就很简单了

grunt-init gruntfile

回答几个简单问题

Please answer the following:
[?] Is the DOM involved in ANY way? (Y/n) n
[?] Will files be concatenated or minified? (Y/n) y
[?] Will you have a package.json file? (Y/n) y
[?] Do you need to make any changes to the above before continuing? (y/N) n

Gruntfile.js生成了!

-rw-r--r--  1 root  staff   2.0K  6 20 00:52 Gruntfile.js
-rw-r--r--  1 root  staff   287B  6 20 00:52 package.json

常用tips

获取命令行参数

比如运行了如下命令,怎么获取jshint参数的值呢

grunt dist --jshint=true

很简单

grunt.option('jshint');

 

插件编写

@todo

时间: 2024-08-02 21:59:19

grunt实用总结的相关文章

grunt从入门到自定义项目模板

文章还可在我的github上找到,排版更友好一点:grunt从入门到自定义项目模板 一.Grunt入门介绍 1. Grunt是神马 基于任务的命令行构建工具(针对JavaScript项目) 链接:http://gruntjs.com/ 2. 使用Grunt的理由 前端的工具算得上是五花八门,在介绍如何Grunt之前,首先我们得反问自己: Grunt能够帮我们解决什么问题? 是否有其他更合适的替代方案? 3. Grunt能够帮我们解决什么问题? 作为一名开发人员,我们见过了不少功能胡里花哨但并不实

超全超实用的Javascript类库和jQuery插件大全之二:文字处理,表格和列表处理,实用的javascript开发工具

日期:2012-10-15  来源:GBin1.com 如果你需要解决一些开发中遇到的技术问题的话,很可能会找到一些相关的javascript类库或者是jQuery插件来实现.这样实用的类库或者jQuery插件往往是你应该时常收集并且保存的,特别是如果你不希望自己去处理不同浏览器的兼容性问题的话,使用现成的javascript类库或者是jQuery插件往往能够帮助你提高开发效率. 使用javascript类库可能并不一定是最好的选择,很多情况1下可能你会发现类库加载并不正确,或者有性能上的问题,

优秀Web设计10项原则:创新实用富有美感

他能够为我们使用家用电器的方式掀起一场革命,现在我们仍然把它作为现代世界的设计灵感,最好例子就是Apple.Apple的许多畅销产品的核心功能都采用了Dieter Rams的设计原则. Dieter Rams最著名的设计思想是优秀设计的10项原则,这些原则通常用来做出好的设计或对其进行归类.这些原则包含了在创建项目的时候设计师需要考虑到的问题,但是这些原则最适用于工业设计,因为Dieter Rams正是在这个领域做出了非同寻常的作品,并得出了这些灵感. 这些原则并不是古板的戒律,并不是不能变通的

Mac实用快捷键有哪些 mac快捷键大全

  之前我们已经介绍过MacBook入门基础内容,以及mac的一些小工具技巧,还有新手必看mac系统常见疑问解答.今天,跟安下小编来跟更深入的了解Mac的用途以及更多Mac超实用使用技巧,mac快捷键大全就在这里. 有需要的朋友可以查看: 新手必看:mac系统常见疑问解答; Mac系统入门基本知识; 不多说,马上进入Mac实用快捷键教程. Mac中实用快捷键有哪些 Mac实用快捷键快速上手教程最常用的按键介绍: 1.win键,也称为"苹果键",也有人成为"花键" 2

最实用Win7技巧快捷操作介绍

Win7的桌面设置更加个性化,我们的照片.喜欢的壁纸,都可以随时设为背景,而女生们的桌面壁纸很多都比较卡哇伊,但如果去做演示时,投射到投影公示,也许就会带来一些尴尬.其实在演示前,我们只需要通过Win X快捷键打开移动中心,对演示设置进行一些简单的设置即可,这样在演示时, 作为职场丽人,移动办公.快捷办公,都是必不可少,有一个安全稳定的操作系统和顺手的Office 办公软件尤为重要.微软Win7系统自发布以来就受到用户的欢迎,其美观的界面.流畅的操作体验.安全稳定的运行.高效便捷的功能特性,已经

六款实用谷歌Chrome浏览器插件推荐

  1. Infinity:美观实用的新建标签页 安装链接:http://t.cn/RcUOryJ 厌倦了又丑又空的 Chrome 起始页面?Infinity 可以为你量身打造一个美观实用的新建标签页. 你可以在 Chrome 的起始页面添加 Gmail.eBay.支付宝.微信图标实现快速跳转.除此之外,Infinity 还自带笔记和待办项清单,能够让你一打开 Chrome 就可以看到还有多少待办事项,十分方便. 2. Adblock:屏蔽不喜欢的一切 安装链接:http://t.cn/zl9R

win7实用小功能一键完成批量改照片名字

现在喜欢旅游的人越来越多了,而很多人把图片上传到电脑的时候都是好几千张.而面对这几千张照片看到哪些名字想改名字呢量有太大了,不该名字又好难看.特别是有时候有一些我们比较喜欢的图片,那么才的名字,你下次跟朋友分享的时候,肯定会不知道看过的好图片在哪里. 1 win7比xp系统多了很多功能,即使是一样的功能也比xp系统强大很多.而上面说到问题,就可以用win7自带的功能来解决.下面就看看我是如何处理的吧. 2 处理图片 正常情况下,我们用拍照工具进行拍照,照片的名字都是摄像机根据时间和日期来进行命名

WPS2012艺术字的实用操作技巧

有时单位为了自身形像宣传与交流,需要印制一些内部刊物.而在刊物的编辑过程中,为了版面美观.大方更具吸引力,甚至动用了专业的图型处理软件,如Photoshop等.专业的软件虽说功能完善,可要想利用好这些专业软件,没有专业的知识与操作技能是很难操作的,如果版面要求不是过高,有些操作WPS是完全可以胜任的. 比如在设计.排版过程中,有时为了突出主题,需要插入一些艺术字,只要在功能栏切换到"插入"标签,点击"艺术字".在打开的"艺术字库"窗口中选择好艺术

48个涵盖多个领域的实用网站推荐

  按说我们日常推荐的各类设计网站也不少了,但是它们并不能解决所有的问题,因为许多常见的问题并不是设计相关的.为此博主 Johnny Webber 发掘了50个他认为极为实用的网站,它们所涵盖的领域非常多,但是仔细看会发现它们都是实用的网站.值得一提的是,互联网是瞬息万变的,每天有新的问题被解决了,也有旧的服务被关停.在我逐个查看的时候,其中2个网站已经被迫停止服务了.剩下的48个网站中肯定的有你需要的,不仅要收藏,还要真的用起来. 感谢每一个致力于解决实际问题的互联网从业者. 1. MapC.