grunt 是一个基于npm,node.js 用js编写的工具框架,可以自动完成一些重复性的任务(如合并文件,语法检查,压缩代码),
grunt拥有庞大的插件库,可以满足各种自动化批处理需求,常用的插件有:
concat ---> 合并文件
csslint ---> css语法检查
cssmin ---> css压缩
jshint ---> js语法检查
uglify ---> js压缩
watch ---> 自动化核心,监视文件修改并执行插件
autoprefixer ---> css浏览器前缀补全
node.js,grunt和grunt-cli 的安装略.
插件安装指令:
npm install grunt-contrib-concat --save-dev npm install grunt-contrib-csslint --save-dev npm install grunt-contrib-cssmin --save-dev npm install grunt-contrib-jshint --save-dev npm install grunt-contrib-uglify --save-dev npm install grunt-contrib-watch --save-dev npm install grunt-autoprefixer --save-dev
npm package.json 安装完插件后的配置
{ "name": "grunt_test", "version": "1.0.1", "devDependencies": { "grunt": "^1.0.1", "grunt-autoprefixer": "^3.0.4", "grunt-contrib-concat": "^1.0.1", "grunt-contrib-csslint": "^2.0.0", "grunt-contrib-cssmin": "^1.0.2", "grunt-contrib-jshint": "^1.0.0",
"grunt-contrib-uglify": "^2.0.0", "grunt-contrib-watch": "^1.0.0" } }
[重中之重] Gruntfile.js grunt配置文件
//包装函数 module.exports=function (grunt) { //任务配置,所有插件的配置信息 grunt.initConfig({ //获取 package.json 的信息 pkg:grunt.file.readJSON('package.json'), //js压缩 uglify: { options: { //头部注释 banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + '<%= grunt.template.today("yyyy-mm-dd") %> */', //生成sourceMap sourceMap: true }, my_target: { files: [ { expand: true, //源文件相对路径 cwd: 'src/', //选择文件 src: ['*.js','!*.min.js'], //目标文件输出目录 dest: 'dest/', //后缀 ext: '.min.js' } ] } }, //js语法检查 jshint: { options:{ jshintrc:'.jshintrc' }, my_target: ['src/*.js'], }, //css压缩 cssmin:{ options: { //文件头部输出信息 banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n', //美化代码 beautify: { //中文ascii化,非常有用,防止中文乱码 ascii_only: true } }, my_target: { files: [ { expand: true, //源文件相对路径 cwd: 'src/', //选择文件 src: ['*.css','!*.min.css'], //目标文件输出目录 dest: 'dest/', //后缀 ext: '.min.css' } ] } }, //css语法检查 csslint:{ options:{ csslintrc:'.csslintrc' }, build:['src/*.css'] }, //自动化 watch:{ test1:{ tasks:['jshint','uglify'], options:{spawn:false} }, test2:{ tasks:['csslint','cssmin'], options:{spawn:false} } }, //合并文件 concat: { options: { separator: ';\n', stripBanners: true, banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n' }, dist: { src: ['src/*.js'], dest: 'dest/basic.js', }, }, //css浏览器前缀补全 autoprefixer: { options: { browsers: ['Chrome < 50', 'ie > 8' ,'ff < 20','opera < 39'] }, your_target: { files: [ { expand: true, //源文件相对路径 cwd: 'src/', //选择文件 src: ['*.css','!*.min.css'], //目标文件输出目录 dest: 'dest/', //后缀 ext: '.fix.css' } ] }, }, }); //告诉grunt我们将要使用的插件 grunt.loadNpmTasks('grunt-contrib-concat');//合并代码 grunt.loadNpmTasks('grunt-contrib-jshint');//js语法检查 grunt.loadNpmTasks('grunt-contrib-csslint');//css语法检查 grunt.loadNpmTasks('grunt-contrib-cssmin');//css压缩 grunt.loadNpmTasks('grunt-contrib-uglify');//js压缩 grunt.loadNpmTasks('grunt-contrib-watch');//自动化核心,监视文件修改并执行插件 grunt.loadNpmTasks('grunt-autoprefixer');//css浏览器前缀补全 //告诉grunt当我们在终端中输入grunt时需要做些什么(注意先后顺序) grunt.registerTask('cont',['concat']); grunt.registerTask('afix',['autoprefixer']); grunt.registerTask('mcss',['cssmin']); grunt.registerTask('mjs',['uglify']); grunt.registerTask('default',['jshint','uglify','watch']); }
1,js,css压缩配置中,都是多个文件单独压缩生成多个对应文件名的.min.js或.min.css,并生成对应的sourceMap
2,autoprefixer配置中browsers: ['Chrome < 50', 'ie > 8' ,'ff < 20','opera < 39'], 设定要兼容的浏览器版本,故意将版本设置调低,可以兼容给多的浏览器,否则默认只兼容
['> 1%', 'last 2 versions', 'Firefox ESR'] 最新版本的主流浏览器
3,js语法检查和css语法检查都引用了外部配置文件(json格式) .jshintrc 和 .csslintrc ,如下
.jshintrc:
{ "curly": true, "eqeqeq": true, "eqnull": true, "browser": true, "boss":false, "expr":true, "immed":true, "newcap":true, "noempty":true, "noarg":true, "undef":true, "regexp":true, "node":true, "devel":true, "globals": { "jQuery": true } }
.csslintrc
{ "adjoining-classes":false, "box-sizing":false, "box-model" : false, "compatible-vendor-prefixes": false, "floats":false, "font-sizes":false, "gradients":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 }
执行相应task:
已经注册的task, grunt.registerTask('mcss',['cssmin']') , 执行命令为 grunt mcss
未注册的task, 可以直接调用相应插件,执行命令为 grunt cssmin