天行健, 君子以自强不息
Sunny's Blog
Title

grunt常用配置(绝对硬货)

没用过grunt做项目管理的前端已经out了,用它可以做很多事情,具体你去关注他的文档快速上手,他同时提供了很多插件,我有一个好地方找得到几乎全部,是几乎啊,还有些特殊的你要到github上自己去搜grunt插件大全

前端的项目管理常用的有哪些?1.文件合并,比如多个js文件合并,为啥?减少HTTP请求,具体去看我的Web性能优化的blog。2.文件压缩,包括去注释、空格等等。为了减少HTTP请求大小,在这个基础上用个gzip,效果刚刚的。3.文件中内容的替换,比如js,css目录的替换。其他还有复制,清除等等功能。这些只是grunt做的很基本的一点事,但是一般的项目应该就够用了,下面我就把我配置的文件展示出来大家做参考。

上面是我的目录图,解释一下,假设一般开发阶段,你写的js统一放在了dev-js目录下,css放在了dev-css下,你的页面是demo.html。上线前,你需要把你写的所有js做个合并,压缩,并且导入到对应的pro-js下面,css也一样的,然后你的页面demo中相应的文件路径也要改变。这是最最基本的一些操作,你希望一次配好,交给grunt去automation吧。配置的package.js 和 Gruntfile.js如下。另外,你知道运行grunt前要装好nodejs及npm吧,呵呵。

                // package.js
                {
                  "name": "testgrunt",
                  "version": "1.0.0",
                  "description": "sth",
                  "repository": "sth",
                  "author": "sunny_sun",
                  "license": "sth",
                  "devDependencies": {
                    "grunt": "~0.4.2",
                    "grunt-contrib-concat":  "~0.5.0",
                    "grunt-contrib-uglify":  "~0.5.1",
                    "grunt-regex-replace":   "~0.2.5",
                    "grunt-contrib-clean":   "~0.4.1",
                    "grunt-contrib-copy":    "~0.4.1"
                  }
                }
            

                // Gruntfile.js
                module.exports = function(grunt) {
                  grunt.initConfig({
                    pkg: grunt.file.readJSON('package.json'),
                    //清空pro-js中的文件
                    clean: ["pro-js/*.js"],
                    //工作流1:合并js文件(如果需要的话,不需要就别写)
                    //工作流2:去掉合并之后文件中的注释,当然在uglify会自动做这个事
                    concat: {
                      options: {
                        //banner:在合并后的文件头部加一些额外信息
                        //footer:在合并后的文件尾部加一些额外信息
                        // 定义一个用于插入合并输出文件之间的字符
                        separator: ';',
                        // 除掉注释,这个方法不能将全部的/**/去掉,也不能将//去掉,不是很靠谱
                        stripBanners: {
                            block: true,
                            line: true
                        }  
                      },
                      dist: {
                        // 将要被合并的文件
                        src: ['dev-js/*.js'],
                        // 合并后的JS文件的存放位置
                        dest: 'pro-js/<%= pkg.name %>.js'
                      }
                    },
                    //工作流3:压缩刚才合并的文件,压缩就会将注释全去掉的
                    uglify: {
                      options: {
                        //在压缩后的文件头部加一些额外信息
                        banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
                      },
                      dist: {
                        files: {
                          'pro-js/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
                        }
                      }
                    },
                    // 将css文件复制到pro-css路径下
                    copy: {
                      main: {
                        expand:true,
                        cwd: './dev-css/',
                        src: '*.css',
                        dest: 'pro-css/'          
                      }
                    },
                    //工作流4:替换html文件中的js路径
                    "regex-replace": {
                        findhtml: { //specify a target with any name
                            src: ['./*.html'],
                            actions: [
                                {
                                    name: 'first',
                                    search: 'dev-js/test.js',
                                    replace: 'pro-js/<%= pkg.name %>.min.js',
                                    flags: 'g'
                                },{
                                    name: 'second',
                                    search: 'dev-css',
                                    replace: 'pro-css',
                                    flags: 'g'
                                }
                            ]
                        }
                    },
                    // Deletes all .js files, but skips min.js files
                    clean: {
                      js: ["pro-js/*.js", "!pro-js/*.min.js"]
                    }

                  });
                  //加载所需要的Grunt插件
                  grunt.loadNpmTasks('grunt-contrib-clean');
                  grunt.loadNpmTasks('grunt-contrib-concat');
                  grunt.loadNpmTasks('grunt-contrib-uglify');
                  grunt.loadNpmTasks('grunt-regex-replace');
                  grunt.loadNpmTasks('grunt-contrib-copy');
                  //设置default任务
                  grunt.registerTask('default', ['clean','concat','uglify','regex-replace','copy','clean']);

                };
            

2015/05/04,这里补充一下grunt-sass的配置

              module.exports = function(grunt) {

                  // Project configuration.
                  grunt.initConfig({

                      //Read the package.json (optional)
                      pkg: grunt.file.readJSON('package.json'),

                      // Metadata.
                      meta: {
                          basePath: './',
                          srcPath: 'sass/',
                          deployPath: 'css/'
                      },
                      // Task configuration.
                      sass: {
                          dist: {
                              options: {
                                  style: 'expanded'
                              },
                              files: [{
                                  expand: true,
                                  cwd: '<%= meta.srcPath %>',
                                  src: ['*.scss'],
                                  dest: '<%= meta.deployPath %>',
                                  ext: '.css'
                              }]
                          }
                      },
                      watch: {
                          css: {
                              files: ['<%= meta.srcPath %>*.scss'],
                              tasks: ['sass']
                          }
                      }
                  });

                  // These plugins provide necessary tasks.
                  grunt.loadNpmTasks('grunt-contrib-sass');
                  grunt.loadNpmTasks('grunt-contrib-watch');

                  // Default task.
                  grunt.registerTask('default', ['sass']);
              };
              

地势坤,君子以厚德载物