前端自动化构建工具Grunt

来源:互联网 发布:谷歌平板nexus10 知乎 编辑:程序博客网 时间:2024/05/30 22:53

一、了解Gurnt

Grunt 是一个基于任务的JavaScript工程命令行构建工具。
Grunt和Grunt插件,是通过npm安装并管理的,npm是Node.js的包管理器。
了解Grunt前,首先要准备两件事:
1、了解npm(Node Package Manager):npm是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。
2、安装node:进入nodejs官网(https://nodejs.org/),单击INSTALL下载node安装包,默认安装。安装完成后,进入对应目录,会发现nodejs文件夹下面有npm,直接用npm安装相环境既可。

二、安装Grunt

参考Grunt官网http://www.gruntjs.net/
安装Grunt:npm install -g grunt-cli
注意,安装grunt-cli并不等于安装了Grunt!Grunt CLI的任务很简单:调用与Gruntfile在同一目录中 Grunt。这样带来的好处是,允许你在同一个系统上同时安装多个版本的Grunt。

三、简单实用Grunt

一个新的Grunt项目,必须在根目录下要有两个文件:package.json 和 Gruntfile.js
package.json: 此文件被npm用于存储项目的元数据,以便将此项目发布为npm模块。你可以在此文件中列出项目依赖的grunt和Grunt插件,放置于devDependencies配置段内。
Gruntfile: 此文件被命名为 Gruntfile.js 或 Gruntfile.coffee,用来配置或定义任务(task)并加载Grunt插件的。
1. npm init命令会创建一个基本的package.json文件。或者手动创建,如下:
[javascript] view plain copy
  1. {  
  2.   "name""my-project-name",  
  3.   "description":"test grunt ...",  
  4.   "version""0.1.0"  
  5. }  
2. 安装Grunt和Grunt插件(https://github.com/gruntjs)
向已经存在的package.json 文件中添加Grunt和grunt插件的最简单方式是通过:
npm install <module> --save-dev。此命令不光安装了<module>,还会自动将其添加到devDependencies 配置段中。
3. grunt --help 命令将列出所有可用的任务

四、简单项目流程示例

清空编译工作区 -> copy源文件到编译工作区 -> 合并文件 -> 压缩文件 -> 加时间戳
clean -> copy -> concat -> min -> md5 
1. grunt-contrib-clean:Clear files and folders.
2. grunt-contrib-copy:Copy files and folders.
3. grunt-contrib-concat:Concatenate files.
4. grunt-contrib-cssmin:Compress CSS files.
   grunt-contrib-uglify:Minify files with UglifyJS.
   grunt-contrib-htmlmin:Minify HTML.
5. grunt-filerev:Static asset revisioning through file content hash
第一步:创建package.json
[javascript] view plain copy
  1. {  
  2.     "name":"test_grunt",  
  3.     "description":"test grunt ...",  
  4.     "version":"0.0.1"  
  5. }  
第二步:安装对应插件(加上--save-dev,会在package.json中加上devDependencies依赖)
[javascript] view plain copy
  1. npm install grunt-contrib-clean --save-dev  
  2. npm install grunt-contrib-copy --save-dev  
  3. npm install grunt-contrib-concat --save-dev  
  4. npm install grunt-contrib-cssmin --save-dev  
  5. npm install grunt-contrib-uglify --save-dev  
第三步:创建Gruntfile.js,添加要使用插件配置
[javascript] view plain copy
  1. 'use strict';  
  2. module.exports = function(grunt) {  
  3.     // 构建的初始化配置  
  4.     grunt.initConfig({  
  5.         //配置具体任务  
  6.     });  
  7.   
  8.   
  9.     // 载入要使用的插件  
  10.     grunt.loadNpmTasks('grunt-contrib-clean');  
  11.   
  12.   
  13.     // 注册刚配置好的任务  
  14.     grunt.registerTask('default', ['clean']);  
  15. }  

五、地址

nodejs官网地址:https://nodejs.org/
grunt中文官网地址:http://www.gruntjs.net/
grunt官网插件地址:https://github.com/gruntjs
六、源码
// package.json
[javascript] view plain copy
  1. {  
  2.     "name""test_grunt",  
  3.     "description""test grunt ...",  
  4.     "version""0.0.1",  
  5.     "devDependencies": {  
  6.         "grunt""^0.4.5",  
  7.         "grunt-contrib-clean""^0.6.0",  
  8.         "grunt-contrib-concat""^0.5.1",  
  9.         "grunt-contrib-copy""^0.8.0",  
  10.         "grunt-contrib-cssmin""^0.12.3",  
  11.         "grunt-contrib-uglify""^0.9.1"  
  12.     }  
  13. }  
//Gruntfile.js
[javascript] view plain copy
  1. 'use strict';  
  2. module.exports = function(grunt) {  
  3.     // 构建的初始化配置  
  4.     grunt.initConfig({  
  5.         /* 配置具体任务 */  
  6.         pkg: grunt.file.readJSON('package.json'),  
  7.         dirs: {  
  8.             src: 'path',  
  9.             dest: 'dest/<%= pkg.name %>/<%= pkg.version %>',  
  10.         },  
  11.         // clean任务(删除dest/test_grunt/0.0.1 目录下非min的文件)  
  12.         clean: {  
  13.             js: ["<%= dirs.dest %>/*.js""!<%= dirs.dest %>/*.min.js"],  
  14.             css: ["<%= dirs.dest %>/*.css""!<%= dirs.dest %>/*.min.css"]  
  15.         },  
  16.         // copy任务(拷贝path目录下的文件到dest目录)  
  17.         copy: {  
  18.             main: {  
  19.                 files: [  
  20.                   // includes files within path  
  21.                   {expand: true, src: ['path/*'], dest: '<%= dirs.dest %>/', filter: 'isFile'},  
  22.                 ]  
  23.             }  
  24.         },  
  25.         // concat任务(将dest目录下的a.js和b.js合并为built.js)  
  26.         concat: {  
  27.             options: {  
  28.                 separator: '\n',  
  29.             },  
  30.             concatCSS: {  
  31.                 src: ['<%= dirs.dest %>/a.css''<%= dirs.dest %>/path/b.css'],  
  32.                 dest: '<%= dirs.dest %>/built.css',  
  33.             },  
  34.             concatJS: {  
  35.                 src: ['<%= dirs.dest %>/a.js''<%= dirs.dest %>/b.js'],  
  36.                 dest: '<%= dirs.dest %>/built.js',  
  37.             }  
  38.         },  
  39.         // cssmin任务(压缩css)  
  40.         cssmin: {  
  41.             target: {  
  42.                 files: [{  
  43.                     expand: true,  
  44.                     cwd: '<%= dirs.dest %>',  
  45.                     src: ['*.css''!*.min.css'],  
  46.                     dest: '<%= dirs.dest %>',  
  47.                     ext: '.min.css'  
  48.                 }]  
  49.             }  
  50.         },  
  51.         // uglify任务(压缩js)  
  52.         uglify: {  
  53.             options: {  
  54.                 mangle: {  
  55.                     except: ['jQuery''Backbone']  
  56.                 }  
  57.             },  
  58.             my_target: {  
  59.                 files: {  
  60.                     '<%= dirs.dest %>/bulit.min.js': ['<%= dirs.dest %>/*.js']  
  61.                 }  
  62.             }  
  63.         }  
  64.     });  
  65.   
  66.     // 载入要使用的插件  
  67.     grunt.loadNpmTasks('grunt-contrib-clean');  
  68.     grunt.loadNpmTasks('grunt-contrib-copy');  
  69.     grunt.loadNpmTasks('grunt-contrib-concat');  
  70.     grunt.loadNpmTasks('grunt-contrib-cssmin');  
  71.     grunt.loadNpmTasks('grunt-contrib-uglify');  
  72.   
  73.     // 注册刚配置好的任务  
  74.     grunt.registerTask('cls', ['clean']);  
  75.     grunt.registerTask('cpy', ['copy']);  
  76.     grunt.registerTask('con', ['concat']);  
  77.     grunt.registerTask('cmpCSS', ['cssmin']);  
  78.     grunt.registerTask('cmpJS', ['uglify']);  
  79.   
  80.     grunt.registerTask('default', ['copy','concat','cssmin','uglify','clean']);  
  81. }  

PS:
1.  自己配置的任务名称,不能和插件名称一样,否则会造成无限循环

2.  插件名称,除最外层外,中间层名称可自定义


版权声明:本文为博主原创文章,未经博主允许不得转载。转载请标明出处:http://blog.csdn.net/ligang2585116!
原创粉丝点击