Grunt是基于Node.js的项目构建工具。它可以自动运行你所设定的任务。Grunt拥有数量庞大的插件,几乎任何你所要做的事情都可以用Grunt实现。

一头野猪映入眼帘,意:咕噜声

中文网站:http://www.gruntjs.net/

英文网站:http://gruntjs.com/

为何要用构建工具?

一句话:自动化。对于需要反复重复的任务,例如压缩(minification)、编译、单元测试、linting等,自动化工具可以减轻你的劳动,简化你的工作。当你在 Gruntfile 文件正确配置好了任务,任务运行器就会自动帮你或你的小组完成大部分无聊的工作。

为什么要使用Grunt?

Grunt生态系统非常庞大,并且一直在增长。由于拥有数量庞大的插件可供选择,因此,你可以利用Grunt自动完成任何事,并且花费最少的代价。如果找不到你所需要的插件,那就自己动手创造一个Grunt插件,然后将其发布到npm上吧。

安装grunt:

首先安装node,http://nodejs.cn/

通过node安装grunt,命令:(windows在cmd中,Linux\Mac在命令行中)

安装grunt命令行grunt-cli(npm install -g grunt-cli),该步全局安装。

添加package.json文件(npm init)

安装grunt(npm install grunt --save-dev)(要通过命令行切换到项目目录后在执行上诉两步操作,--save-dev是将包依赖到项目开发环境中,--save是将包依赖到项目生产环境中)

安装好后会发现在项目目录多了 package.json文件,以及node_modules 文件夹,如下:

package.json文件:声明模块用的,键值对的形式,包名和版本号会存放其中

node_modules:存放包的文件夹(如grunt、gulp、bower、yeoman等)

实战:

安装 load-grunt-tasks (npm install load-grunt-tasks  --save-dev)

安装 time-grunt (npm install time-grunt  --save-dev)

安装 time-grunt (npm install grunt-contrib-copy  --save-dev)

安装 time-grunt (npm install grunt-contrib-clean --save-dev)

创建gruntfile.js,该文件用于自动化构建功能的设置:

下面我们来实现将文件拷入目标目录,和从目标目录中清除

在项目目录下建立源文件目录app, 目录里存放js文件夹和index.html, js文件夹内存放index.js 文件, 结构如下

设置 gruntfile.js 文件:

 'use strict'; //使用ES5严格方式

  module.exports = function(grunt){
require('load-grunt-tasks')(grunt);
require('time-grunt')(grunt); var config = {
app: 'app',
dist: 'dist'
} grunt.initConfig({
config: config,
copy: { //拷贝
dist: {
src:'<%= config.app %>/index.html', //源文件
dest: '<%= config.dist %>/index.html' //目标文件
}
},
clean: { //清除
dist: {
src: '<%= config.dist %>/index.html' //目标文件
}
}
})
}

这样就实现了将源文件拷到目标目录,亦可清除

 copy: {
dist_html: {
src:'<%= config.app %>/index.html',
dest: '<%= config.dist %>/index.html'
},
dist_js: {
src:'<%= config.app %>/js/index.js',
dest: '<%= config.dist %>/js/index.js'
}
},
clean: {
dist: {
src: ['<%= config.dist %>/index.html', '<%= config.dist %>/js/index.js']
}
}

将js文件一起拷贝,清除操作,注意src的值可以写成数组的形式

 copy: {
dist: {
files:[
{
src:'<%= config.app %>/index.html',
dest: '<%= config.dist %>/index.html'
},
{
src:'<%= config.app %>/js/index.js',
dest: '<%= config.dist %>/js/index.js'
}
]
}
},

拷贝部分可以这样写,以数组的形式,里面放入obj键值对

还可以这样写,更加简便,如下:

 copy: {
dist: {
files:{
'<%= config.dist %>/index.html': '<%= config.app %>/index.html', '<%= config.dist %>/js/index.js': ['<%= config.app %>/js/index.js']
}
}
},

直接写成obj键值对,源文件作为值,当然可以将其写成数组的形式,以便处理多个源文件

清除操作可以批量处理,如下,通过通配符,进行批量操作:

还可以添加参数,设置只清除文件(isFile)\只清除目录(isDirectory),这些值到node官网即可找到(找stats关键词)

 clean: {
dist: {
src: '<%= config.dist %>/**/*'
}
}
 clean: {
dist: {
src: '<%= config.dist %>/**/*',
filter: 'isFile'
}
}

还可以自定义方法:意思是不删除目录(!代表否)

 clean: {
dist: {
src: '<%= config.dist %>/**/*',
filter: function(filepath){
return (!grunt.file.isDir(filepath))
}
}
}

动态拷贝文件:

copy: {
dist: {
files:[
{
expand: true,   //动态拷贝文件
cwd: '<%= config.app %>/', //源文件目录
src: '*.html', //源文件
dest: '<%= config.dist %>/', //目标文件目录
ext: '.min.html' //添加后缀
extDot: 'first', //找第一个点加后缀
flatten: true,  //去掉中间各层目录,直接拷贝
rename: function(dest, src){ //将中间目录加回来
                  return dest + 'js/' +src;
                 }
}
]
}
},

以上便是grunt实现的源文件拷贝到目标目录,以及从目标目录清除的操作。(还包括添加后缀,去掉中间目录的一些小操作)

scales小谈grunt的更多相关文章

  1. Scales小谈gulp

     gulp是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务. 外网:http://gulpjs.com/ 中文官网:http://www.gulpjs.com.cn/ 易于使用 ...

  2. DevStore开发人员服务有奖征文:小谈新浪微博开放平台

    DevStore开发人员服务有奖征文:小谈新浪微博开放平台 笔者接入新浪微博开发平台也有一段时间了,对整个平台的接入也算比較熟悉,新浪提供了统一的API接口,能够让开发人员更方便的使用API来实现自己 ...

  3. 小谈Java里的线程

    今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...

  4. 小谈Scrum敏捷开发流程

    一晃眼,有两年没有写博客了,回顾前两年,各种奔波,各种忙碌,也有不少的收获.从今天开始,我要把这些收获都分享在这里. 其实这两年,对我影响最大的是开发流程.总所周知,一个好的开发流程,对于项目的进行, ...

  5. iOS 小谈开发者中的个人、组织(公司、企业)账号

    苹果对开发者主要分为3类:个人.组织(公司.企业).教育机构.即: 1.个人(Individual) 2.组织(Organizations) 组织类又分为2个小类: (1)公司(Company) (2 ...

  6. Http与Socket小谈

    http与socket是网络编程中最为重要的概念,不管是客户端还是服务端,都是最为重要的部分,以下简述两者的关系和区别(个人见解). Http 定义 基于应用层的超文本传输协议.通常承载于TCP/IP ...

  7. 小谈 - web模仿手机打电话与正则表达式

    昨天遇到了一个很棘手的问题,就是手机端调用web端的页面,如果用编辑器插入的内容页面中有电话的的数据就要变一下格式,让手机端可以实现拨号的功能. 研究了半天就是没一点头绪,但是偶尔看到数据中每一个电话 ...

  8. 小谈React、React Native、React Web

    React有三个东西,React JS 前端Web框架,React Native 移动终端Hybrid框架,React Web是一个源码转换工具(React Native 转 Web,并之所以特别提出 ...

  9. PHP 小谈静态用法

    1.静态的表现形式,在PHP中定义一个静态变量需要加入一个关键字——static,静态对象是属于类的,非静态对象是属于对象的 class Fenbi { public $changdu;//属于对象的 ...

随机推荐

  1. http://www.cnblogs.com/figure9/p/developer-reading-list.html

    http://www.cnblogs.com/figure9/p/developer-reading-list.html

  2. log4j.properties 详解与配置步骤(转)

    找的文章,供参考使用 转自 log4j.properties 详解与配置步骤 一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR ...

  3. poj 3255 Roadblocks

    Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13216 Accepted: 4660 Descripti ...

  4. Linux虚拟机突然不能上网了

    之前是可以的,然后这次打开突然不能上网了. 更改配置后就好了: 配置如下: 我的问题是打开打开之后变成了OFF不是ON了.然后不管怎么改变O都失败了. 改为: 这样虚拟机这边就好了. 我们看下wind ...

  5. Construct Binary Tree from Preorder and Inorder Traversal

    Construct Binary Tree from Preorder and Inorder Traversal Given preorder and inorder traversal of a ...

  6. QT 数据库编程一

    QT如果要进行网络编程首先需要在.pro中添加如下代码:QT += network //logindlg.h #ifndef LOGINDLG_H #define LOGINDLG_H #includ ...

  7. MD5算法的C语言实现

    1 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h ...

  8. (十七)迭代器模式详解(foreach的精髓)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...

  9. Windows Phone 8 下载文件进度

    后台代码: public partial class MainPage : PhoneApplicationPage { private long siz; private long speed; p ...

  10. ASP.NET Web API 实现客户端Basic(基本)认证 之简单实现

    优点是逻辑简单明了.设置简单. 缺点显而易见,即使是BASE64后也是可见的明文,很容易被破解.非法利用,使用HTTPS是一个解决方案. 还有就是HTTP是无状态的,同一客户端每次都需要验证. 实现: ...