码迷,mamicode.com
首页 > 其他好文 > 详细

Grunt in action

时间:2015-03-05 17:21:16      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:grunt

 Grunt 是一个自动任务运行器,会安装预先定义的顺序自动运行一系列的的任务,可以简化工作流程,减少重复性的工作从而提高工作交流,

这篇简易教程会从0着手详细介绍grunt。

1、安装

 grunt是基于nodejs的,如果你还没有安装,请从http://nodejs.org/下载安装windows版或者Linux版,安装nodejs后,运行如下命令:

sudo npm install -g grunt-cli

grunt-cli是grunt命令行工具,-g 表示全局安装。安装命令行工具后需要安装模块才能使用相应的模块,模块安装推荐局部安装,因为不同的项目对模块版本的要求可能是不一样的。


2、环境搭建

一般需要在你的项目中添加两个文件:packeage.json 和Gruntfile(Gruntfile.js for js,Gruntfile.coffee for coffeescript)

package.json : 此文件被npm用于存储项目的元数据,以便次项目可以发布为npm模块,并且可以在这个文件中指定项目依赖的grunt或者grunt plugin,这些依赖信息放在 devDependencies字段里

GruntFile :用来配置或定义任务(task)并加载grunt plugin的。


生成package.json

首先在项目的根目录下建一个文件名为package.json文件,或者通过npm init 生成一个。为了介绍方便,我们从grunt官网上找一个现成的文件,内容如下:

{
  "name": "my-project-name",
  "version": "0.1.0",
  "author": "Your Name",
  "devDependencies": {
    "grunt": "0.x.x",
    "grunt-contrib-jshint": "*",
    "grunt-contrib-concat": "~0.1.1",
    "grunt-contrib-uglify": "~0.1.0",
    "grunt-contrib-watch": "~0.1.4"
  }
}

稍微解释下里面的devDependencies,grunt核心模块为最新的0.x.x版,jshint插件为最新版本,concat插件不低于0.1.1版,uglify插件不低于0.1.0版,watch插件不低于0.1.4版

然后就可以通过命令行安装模块了,将相应的模块装到该目录下的node_modules文件夹内,命令如下:

npm install

当然如果已经有package.json不包括相应的模块,就可以一个一个安装,命令如下:

npm install <module> --save-dev

可以通过下面的命令安装同样的模块:

npm install grunt --save-dev
npm install grunt-contrib-jshint --save-dev
npm install grunt-contrib-concat --save-dev
npm install grunt-contrib-uglify --save-dev
npm install grunt-contrib-watch --save-dev

需要补充的是--save-dev 不但可以安装对应的模块,还没有保存到devDependencies字段内。


建立Gruntfile文件

在package.json文件的统计目录,建立一个GruntFile.js文件,它是grunt的配置文件。包括如下几个方法:

  1. wrapper函数

  2. 项目与任务配置

  3. 加载grunt插件和任务

4. 自定义任务

要遵循nodejs的模块写法,grunt作为参数:

module.exports = function(grunt) {
  // 配置Grunt各种模块的参数
  grunt.initConfig({
    jshint: { /* jshint的参数 */ },
    concat: { /* concat的参数 */ },
    uglify: { /* uglify的参数 */ },
    watch:  { /* watch的参数 */ }
  });
  // 从node_modules目录加载模块文件
  grunt.loadNpmTasks(‘grunt-contrib-jshint‘);
  grunt.loadNpmTasks(‘grunt-contrib-concat‘);
  grunt.loadNpmTasks(‘grunt-contrib-uglify‘);
  grunt.loadNpmTasks(‘grunt-contrib-watch‘);
  // 每行registerTask定义一个任务
  grunt.registerTask(‘default‘, [‘jshint‘, ‘concat‘, ‘uglify‘]);
  grunt.registerTask(‘check‘, [‘jshint‘]);
};

grunt.initConfig:定义各种模块的参数,每一个成员项对应一个同名模块。

grunt.loadNpmTasks:加载模块。

grunt.registerTask:定义具体的任务,第一个参数为任务名(即grunt 后面的参数,如 grunt check),第二个参数是一个数组,表示该任务需要依次使用的模块。default任务名表示,如果直接输入grunt命令,后面不跟任何参数所调用的模块;该例的check任务则表示使用jshint插件对代码进行语法检查。


3、Grunt例子,更多的例子可以访问http://gruntjs.com/plugins,找你需要的插件。

(1) grunt-contrib-cssmin,cssmin模块的作用是最小化CSS文件

首先,在项目的根目录下安装该模块。

npm install grunt-contrib-cssmin --save-dev

完整的代码如下:

module.exports = function(grunt) {
  grunt.initConfig({
    cssmin: {
      minify: {
        expand: true,
        cwd: ‘css/‘,
        src=\‘#\‘" /‘,
        ext: ‘.min.css‘
      },
      combine: {
        files: {
          ‘css/out.min.css‘: [‘css/part1.min.css‘, ‘css/part2.min.css‘]
        }
      }
    }
  });
  grunt.loadNpmTasks(‘grunt-contrib-cssmin‘);
  grunt.registerTask(‘default‘, [‘cssmin:minify‘,‘cssmin:combine‘]);
};

expand:如果设为true,就表示下面文件名的占位符(即*号)都要扩展成具体的文件名。

cwd:需要处理的文件(input)所在的目录。

src:表示需要处理的文件。如果采用数组形式,数组的每一项就是一个文件名,可以使用通配符。

dest:表示处理后的文件名或所在目录。

ext:表示处理后的文件后缀名。

(2)grunt-contrib-jshint,js文件静态检查

它在grunt.initConfig方法里面的配置代码如下:

jshint: {
    options: {
        eqeqeq: true,
        trailing: true
    },
    files: [‘Gruntfile.js‘, ‘lib/**/*.js‘]
}

完整的jshint配置可以参考这里:http://jshint.com/docs/options/eqeqeq表示要用===取代==,trailing表示行尾不得有多余的空格,files表示要检查的文件。

(3)grunt-contrib-concat,用来合并文件,不止合并js文件,还可以合并css文件。

concat: {
  js: {
    src=\‘#\‘" /module1.js‘, ‘lib/module2.js‘, ‘lib/plugin.js‘],
    dest: ‘dist/script.js‘
  }
  css: {
    src=\‘#\‘" /normalize.css‘, ‘style/base.css‘, ‘style/theme.css‘],
    dest: ‘dist/screen.css‘
  }
},

(4)grunt-contrib-uglify,用来压缩代码

uglify: {
  options: {
    banner: bannerContent,
    sourceMapRoot: ‘../‘,
    sourceMap: ‘distrib/‘+name+‘.min.js.map‘,
    sourceMapUrl: name+‘.min.js.map‘
  },
  target : {
    expand: true,
    cwd: ‘js/origin‘,
    src : ‘*.js‘,
    dest : ‘js/‘
  }
},

详细的解释配置:https://www.npmjs.com/package/grunt-contrib-uglify

(5)grunt-contrib-watch,监控文件,然后自动执行任务

watch: {
   scripts: {
    files: ‘**/*.js‘,
    tasks: ‘jshint‘,
    options: {
      livereload: true,
    },
   },
   css: {
    files: ‘**/*.sass‘,
    tasks: [‘sass‘],
    options: {
      livereload: true,
    },
   },
}

设置好上面的代码,打开另一个进程,运行grunt watch。此后,任何的js代码变动,文件保存后就会自动运行jshint任务;任何sass文件变动,文件保存后就会自动运行sass任务。


4、其他的模块

(1)grunt-contrib-clean,删除文件或目录

clean: {
  build: {
    src=\‘#\‘" /to/dir/one", "path/to/dir/two"]
  }
}

(2) grunt-contrib-connect,在本机运行一个Web Server

(3)grunt-htmlhint html语法检查


5 自动加载grunt plugin

有时候删除一个插件而忘了更新Gruntfile文件,这时候运行就会报错,构建将会停止。你想象一下,如果有很多插件手动维护还是挺麻烦的,我们可以通过一个比较小巧的插件(load-grunt-tasks)实现,有了它,多行的

grunt.loadNpmTasks(‘grunt-contrib-concat‘);
grunt.loadNpmTasks(‘grunt-contrib-uglify‘);
grunt.loadNpmTasks(‘grunt-contrib-imagemin‘);

就可以变成一行:

require(‘load-grunt-tasks‘)(grunt);

6 使用load-grunt-config插件将Gruntfile拆分

详细的参考http://www.html5rocks.com/en/tutorials/tooling/supercharging-your-gruntfile/


参考链接:

http://www.html5rocks.com/en/tutorials/tooling/supercharging-your-gruntfile/

http://www.sitepoint.com/writing-awesome-build-script-grunt/

http://javascript.ruanyifeng.com/tool/grunt.html

https://www.npmjs.com/package/grunt-contrib-jshint

http://www.gruntjs.net/docs/getting-started/


本文出自 “Eason's hcc” 博客,请务必保留此出处http://hcc0926.blog.51cto.com/172833/1617645

Grunt in action

标签:grunt

原文地址:http://hcc0926.blog.51cto.com/172833/1617645

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!