zoukankan      html  css  js  c++  java
  • grunt的学习和使用

    目前正在编写公司的部分组件,可能一个组件会包含很多js和css,为了项目上使用方便,应该压缩成一个js库,以供开发者使用,同时也可以减少很多http请求,提高页面访问速度。基于此,学习了grunt自动化构建工具。学习文章:http://developer.51cto.com/art/201506/479127.htm。不过我根据自己的实际情况,有些东西做了一些改动,同时记录下来,后面也会用到。下面单刀直入,直接讲怎么用:

    1、安装nodejs。安装过程略。下载路径:https://nodejs.org/en/  。检查安装是否成功:打开cmd,输入node -v,如果出现以下界面,表示安装成功。

    2、安装grunt-cli。打开cmd、输入npm install -g grunt-cli。出现以下信息,表示安装成功。

    3、打开项目目录 ,在项目的根目录下新建配置文件:Gruntfile.js和package.json两个文件。其中package.json文件中先写入以下内容:

     

    {
      "name": "vetech.select",
      "version": "1.0",
      "devDependencies": {
       }
    }

    4、安装grunt:cmd切换到项目的根目录下,并输入:npm install grunt -save-dev。工程目录下有以下目录表示安装成功。

     5、配置Gruntfile.js文件:

     //包装函数
     module.exports = function(grunt){
         //任务配置,所有插件的配置信息
         grunt.initConfig({
            //获取package.json的信息
            pkg:grunt.file.readJSON("package.json")
         });
         //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
        grunt.registerTask("default",[]);
     };

    6、cmd中执行grunt命令,看是否配置成功。

    7、安装插件:由于在项目中,并不是每个js都是独立的文件,有时候每个js可能会存在依赖关系。所以在安装插件的时候,先安装合并插件、再安装校验插件、压缩插件,最后安装自动化构建插件。所有的插件安装必须要切换到项目的根目录下执行才行,另外,每次安装一个插件最好是执行一下grunt命令,看是否安装和配置成功。

    • 合并插件:https://www.npmjs.com/package/grunt-contrib-concat
      • 安装命令:npm install grunt-contrib-concat --save-dev
      • Gruntfile.js配置:
         1  //包装函数
         2  module.exports = function(grunt){
         3      //任务配置,所有插件的配置信息
         4      grunt.initConfig({
         5         //获取package.json的信息
         6         pkg:grunt.file.readJSON("package.json"),
         7         //合并插件:
         8         concat:{
         9              js:{
        10                  src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
        11                  dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
        12              },
        13              css:{
        14                  src:["css/style.css","css/radio.css"],
        15                  dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
        16              }
        17          }
        18         
        19      });
        20      grunt.loadNpmTasks("grunt-contrib-concat");
        21      
        22      //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
        23     grunt.registerTask("default",["concat"]);
        24  };
      • 说明: 在配置dest路径的时候,在build目录下新建了一个debug文件夹,所有的js和css合并以后都放在这里,这样做的好处有有两个:1、在校验和压缩的时候,只需要校验和压缩这两个文件即可;2、对于项目上对组件使用可能出问题,可以直接用合并的js作为调试文件来找出问题原因。

    • js校验插件:https://www.npmjs.com/package/grunt-contrib-jshint
      • 安装命令:npm install grunt-contrib-jshint --save-dev
      • Gruntfile.js配置:
         1  //包装函数
         2  module.exports = function(grunt){
         3      //任务配置,所有插件的配置信息
         4      grunt.initConfig({
         5         //获取package.json的信息
         6         pkg:grunt.file.readJSON("package.json"),
         7         //合并插件:
         8         concat:{
         9              js:{
        10                  src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
        11                  dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
        12              },
        13              css:{
        14                  src:["css/style.css","css/radio.css"],
        15                  dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
        16              }
        17          },
        18          //js语法校验插件
        19          jshint:{
        20              build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
        21              options:{
        22                  jshintrc:".jshintrc"
        23              }
        24          }
        25      });
        26      grunt.loadNpmTasks("grunt-contrib-concat");
        27      grunt.loadNpmTasks("grunt-contrib-jshint"); 
        28      //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
        29     grunt.registerTask("default",["concat","jshint"]);
        30  };

           备注:在js校验的时候,像JQuery、$、angular等等,校验不会通过,此时需要预先定义,参考文章:http://stackoverflow.com/questions/20837139/jshint-r10-angular-is-not-defined。另外,在校验的时候,还需要在Gruntfile.js文件的同级目录下新建一个.jshintrc文件,文件中编写要校验的规则。格式如下,规则参考:http://my.oschina.net/wjj328938669/blog/637433?p=1

       {
          "boss":false,
          "curly":false,
          "eqeqeq":false,
          "eqnull":true,
          "expr":true,
          "immed":true,
          "newcap":true,
          "noempty":true,
          "noarg":true,
          "undef":true,
          "regexp":true,
          
          "browser":true,
          "devel":true,
          "node":true,
          "predef": ["ActiveXObject"]
       }
    • css校验插件:https://www.npmjs.com/package/grunt-contrib-csslint
      • 安装命令:npm install grunt-contrib-csslint --save-dev
      • Gruntfile.js配置:
         1  //包装函数
         2  module.exports = function(grunt){
         3      //任务配置,所有插件的配置信息
         4      grunt.initConfig({
         5         //获取package.json的信息
         6         pkg:grunt.file.readJSON("package.json"),
         7         //合并插件:
         8         concat:{
         9              js:{
        10                  src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
        11                  dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
        12              },
        13              css:{
        14                  src:["css/style.css","css/radio.css"],
        15                  dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
        16              }
        17          },
        18          //js语法校验插件
        19          jshint:{
        20              build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
        21              options:{
        22                  jshintrc:".jshintrc"
        23              }
        24          },
        25          //css语法校验
        26          csslint:{
        27              build:["build/debug/<%=pkg.name%>.debug.css"],
        28              options:{
        29                  csslintrc:".csslintrc"
        30              }
        31          }
        32      });
        33      grunt.loadNpmTasks("grunt-contrib-concat");
        34      grunt.loadNpmTasks("grunt-contrib-jshint");
        35      grunt.loadNpmTasks("grunt-contrib-csslint");
        36      
        37      //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
        38     grunt.registerTask("default",["concat","jshint","csslint"]);
        39  };
      • 备注: css校验插件也需要一个.csslintrc文件,同样是在Gruntfile.js的同级目录下。格式如下,配置参考:https://atom.io/packages/csslint
         {
            "adjoining-classes":false,
            "box-sizing":false,
            "box-model":false,
            "compatible-vendor-prefixes":false,
            "floats":false,
            "font-sizes":false,
            "gradinents":false,
            "important":false,
            "known-properties":false,
            "outline-none":false,
            "qualified-headings":false,
            "regex-selectors":false,
            "shorthand":false,
            "text-indent":false,
            "unique-headings":false,
            "universal-selector":false,
            "unqualified-attributes":false
         }
    •  JS压缩插件:https://www.npmjs.com/package/grunt-contrib-uglify
      • 安装命令:npm install grunt-contrib-uglify --save-dev
      • Gruntfile.js配置:
         1  //包装函数
         2  module.exports = function(grunt){
         3      //任务配置,所有插件的配置信息
         4      grunt.initConfig({
         5         //获取package.json的信息
         6         pkg:grunt.file.readJSON("package.json"),
         7         //合并插件:
         8         concat:{
         9              js:{
        10                  src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
        11                  dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
        12              },
        13              css:{
        14                  src:["css/style.css","css/radio.css"],
        15                  dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
        16              }
        17          },
        18          //js语法校验插件
        19          jshint:{
        20              build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
        21              options:{
        22                  jshintrc:".jshintrc"
        23              }
        24          },
        25          //css语法校验
        26          csslint:{
        27              build:["build/debug/<%=pkg.name%>.debug.css"],
        28              options:{
        29                  csslintrc:".csslintrc"
        30              }
        31          },
        32          //js压缩
        33          uglify:{
        34              options:{
        35                  stripBanners:true,
        36                  banner:'/*! <%=pkg.name%>-<%=pkg.version%>.js <%=grunt.template.today("yyyy-mm-dd")%> */
        '
        37              },
        38              build:{
        39                  mangle:true, //变量名混淆
        40                  src:"build/debug/*.js",
        41                  dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.js"
        42              }
        43          }
        44      });
        45      grunt.loadNpmTasks("grunt-contrib-concat");
        46      grunt.loadNpmTasks("grunt-contrib-jshint");
        47      grunt.loadNpmTasks("grunt-contrib-csslint");
        48      grunt.loadNpmTasks("grunt-contrib-uglify");
        49      
        50      //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
        51     grunt.registerTask("default",["concat","jshint","csslint","uglify"]);
        52  };
    • css压缩插件:https://www.npmjs.com/package/grunt-contrib-cssmin
      • 安装命令:npm install grunt-contrib-cssmin --save-dev
      • Gruntfile.js配置:
         1  //包装函数
         2  module.exports = function(grunt){
         3      //任务配置,所有插件的配置信息
         4      grunt.initConfig({
         5         //获取package.json的信息
         6         pkg:grunt.file.readJSON("package.json"),
         7         //合并插件:
         8         concat:{
         9              js:{
        10                  src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
        11                  dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
        12              },
        13              css:{
        14                  src:["css/style.css","css/radio.css"],
        15                  dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
        16              }
        17          },
        18          //js语法校验插件
        19          jshint:{
        20              build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
        21              options:{
        22                  jshintrc:".jshintrc"
        23              }
        24          },
        25          //css语法校验
        26          csslint:{
        27              build:["build/debug/<%=pkg.name%>.debug.css"],
        28              options:{
        29                  csslintrc:".csslintrc"
        30              }
        31          },
        32          //js压缩
        33          uglify:{
        34              options:{
        35                  stripBanners:true,
        36                  banner:'/*! <%=pkg.name%>-<%=pkg.version%>.js <%=grunt.template.today("yyyy-mm-dd")%> */
        '
        37              },
        38              build:{
        39                  mangle:true, //变量名混淆
        40                  src:"build/debug/*.js",
        41                  dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.js"
        42              }
        43          },
        44          //css压缩
        45          cssmin:{
        46              options:{
        47                  stripBanners:true,
        48                  banner:'/*! <%=pkg.name%>-<%=pkg.version%>.css <%=grunt.template.today("yyyy-mm-dd")%> */
        '
        49              },
        50              build:{
        51                  src:"build/debug/*.css",
        52                  dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.css"
        53              }
        54          }
        55         
        56      });
        57      grunt.loadNpmTasks("grunt-contrib-concat");
        58      grunt.loadNpmTasks("grunt-contrib-jshint");
        59      grunt.loadNpmTasks("grunt-contrib-csslint");
        60      grunt.loadNpmTasks("grunt-contrib-uglify");
        61      grunt.loadNpmTasks("grunt-contrib-cssmin");
        62      
        63      //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
        64     grunt.registerTask("default",["concat","jshint","csslint","uglify","cssmin"]);
        65  };
    • 自动化构建:https://www.npmjs.com/package/grunt-contrib-watch
      • 安装命令:npm install grunt-contrib-watch --save-dev
      • Gruntfile.js配置:
         1  //包装函数
         2  module.exports = function(grunt){
         3      //任务配置,所有插件的配置信息
         4      grunt.initConfig({
         5         //获取package.json的信息
         6         pkg:grunt.file.readJSON("package.json"),
         7         //合并插件:
         8         concat:{
         9              js:{
        10                  src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
        11                  dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
        12              },
        13              css:{
        14                  src:["css/style.css","css/radio.css"],
        15                  dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
        16              }
        17          },
        18          //js语法校验插件
        19          jshint:{
        20              build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
        21              options:{
        22                  jshintrc:".jshintrc"
        23              }
        24          },
        25          //css语法校验
        26          csslint:{
        27              build:["build/debug/<%=pkg.name%>.debug.css"],
        28              options:{
        29                  csslintrc:".csslintrc"
        30              }
        31          },
        32          //js压缩
        33          uglify:{
        34              options:{
        35                  stripBanners:true,
        36                  banner:'/*! <%=pkg.name%>-<%=pkg.version%>.js <%=grunt.template.today("yyyy-mm-dd")%> */
        '
        37              },
        38              build:{
        39                  mangle:true, //变量名混淆
        40                  src:"build/debug/*.js",
        41                  dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.js"
        42              }
        43          },
        44          //css压缩
        45          cssmin:{
        46              options:{
        47                  stripBanners:true,
        48                  banner:'/*! <%=pkg.name%>-<%=pkg.version%>.css <%=grunt.template.today("yyyy-mm-dd")%> */
        '
        49              },
        50              build:{
        51                  src:"build/debug/*.css",
        52                  dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.css"
        53              }
        54          },
        55          //自动化构建
        56          watch:{
        57              build:{
        58                  files:["Gruntfile.js","js/*.js","css/*.css"],
        59                  tasks:["concat","jshint","csslint","uglify","cssmin"],
        60                  options:{spawn:false}
        61              }
        62          }
        63         
        64      });
        65      grunt.loadNpmTasks("grunt-contrib-concat");
        66      grunt.loadNpmTasks("grunt-contrib-jshint");
        67      grunt.loadNpmTasks("grunt-contrib-csslint");
        68      grunt.loadNpmTasks("grunt-contrib-uglify");
        69      grunt.loadNpmTasks("grunt-contrib-cssmin");
        70      grunt.loadNpmTasks("grunt-contrib-watch");
        71      
        72      //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
        73     grunt.registerTask("default",["concat","jshint","csslint","uglify","cssmin","watch"]);
        74  };

    执行完以上的所有操作,基本上可以满足js和css的校验、合并和压缩。最后执行grunt,会发现根据Gruntfile.js配置的,生成相应的文件,前提是js和css不会存在错误。下图是执行grunt以后生成的文件:

     

     最后,直接把app中的文件拷贝到项目中去使用即可。对于watch插件,指定监听哪些文件,一旦文件发生变化,会重新构建。如果有新的项目需要自动化构建,那么只需要将Gruntfile.js、package.json、两个以.开头的配置文件拷贝过去,在根目录下执行:npm install,一次性安装好所有的插件。然后修改Gruntfile.js以满足当前项目需要。

  • 相关阅读:
    SVN 部署(基于 Linux)
    禅道部署(基于 Linux)
    MySQL 中文乱码问题
    设置 Linux 支持中文
    SQL 文件导入数据库
    虚拟 IP 设为静态 IP
    python selenium(定位方法)
    python selenium(环境搭建)
    「杂谈」苏州人不能太膨胀
    「SAP技术」如何看Z移动类型是复制哪个标准移动类型而创建的?
  • 原文地址:https://www.cnblogs.com/tengri/p/5641212.html
Copyright © 2011-2022 走看看