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

 
标签: grunt

grunt实用总结的更多相关文章

  1. 应用Grunt自动化地优化你的项目前端

    在不久前我曾写了一篇 应用r.js来优化你的前端 的文章,为大家介绍了r.js这个实用工具,它可以很好地压缩.合并前端文件并打包整个项目.但是如果将r.js放到项目中,我们不得不顾及到一个问题——项目 ...

  2. node.js grunt文件压缩

    对于前段来说,熟悉node的人其实还并不是太多,如果您想入门一门后端语言我建议还是从node入手最好. 我也是最近开始学习node,来谈谈近期对node的学习的心得. 提到node首先就是要安装一大堆 ...

  3. Grunt教程——初涉Grunt

    前端自动化,这样的一个名词听起来非常的有吸引力,向往力.当今时代,前端工程师需要维护的代码变得及为庞大和复杂,代码维护.打包.发布等流程也 变得极为繁琐,同时浪费的时间和精力也越来越多,当然人为的错误 ...

  4. Grunt打包GMU组件 报错处理

    莫Q群的大神推荐移动GMU组件,GMU是基于zepto的mobile UI组件库,提供webapp.pad端简单易用的UI组件,官网:http://gmu.baidu.com/具有以下特点: 简单易用 ...

  5. 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

  6. 前端自动化构建工具Grunt

    一.了解Gurnt(http://www.open-open.com/lib/view/open1433898272036.html) Grunt 是一个基于任务的JavaScript工程命令行构建工 ...

  7. 基于gulp编写的一个简单实用的前端开发环境

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

  8. 高效开发之SASS篇 灵异留白事件——图片下方无故留白 你会用::before、::after吗 link 与 @import之对比 学习前端前必知的——HTTP协议详解 深入了解——CSS3新增属性 菜鸟进阶——grunt $(#form :input)与$(#form input)的区别

    高效开发之SASS篇   作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家 ...

  9. 【前端福利】用grunt搭建自己主动化的web前端开发环境-完整教程

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发者.假设你如今还不知道grunt或者听说过. ...

随机推荐

  1. (大数据工程师学习路径)第四步 SQL基础课程----SQL介绍及mysql的安装

    一.数据库和SQL介绍 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它的产生距今已有六十多年.随着信息技术和市场的发展,数据库变得无处不在:它在电子商务.银行系统等众多领域都 ...

  2. SQLserver创建与主外键的看法

    一个.背景 最初研究的相关内容数据库.仅仅是正式.从来没有练过,只能慢慢漂流,现在做的客房时,,非常多的知识需要使用视图,慢的实践. 视图:我理解的就是一张表.它把我们所须要的某个表或某几个表中的部分 ...

  3. eclipse+Java2WSDL+WSDL2Java 2012-12-06 12:32:43| 分类: j2ee |报道|字体大小 认购 一、eclipse如何使用低axis生成wsdl 可以使用

    eclipse+Java2WSDL+WSDL2Java 一.eclipse下怎样用axis生成wsdl 能够使用axis提供的Java2WSDL功能生成所要公布类的 WSDL,过程例如以下:  1.在 ...

  4. validateRequest="false"属性及xss攻击

    validateRequest="false"   指是否要IIS验证页面提交的非法字符,比如:>,<号等,当我们需要将一定格式得html代码获得,插入数据库时候,就要 ...

  5. WebApi路由及版本控制

    public class WebApiControllerSelector : IHttpControllerSelector { private const string NamespaceKey ...

  6. EF4.1: Add/Attach and Entity States(EF中的实体状态转换说明)

    实体的状态,连接以及 SaveChanges 方法 数据库上下文对象维护内存中的对象与数据库中数据行之间的同步.这些信息在调用 SaveChanges方法被调用的时候使用.例如,当使用 Add 方法传 ...

  7. ArcGIS API for Silverlight 使用GP服务实现要素裁剪功能

    原文:ArcGIS API for Silverlight 使用GP服务实现要素裁剪功能 昨天一QQ好友问了一个关于裁剪的问题,感觉自己也没有帮上什么忙,之后自己做了一个裁剪的例子,不过在做这个例子的 ...

  8. 6最好的之一 HTML5/CSS3 演示(PPT)框架

    HTML 是全世界最流行的网页编程语言.而HTML5是这门语言的升级版本号.越来越多的开发人员和设计师開始使用HTML5.以下介绍几个 HTML5/CSS3 的演示工具和框架,你能够用它们来创建你的网 ...

  9. php传引用和全局变量

    原文:php传引用和全局变量 <?php /* * 函数内部改变变量的值两种方法 */ $a = 10; /* *方法一 :函数参数传引用 */ function methodOne(& ...

  10. 网站静态化处理—web前端优化—中(12)

    网站静态化处理—web前端优化—中(12) Web前端很多优化原则都是从如何提升网络通讯效率的角度提出的,但是这些原则使用的时候还是有很多陷阱在里面,如果我们不能深入理解这些优化原则背后所隐藏的技术原 ...