用Grunt管理Nodejs项目

原文见: http://gruntjs.com/getting-started

http://www.gruntjs.org/docs/getting-started.html


1. Grunt是个啥东东?Javascript  任务运行工具。

2. 为啥要用它?

自动化呗。当你处理代码编译,单元测试,代码规范校验等重复任务时,你需要做的步骤越少,你的工作就越容易。想像有个任务运行工具,一旦你配置好了,几乎不用什么精力,一个任务运行工具就可以替代你跟你哦团队完成大部分工作。

而Grunt就是这样一个工具。而且随着使用的人越来越多,有各种各样的插件来帮组我们自动化的处理任务。而且每个人都可以把自己好的插件通过npm发布,共享

3. 咋用?

Grunt和Grunt的插件都是通过Node.js的包管理器npm来安装和管理的。

Grunt 0.4.x要求Node.js的版本>=0.8.0(也就是0.8.0及以上版本的Node.js才能很好的运行Grunt)。

安装Grunt之前,可以在命令行中运行node -v查看你的Node.js版本。

3.1 安装:

 为了方便使用Grunt,你应该在全局范围内安装Grunt的命令行接口(CLI)。要做到这一点,你可能需要使用sudo(OS X,*nix,BSD等平台中)权限或者作为超级管理员(Windows平台)来运行shell命令。

npm install -g grunt-cli

这条命令将会把grunt命令植入到你的系统路径中,这样就允许你从任意目录来运行它(定位到任意目录运行grunt命令)。

注意,安装grunt-cli并不等于安装了grunt任务运行器!Grunt CLI的工作很简单:在Gruntfile所在目录调用运行已经安装好的相应版本的Grunt。这就意味着可以在同一台机器上同时安装多个版本的Grunt。

3.2窥探内部原理:

每次运行grunt时,它都会使用node的require()系统查找本地已安装好的grunt。正因为如此,你可以从你项目的任意子目录运行grunt

如果找到本地已经安装好的Grunt,CLI就会加载这个本地安装好的Grunt库,然后应用你项目中的Gruntfile中的配置(这个文件用于配置项目中使用的任务,Grunt也正是根据这个文件中的配置来处理相应的任务),并执行你所指定的所有任务。

假设已经安装好Grunt CLI并且项目也已经使用一个package.json和一个Gruntfile文件配置好了,那么接下来用Grunt进行工作就非常容易了:

  1. 进入到项目的根目录(在命令行面板定位到项目根目录。在windows系统下,也可以进入项目根目录的文件夹后,按Shift+鼠标右键,打开右键菜单,选择“在此处打开命令窗口(W)”)。
  2. 运行npm install安装项目相关依赖(插件,Grunt内置任务等依赖)。
  3. 使用grunt(命令)运行Grunt。

就是这么简单。已经安装的Grunt任务可以通过运行grunt --help列出来,但是通常最好还是先查看一下项目的文档。

3.3 从0开始配置:

一个典型的配置过程通常只涉及到两个文件:package.jsonGruntfile

package.json:这个文件被用来存储已经作为npm模块发布的项目元数据(也就是依赖模块)。你将在这个文件中列出你的项目所依赖的Grunt(通常我们在这里配置Grunt版本)和Grunt插件(相应版本的插件)。

package.jsonGruntfile相邻,它们都应该归属于项目的根目录中,并且应该与项目的源代码一起被提交。在上述目录(package.json所在目录)中运行npm install将依据package.json文件中所列出的每个依赖来自动安装适当版本的依赖。

这里有一些为项目创建package.json文件的方式:

  • 大多数的grunt-init模板都会自动创建一个项目特定的package.json文件。

  • npm init命令会自动创建一个基本的package.json文件。

  • 从下面的例子开始并根据规范来按需扩展。

{
    "name": "my-project-name", // 项目名称
    "version": "0.1.0", // 项目版本
   
   
"main" : "index.js" ,
   "scripts" : {
     "test" : "echo \"Error: no test specified\" && exit 1"
   },
   "repository" : {
     "type" : "git" ,
     "url" : "git://×××.git"
   },
   "author" : "×××" ,
   "license" : "×××" ,
   "readmeFilename" : "README.md" ,
   "gitHead" : "×××" ,
  "devDependencies": { // 项目依赖 "grunt": "~0.4.1", // Grunt库 "grunt-contrib-jshint": "~0.6.0", //以下三个是Grunt内置任务 "grunt-contrib-nodeunit": "~0.2.0", "grunt-contrib-uglify": "~0.2.2"
”qunitjs": "~1.14.0"
 }}
安装Grunt和grunt插件

添加Grunt和Grunt插件到一个现有的package.json中最简单的方式就是使用npm install <module> --save-dev命令。这不仅会在本地安装<module>,它还会使用一个波浪形字符的版本范围自动将所安装的<module>添加到项目依赖中。

例如使用下面的命令将会安装最新版的Grunt到你的项目中,并自动将它添加到你的项目依赖中:

npm install grunt --save-dev

上述命令也可以用于Grunt插件和其他的node模块的安装。当完成操作后请确保更新后的package.json文件也要与你的项目一起提交。


Gruntfile:通常这个文件被命名为Gruntfile.js或者Gruntfile.coffee,它用于配置或者定义Grunt任务和加载Grunt插件。

Gruntfile.js或者Gruntfile.coffee文件都是归属于你项目根目录中的一个有效的JavaScript或者CoffeeScript文件(和package.json文件一样都在根目录中),并且它(Gruntfile)也应该与你的项目源文件一起提交。

一个Gruntfile由下面几部分组成:

  • "wrapper"函数(包装函数)
  • 项目和任务配置
  • 加载的Grunt插件和任务
  • 自定义任务
一个Gruntfile示例

在下面的Gruntfile中,项目的元数据会从项目的package.json文件中导入到grunt配置中,同时grunt-contrib-uglify插件的uglify任务被配置用于压缩一个源文件,同时使用该元数据(导入的元数据)动态的生成一个标语(banner)注释。在命令行运行grunt时默认会运行uglify任务。


module.exports = function(grunt){

    // 项目配置
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        uglify: {
            options: {
                banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
            },
            build: {
                src: 'src/<%=pkg.name %>.js',
                dest: 'build/<%= pkg.name %>.min.js'
            }               
        }
    });

    // 加载提供"uglify"任务的插件
    grunt.loadNpmTasks('grunt-contrib-uglify');

    // 默认任务
    grunt.registerTask('default', ['uglify']);
}


现在你已经看到到了一个完整的Gruntfile,下面让我们来看看它的各个组成部分:

"wrapper"函数

每个Gruntfile(和Grunt插件)都使用这个基本格式,并且所有你的Grunt代码都必须指定在这个函数里面:

module.exports = function(grunt) {
    // 在这里处理Grunt相关的事情
}
项目和任务配置

大多数Grunt任务所依赖的配置数据都被定义在传递给grunt.initConfig方法的一个对象中。

在这个例子中,grunt.file.readJSON('package.json')会把存储在package.json中的JSON元数据导入到Grunt配置中。由于<% %>模板字符串可以引用任意的配置属性,因此可以通过这种方式来指定诸如文件路径和文件列表类型的配置数据,从而减少一些重复的工作(比如我们通常需要通过复制粘贴的方式来在不同的地方引用同一属性, 使用<% %>的方式可以简单的理解为将某些特定的数据存储在变量中,然后在其他地方像使用变量一样就可以使用这些数据属性)。

你可以在这个配置对象中(传递给initConfig()方法的对象)存储任意的数据,只要它不与你任务配置所需的属性冲突,否则会被忽略。此外,由于这本身就是JavaScript,你不仅限于使用JSON;你可以在这里使用任意的有效的JS代码。如果有必要,你甚至可以以编程的方式生成配置。

与大多数任务一样,grunt-contrib-uglify插件的uglify任务要求它的配置被指定在一个同名属性中。在这里有一个例子, 我们指定了一个banner选项(用于在文件顶部生成一个注释),紧接着是一个单一的名为build的uglify目标,用于将一个js文件压缩为一个目标文件(比如将src目录jquery-1.9.0.js压缩为jquery-1.9.0.min.js然后存储到dest目录)。

// 项目配置
grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    uglify: {
        options: {
            banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
        },
        build: {
            src: 'src/<%=pkg.name %>.js',
            dest: 'build/<%= pkg.name %>.min.js'
        }
    }
});
加载grunt插件和任务

许多常用的任务像concatenationminificationlinting都被作为grunt插件来使用。只要一个插件被作为一个依赖指定在项目的package.json文件中,并且已经通过npm install安装好,都可以在你的Gruntfile文件中使用下面这个简单的命令启用它(所依赖的任务)。

// 加载提供"uglify"任务的插件
grunt.loadNpmTasks('grunt-contrib-uglify');

注意: grunt --help命令可以列出所有可用的任务。

自定义任务

你可以通过定义一个default任务来配置Grunt,让它默认运行一个或者多个任务。在下面的例子中,在命令行中运行grunt而不指定特定的任务将自动运行uglify任务。这个功能与显示的运行grunt uglify或者等价的grunt default一样。你可以在任务参数数组中指定任意数量的任务(这些任务可以带参数,也可以不带参数)。

// 默认任务
grunt.registerTask('default', ['uglify']);

如果你的项目所需的任务没有对应的Grunt插件提供相应的功能,你可以在Gruntfile内定义自定义的任务。例如,下面的Gruntfile就定义了一个完整的自定义的default任务,它甚至没有利用任务配置(没有使用grunt.initConfig()方法):

module.exports = function(grunt) {
    // 一个非常基础的default任务
    grunt.registerTask('default', 'Log some stuff.', function() {
        grunt.log.write('Logging some stuff...').ok();
    });
};

自定义的项目特定的任务可以不定义在Gruntfile中;它们可以定义在一个外部.js文件中,然后通过grunt.loadTasks方法来加载。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值