初识Grunt

首先说一下什么是构建工具,其实很简单,就是在开发的时候,我们为了使代码可维护,常常会把项目分为几个模块,但是在上线的时候,我们要是线上网页对数据文件的请求次数尽可能少,这里的数据包括js,css文件,图片等,所以我们需要把多个css文件和多个js文件,分别合并为一个,然后为了减少体积,提高页面的效率,我们需要把不必要的空格神马的都去掉,代码能简则简。这其实就是合并代码并压缩的过程,构建工具简单地说,就是做这些事情。

接下来言归正传,开始了解Grunt。

 

按照我以往的学习习惯,我一般会是这个顺序学习一个东西:

了解它是什么

了解怎么运行

了解怎么用

试验

有了一个大致了解后,再深入。

 

所以这篇文章就是对Grunt有一个大致的了解,不过Grunt也是很简单的,真的不需要太多功夫就可以学会,难点在于对每个插件的使用

 

Grunt中文官网:gruntjs.net

Grunt英文官网:gruntjs.com

 

NPM的全称是Node.js Package Manager,很显然就是Node.js的包管理工具。Grunt也是基于node的,所以grunt也是要使用npm来安装的。所以首先我们要安卓node.js,版本一定在0.8.0以上。

 

接下来我们来到你的项目的根目录下,我们使用grunt要依赖两个文件,这个两个文件分别是package.json和Gruntfile.js。

其中package.json,通俗的说,但是不一定很准确,就是用来管理和记录grunt的插件的,每当你安装一个插件,都会在package.json里面记上一笔。如果你没使用命令行去修改package.json,也要手动修改这个文件的。下面就是一个package.json的例子。

 

{
      "name": "access",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "",
      "license": "ISC",
      "devDependencies": {
        "grunt": "^0.4.5",
        "grunt-contrib-concat": "^0.5.1",
        "grunt-contrib-connect": "^0.10.1",
        "grunt-contrib-copy": "^0.8.0",
        "grunt-contrib-cssmin": "^0.12.2",
        "grunt-contrib-jshint": "^0.11.2",
        "grunt-contrib-sass": "^0.9.2",
        "grunt-contrib-uglify": "^0.9.1",
        "grunt-contrib-watch": "^0.6.1",
        "grunt-filerev": "^2.3.1",
        "grunt-usemin": "^3.0.0"
      }
}
        

 

  

 

Gruntfile.js这个文件主要是用来做 设置配置,加载插件,注册任务这3个事儿。下面是一个Gruntfile.js的例子

 

module.exports = function(grunt) {
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),

        copy: {
            build: {
                files: [
                    {
                        expand: true,
                        dest: 'release',
                        cwd: 'develop',
                        src: ['index.html', 'scripts/lib/jquery.js', 'data/data.js', 'data/images/*', 'data/images/css/*']
                    }
                ]
            }
        },
        concat: {
            generatedjs: {
                files: [
                    {
                        dest: '.tmp/concat/scripts/app.js',
                        src: [
                            'develop/scripts/lib.js',
                            'develop/scripts/search.js',
                            'develop/scripts/websites.js',
                            'develop/scripts/drag.js',
                            'develop/scripts/page-num.js',
                            'develop/scripts/popup-window.js'
                        ]
                    }
                ]
            },
            generatedcss: {
                files: [
                    {
                        dest: '.tmp/concat/styles/app.css',
                        src: [
                            'develop/styles/base.css',
                            'develop/styles/search.css',
                            'develop/styles/websites.css',
                            'develop/styles/page-num.css',
                            'develop/styles/popup-window.css'
                        ]
                    }
                ]
            }
        },
        uglify: {
            generated: {
                files: [
                    {
                        dest: 'release/scripts/app.js',
                        src: ['.tmp/concat/scripts/app.js']
                    }
                ]
            }
        },
        cssmin: {
            generated: {
                files: [{
                    expand: true,
                    cwd: '.tmp/concat/styles',
                    src: ['app.css'],
                    dest: 'release/styles',
                    ext: '.css'
                }]
            }
        },
        useminPrepare: {
            html: 'release/index.html'
        },
        usemin: {
            html: 'release/index.html',
            js: [
                'release/scripts/{,*/}*.js'
            ],
            css: [
                'release/styles/{,*/}*.css'
            ]
        }
    });

    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-jshint');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-filerev');
    grunt.loadNpmTasks('grunt-usemin');

    grunt.registerTask('build',[
        'copy:build',
        'useminPrepare',
        'concat:generatedjs',
        'concat:generatedcss',
        'cssmin:generated',
        'uglify:generated',
        'usemin'
    ]);
}

 

当所有需要用的插件都安装好了,然后这两个文件都配置好了,我们在它们俩所在的目录运行grunt build,就可以将相应的代码合并并且压缩,我们也可以使用插件jshint来检查合并后的js文件里面是否存在简单的语法错误。

了解了它是什么,怎么运行,怎么用之后,我们开始具体的实验吧。

第一步,我们要把grunt这个命令做一个全句化,在命令行输入一下命令:

npm install -g grunt-cli

这条命令的是作用是:将grunt放在你的系统路径下,也就是system path,使得你再任何一个目录下都可以使用grunt命令。但是,一定要注意,这只是把grunt命令加入全局中,而不是安装了grunt,我们接下来还是要安装grunt的。

第二步,配置package.json文件。进入项目的根目录,输入命令:

npm init

其中项目的名字就是你文件的名字,也就是根目录的名字,其他的不懂什么意思的都可以直接按回车跳过。配置结束后,你看dir或者ll一下,项目的文件里会多了一个package.json文件。

第三步,安装grunt以及其插件。命令如下:

//安装grunt
npm install grunt --save-dev
//安装grunt插件 grunt-contrib-cssmin
npm install grunt-contrib-cssmin --save-dev

这里 --save-dev的作用就是把安装的插件写在package.json里面的devDependencies里面。

 第四部,当你要使用的插件都安装好了,我们开始配置Gruntfile.js这个文件。

Gruntfile.js这个文件通常包括一个wrap函数,函数里面包括三个部分。最外层的wrap的写法就是固定的,没有为什么,这么写就是了

 

module.exports = function (grunt) {

}

这个函数里面包括三个部分。

第一部分是grunt的任务配置,它的是通过向grunt.initConfig()这个函数传递配置参数来时实现的。所传递的配置参数是一个对象,这个对象的属性为插件的名称,属性值为插件相应的配置信息,一个插件可以配置很多不同的任务,比如下面的这段代码,就是插件grunt-contrib-cancat的配置,它配置两个任务,分别用来合并js和css。

concat: {

            generatedjs: {
                files: [
                    {
                        dest: '.tmp/concat/scripts/app.js',
                        src: [
                            'develop/scripts/lib.js',
                            'develop/scripts/search.js',
                            'develop/scripts/websites.js',
                            'develop/scripts/drag.js',
                            'develop/scripts/page-num.js',
                            'develop/scripts/popup-window.js'
                        ]
                    }
                ]
            },
            generatedcss: {
                files: [
                    {
                        dest: '.tmp/concat/styles/app.css',
                        src: [
                            'develop/styles/base.css',
                            'develop/styles/search.css',
                            'develop/styles/websites.css',
                            'develop/styles/page-num.css',
                            'develop/styles/popup-window.css'
                        ]
                    }
                ]
            }
        }

 

下面就是grunt.initConfig()的一个完整的配置,其中pkg的那一行是用来提取package.json文件的,pkg也就是一个对象了。

 

grunt.initConfig({

        pkg: grunt.file.readJSON('package.json'),

        copy: {
            build: {
                files: [
                    {
                        expand: true,
                        dest: 'release',
                        cwd: 'develop',
                        src: ['index.html', 'scripts/lib/jquery.js', 'data/data.js', 'data/images/*', 'data/images/css/*']
                    }
                ]
            }
        },
        concat: {
            generatedjs: {
                files: [
                    {
                        dest: '.tmp/concat/scripts/app.js',
                        src: [
                            'develop/scripts/lib.js',
                            'develop/scripts/search.js',
                            'develop/scripts/websites.js',
                            'develop/scripts/drag.js',
                            'develop/scripts/page-num.js',
                            'develop/scripts/popup-window.js'
                        ]
                    }
                ]
            },
            generatedcss: {
                files: [
                    {
                        dest: '.tmp/concat/styles/app.css',
                        src: [
                            'develop/styles/base.css',
                            'develop/styles/search.css',
                            'develop/styles/websites.css',
                            'develop/styles/page-num.css',
                            'develop/styles/popup-window.css'
                        ]
                    }
                ]
            }
        },
        uglify: {
            generated: {
                files: [
                    {
                        dest: 'release/scripts/app.js',
                        src: ['.tmp/concat/scripts/app.js']
                    }
                ]
            }
        },
        cssmin: {
            generated: {
                files: [{
                    expand: true,
                    cwd: '.tmp/concat/styles',
                    src: ['app.css'],
                    dest: 'release/styles',
                    ext: '.css'
                }]
            }
        },
        useminPrepare: {
            html: 'release/index.html'
        },
        usemin: {
            html: 'release/index.html',
            js: [
                'release/scripts/{,*/}*.js'
            ],
            css: [
                'release/styles/{,*/}*.css'
            ]
        }
    });

 

配置信息的部分先说到这,至于怎么去配置每一个插件,这要去查每个插件的文档,通常每一个插件的配置都是一个对象值,这个值的第一层对象值是自定义的,比如cssmin里面的generated,它是一个任务的名字,当下面注册任务时,我们可以选择每个插件执行时要用的哪个配置,参见下面的介绍吧。

 第二部分,加载插件,其实就是通过一个函数来实现的。

grunt.loadNpmTasks('grunt-contrib-cssmin');

 

将要加载的插件名传进去。

 第三部分,注册任务。这也是一个函数,grunt.registerTask();

grunt.registerTask('build', [
    'copy:build',
        'useminPrepare',
        'concat:generatedjs',
        'concat:generatedcss',
        'cssmin:generated',
        'uglify:generated',
        'usemin'
]);

第一个参数是使用grunt命令时候,后面跟的参数,如果这个名字是default的话,我们就可以直接运行grunt就可以了。第二个参数是任务,针对上面的这个端代码来说,就是当你在命令行输入grunt build的时候,就会按顺序执行第二个参数中列出的任务,是按顺序的哦!

grunt的简单的用法就是这些,待我再学习学习,整理一下一些常用插件的用法。

 

 

 

posted @ 2015-05-08 16:59  mollybaby  阅读(187)  评论(0编辑  收藏  举报