目前正在编写公司的部分组件,可能一个组件会包含很多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配置:
        //包装函数
      module.exports = function(grunt){
      //任务配置,所有插件的配置信息
      grunt.initConfig({
      //获取package.json的信息
      pkg:grunt.file.readJSON("package.json"),
      //合并插件:
      concat:{
      js:{
      src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
      dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
      },
      css:{
      src:["css/style.css","css/radio.css"],
      dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
      }
      } });
      grunt.loadNpmTasks("grunt-contrib-concat"); //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
      grunt.registerTask("default",["concat"]);
      };
    • 说明: 在配置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配置:
        //包装函数
      module.exports = function(grunt){
      //任务配置,所有插件的配置信息
      grunt.initConfig({
      //获取package.json的信息
      pkg:grunt.file.readJSON("package.json"),
      //合并插件:
      concat:{
      js:{
      src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
      dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
      },
      css:{
      src:["css/style.css","css/radio.css"],
      dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
      }
      },
      //js语法校验插件
      jshint:{
      build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
      options:{
      jshintrc:".jshintrc"
      }
      }
      });
      grunt.loadNpmTasks("grunt-contrib-concat");
      grunt.loadNpmTasks("grunt-contrib-jshint");
      //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
      grunt.registerTask("default",["concat","jshint"]);
      };

    备注:在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配置:
        //包装函数
      module.exports = function(grunt){
      //任务配置,所有插件的配置信息
      grunt.initConfig({
      //获取package.json的信息
      pkg:grunt.file.readJSON("package.json"),
      //合并插件:
      concat:{
      js:{
      src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
      dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
      },
      css:{
      src:["css/style.css","css/radio.css"],
      dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
      }
      },
      //js语法校验插件
      jshint:{
      build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
      options:{
      jshintrc:".jshintrc"
      }
      },
      //css语法校验
      csslint:{
      build:["build/debug/<%=pkg.name%>.debug.css"],
      options:{
      csslintrc:".csslintrc"
      }
      }
      });
      grunt.loadNpmTasks("grunt-contrib-concat");
      grunt.loadNpmTasks("grunt-contrib-jshint");
      grunt.loadNpmTasks("grunt-contrib-csslint"); //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
      grunt.registerTask("default",["concat","jshint","csslint"]);
      };
    • 备注: 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配置:
        //包装函数
      module.exports = function(grunt){
      //任务配置,所有插件的配置信息
      grunt.initConfig({
      //获取package.json的信息
      pkg:grunt.file.readJSON("package.json"),
      //合并插件:
      concat:{
      js:{
      src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
      dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
      },
      css:{
      src:["css/style.css","css/radio.css"],
      dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
      }
      },
      //js语法校验插件
      jshint:{
      build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
      options:{
      jshintrc:".jshintrc"
      }
      },
      //css语法校验
      csslint:{
      build:["build/debug/<%=pkg.name%>.debug.css"],
      options:{
      csslintrc:".csslintrc"
      }
      },
      //js压缩
      uglify:{
      options:{
      stripBanners:true,
      banner:'/*! <%=pkg.name%>-<%=pkg.version%>.js <%=grunt.template.today("yyyy-mm-dd")%> */\n'
      },
      build:{
      mangle:true, //变量名混淆
      src:"build/debug/*.js",
      dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.js"
      }
      }
      });
      grunt.loadNpmTasks("grunt-contrib-concat");
      grunt.loadNpmTasks("grunt-contrib-jshint");
      grunt.loadNpmTasks("grunt-contrib-csslint");
      grunt.loadNpmTasks("grunt-contrib-uglify"); //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
      grunt.registerTask("default",["concat","jshint","csslint","uglify"]);
      };
  • css压缩插件:https://www.npmjs.com/package/grunt-contrib-cssmin
    • 安装命令:npm install grunt-contrib-cssmin --save-dev
    • Gruntfile.js配置:
        //包装函数
      module.exports = function(grunt){
      //任务配置,所有插件的配置信息
      grunt.initConfig({
      //获取package.json的信息
      pkg:grunt.file.readJSON("package.json"),
      //合并插件:
      concat:{
      js:{
      src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
      dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
      },
      css:{
      src:["css/style.css","css/radio.css"],
      dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
      }
      },
      //js语法校验插件
      jshint:{
      build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
      options:{
      jshintrc:".jshintrc"
      }
      },
      //css语法校验
      csslint:{
      build:["build/debug/<%=pkg.name%>.debug.css"],
      options:{
      csslintrc:".csslintrc"
      }
      },
      //js压缩
      uglify:{
      options:{
      stripBanners:true,
      banner:'/*! <%=pkg.name%>-<%=pkg.version%>.js <%=grunt.template.today("yyyy-mm-dd")%> */\n'
      },
      build:{
      mangle:true, //变量名混淆
      src:"build/debug/*.js",
      dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.js"
      }
      },
      //css压缩
      cssmin:{
      options:{
      stripBanners:true,
      banner:'/*! <%=pkg.name%>-<%=pkg.version%>.css <%=grunt.template.today("yyyy-mm-dd")%> */\n'
      },
      build:{
      src:"build/debug/*.css",
      dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.css"
      }
      } });
      grunt.loadNpmTasks("grunt-contrib-concat");
      grunt.loadNpmTasks("grunt-contrib-jshint");
      grunt.loadNpmTasks("grunt-contrib-csslint");
      grunt.loadNpmTasks("grunt-contrib-uglify");
      grunt.loadNpmTasks("grunt-contrib-cssmin"); //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
      grunt.registerTask("default",["concat","jshint","csslint","uglify","cssmin"]);
      };
  • 自动化构建:https://www.npmjs.com/package/grunt-contrib-watch
    • 安装命令:npm install grunt-contrib-watch --save-dev
    • Gruntfile.js配置:
        //包装函数
      module.exports = function(grunt){
      //任务配置,所有插件的配置信息
      grunt.initConfig({
      //获取package.json的信息
      pkg:grunt.file.readJSON("package.json"),
      //合并插件:
      concat:{
      js:{
      src:["js/mxUtil.js","js/MultSelect.js","js/RadioSelect.js"],
      dest:"build/debug/<%= pkg.name%>-<%=pkg.version%>.debug.js"
      },
      css:{
      src:["css/style.css","css/radio.css"],
      dest:"build/debug/<%=pkg.name%>-<%=pkg.version%>.debug.css"
      }
      },
      //js语法校验插件
      jshint:{
      build:["Gruntfile.js","build/debug/<%=pkg.name%>.debug.js"],
      options:{
      jshintrc:".jshintrc"
      }
      },
      //css语法校验
      csslint:{
      build:["build/debug/<%=pkg.name%>.debug.css"],
      options:{
      csslintrc:".csslintrc"
      }
      },
      //js压缩
      uglify:{
      options:{
      stripBanners:true,
      banner:'/*! <%=pkg.name%>-<%=pkg.version%>.js <%=grunt.template.today("yyyy-mm-dd")%> */\n'
      },
      build:{
      mangle:true, //变量名混淆
      src:"build/debug/*.js",
      dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.js"
      }
      },
      //css压缩
      cssmin:{
      options:{
      stripBanners:true,
      banner:'/*! <%=pkg.name%>-<%=pkg.version%>.css <%=grunt.template.today("yyyy-mm-dd")%> */\n'
      },
      build:{
      src:"build/debug/*.css",
      dest:"build/app/<%=pkg.name%>-<%=pkg.version%>.min.css"
      }
      },
      //自动化构建
      watch:{
      build:{
      files:["Gruntfile.js","js/*.js","css/*.css"],
      tasks:["concat","jshint","csslint","uglify","cssmin"],
      options:{spawn:false}
      }
      } });
      grunt.loadNpmTasks("grunt-contrib-concat");
      grunt.loadNpmTasks("grunt-contrib-jshint");
      grunt.loadNpmTasks("grunt-contrib-csslint");
      grunt.loadNpmTasks("grunt-contrib-uglify");
      grunt.loadNpmTasks("grunt-contrib-cssmin");
      grunt.loadNpmTasks("grunt-contrib-watch"); //告诉grunt当我们在终端输入grunt时,需要做些什么(有先后顺序)
      grunt.registerTask("default",["concat","jshint","csslint","uglify","cssmin","watch"]);
      };

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

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

grunt的学习和使用的更多相关文章

  1. Grunt入门学习之(1) -- 环境安装

    Grunt入门学习(1) - 环境安装 这周根据项目需要,在项目的基础上分模块开发了一个小的项目板块,但是在规范组织每个模块的代码和其依赖性时比较麻烦,需要一个项目板块的构建工具.各个模块都包括其对应 ...

  2. Grunt入门学习之(3) -- Gruntfile具体示例

    经过前面的学习,将测试的Gruntfile整合在一起! /** * Created by Administrator on 2017/6/22. */ module.exports = functio ...

  3. 自动化构建工具grunt的学习

    关于grunt的一些记录,记的比较乱... 0.删除node_modules文件夹 命令行: npm install rimraf -g //先运行 rimraf node_modules //然后运 ...

  4. grunt 入门学习

    前端工作流,Grunt上手指南 Posted@2013-04-20 7:15 a.m. CategoriesGrunt ,  javascript 我想先花点时间回忆一下作为一个前端需要做的工作(Lo ...

  5. Grunt之学习历程(转自网上资源-整理自用)

    认识Grunt Grunt中文文档 安装Node环境 CNode 配置Grunt Grunt中文文档-配置任务 什么是package.json package.json中文文档 关于Grunt资料 应 ...

  6. 【grunt】grunt 基础学习

    1. 干啥的呢? 项目打包管理,用处有 1)可用于压缩合并前端文件,包括css/js , 2)可用于管理发布文件与开发文件,3)可用于自动编译less 文件 2. 常用的东西有哪些呢? 常用的插件有 ...

  7. Grunt入门学习之(2) -- Gruntfile的编写

    Gruntfile由以下几部分构成: "wrapper" 函数 项目与任务,目标配置 加载grunt插件和任务 自定义任务 1.wrapper函数(包装函数) 每一个 Gruntf ...

  8. 【grunt整合版】30分钟学会使用grunt打包前端代码

    grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...

  9. 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)

    前言 上一篇博客,我们简单的介绍了grunt的使用,一些基础点没能覆盖,我们今天有必要看看一些基础知识 [grunt第一弹]30分钟学会使用grunt打包前端代码 配置任务/grunt.initCon ...

随机推荐

  1. Mac 执行 gulp 报错 -bash: gulp: command not found

    在mac系统下安装gulp,之后执行gulp 报如下错误: -bash: gulp: command not found 回溯安装过程发现问题如下 1.执行 npm root: Application ...

  2. 2018.03.04 晚上Atcoder比赛

    C - March Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement There are N  ...

  3. vim使用配置-python

    安装vundle git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim 添加配置文件 vim ~/.v ...

  4. 【Android】登陆界面设计

    界面布局 布局其实很简单,用相对布局累起来就可以了,然后注册和记住密码这两个控件放在一个水平线性布局里 界面底部还设置了一个QQ一键登录的入口,可以直接用. 控件的ID命名有点乱 <?xml v ...

  5. 取代PHP原生函数的一些扩展包

    前言 虽然程序员无时无刻都在造轮子,但造轮子也有效率之分,用好轮子才能造出好"

  6. C#学习笔记_09_构造方法/函数

    09_构造方法/函数 代码案例 作用:构造函数主要是用来创建对象时为对象赋初值来初始化对象:总与new运算符一起使用在创建对象的语句中,例如A a=new A(); 特点: 构造函数具有和类一样的名称 ...

  7. PAT 1106 Lowest Price in Supply Chain

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  8. IDEA git commit push revert

    Revert uncommitted changes You can always undo the changes you've done locally before you have commi ...

  9. windows 实现vue命令行

    在代码编辑器里写好文件的位置,以及相关的命令,保存文件类型是.cmd

  10. linux学习6-简单的文本处理

    简单的文本处理 实验介绍 这一节我们将介绍这几个命令tr(注意不是tar),col,join,paste.实际这一节是上一节关于能实现管道操作的命令的延续,所以我们依然将结合管道来熟悉这些命令的使用. ...