grunt学习笔记

平时项目要么用ant,要么用fis来自动化构建项目.

最近兴起,就学习下grunt的用法,并尝试着用来替换还在用ant处理前端资源的项目。

先是查找学习资源咯,官网少不了,但英文看着累的时候可以用用中文版。ps:中文版一些链接是不是又跳到英文版去了。

然后跟着教程走一遍。恩,我这里描述下。

内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module.exports = function(grunt){
  grunt.loadNpmTasks('grunt-contrib-uglify');//加载插件
  grunt.initConfig({//配置:配置数据对象,包括一些插件的需要用到的一些配置数据
  pkg: grunt.file.readJSON('package.json'),
  uglify:{//这个需要先项目本地安装uglify插件
   options: {
    banner:'/*! this is uglify test- '+'<%= grunt.template.today("yyyy-mm-dd") %> */'
   },
   taskName:{//任务目标
    files: {//文件对象。这里是把main.js wxshare.js压缩合并成test.js
     'build/js/test.js':['js/main.js','js/wxshare.js']
    }
   }
  }
 });
 grunt.registerTask('default',['uglify']); //default 是默认的grunt任务。当执行  grunt时就会运行,后面参数则是实际任务
};

运行前要保证已经装了要用的uglify插件,此时执行

npm install grunt-contrib-uglify –save-dev

这样就可以愉快的 grunt

一些好用的插件

从教程来说,基本很简单,关键是需要一些常用插件来更好的提高生产力。

grunt-contrib-uglify 压缩合并js
grunt-contrib-cssmin 压缩合并css
grunt-contrib-jshint js语法检测
grunt-contrib-clean 删文件
grunt-contrib-wacth 监听文件修改
grunt-usemin : 将html中的未优化合并的静态资源引用替换为优化合并版
time-grunt:任务运行耗时
load-grunt-tasks:加载package.json定义的依赖插件

grunt-contrib- 是官方提供的插件。

有上面那些插件,基本的前端资源处理也就搞定。(我指的是我遇到的一些项目,不包括less和图片压缩等等。)

下面讲述下,学习中,我的一些见解。

关于文件对象配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
files:[{
        expand: true,
        //相对路径
        cwd: 'css/',
        src: '*.css',
        dest: 'build/css/',
        rename: function (dest, src) {  
                  var folder = src.substring(0, src.lastIndexOf('/'));  
                  var filename = src.substring(src.lastIndexOf('/'), src.length);  
                  //  var filename=src;  
                  filename = filename.substring(0, filename.lastIndexOf('.'));  
                  var fileresult=dest + folder + filename + '.min.css';  
                  grunt.log.writeln("现处理文件:"+src+"  处理后文件:"+fileresult);  
                  return fileresult;  
                  //return  filename + '.min.js';  
              }
    }
]

通常:

files:{ destUrl : srcUrl }

或者

files:[{src:srcUrl, dest:destUrl}]

或者//与files同级

src:srcUrl, dest:destUrl

###从API文档摘录一些知识点:

1
2
3
grunt.registerTask(taskName, 'task description', function(){
    doSomeThing();//
})

最后附上,学习成果。要是再加点图片压缩啥的,就更好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
module.exports = function(grunt){
 require('time-grunt')(grunt);
 require('load-grunt-tasks')(grunt,{scope: 'devDependencies'});
 grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),
  vers: grunt.file.readJSON('vers.json'),
  uglify:{//压缩合并js
   options: {
    banner:'/*!vers:<%=vers.v%> '+'update: <%= grunt.template.today("yyyy-mm-dd") %> */'
   },
   alljs:{
    files: [{
                        expand: true,
                        //相对路径
                        cwd: '../src/js/',
                        src: '*.js',
                        dest: 'dist/js/'
                }],
   }
  },
  cssmin:{//压缩合并css
   options: {
   },
   /*task1:{
     dest:'dist/css/test.css',
     src:['css/main.css','css/cssdraw.css']
   },*/
   allCss:{
    files:[{
                        expand: true,
                        //相对路径
                        cwd: '../src/css/',
                        src: ['*.css','!*old.css','!reset.css','!layout.css','!btns.css','!global.css','!form.css'],
                        dest: 'tmp/css/'
                }]
            },
            global:{
             files:[{
              src:['../src/css/reset.css','../src/css/layout.css','../src/css/btns.css','../src/css/global.css','../src/css/form.css'],
              dest: 'tmp/css/global.css'
             }
             ]
            }
  },
  clean:{//删除文件
   options: {
   },
   dist:{
     src:'dist/*'
   },
   tmp:{
    src:'tmp/'
   }
  },
  watch: {//监控文件改动  暂时不用
         watchcss: {
             files: ['../src/css/*.css'],
             tasks: ['cssmin'],
             options: {
                 // Start another live reload server on port 1337
                 livereload: 1337
             }
         }
     },
'string-replace':{//配置替换内容
		   dist: {
		           files:[{
		                        expand: true,
		                        //相对路径
		                        cwd: 'tmp/css',
		                        src: '*.css',
		                        dest: 'dist/css/'
		                    }],
		           options: {
		             replacements: [{
		               pattern: /@IMAGE_VERSION@/g,
		               replacement:'<%=vers.v%>'
		               }]
		           }
		   }
     },
     my:{//自定义一些配置参数自己用
      foo:123,
      bar:'hi'
     }
 });
 grunt.registerTask('increaseVersion','increase the versions',function(){//自定义版本用来自增版本号
  var versionObj = grunt.file.readJSON('vers.json');
  grunt.log.write('当前版本号:'+versionObj.v);
  grunt.file.write('vers.json','{"v":'+(++versionObj.v)+'}')
 });
 grunt.registerTask('default',['clean:dist','uglify','cssmin','string-replace','clean:tmp','increaseVersion']);
};