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

最新文章

  1. C#中SQL Server数据库连接池使用及连接字符串部分关键字使用说明
  2. java9-8 局部内部类
  3. HDU4859 海岸线(最小割)
  4. NEC学习 ---- 布局 -两列, 左侧定宽,右侧自适应
  5. Java最全文件操作实例汇总
  6. jQuery的图像裁剪插件Jcrop
  7. 数据库事务 及ACID
  8. C# Control 控件DrapDrop不触发的问题
  9. 打印web页面指定区域的三种方法
  10. ceph for openstack快速部署实施
  11. 何为PostgreSQL?
  12. 原生Js写轮播图代码
  13. JDBC数据库连接池之dbcp
  14. 设置ul的指定li 样式
  15. visio2013激活软件
  16. [Leet code 2]Two Sum
  17. 共享单车微信小程序
  18. Django---时间的时区问题
  19. [ZJOI2015]幻想乡战略游戏——动态点分治
  20. vs2017不是完全支持c99

热门文章

  1. 初涉JavaScript模式 (7) : 原型模式 【三】
  2. 使用wrapper将java程序注册程windows服务后不生效
  3. jQuery1.6以上版本prop和attr的区别
  4. php开发中的url地址传输加密解密函数
  5. MySql存储过程—3、变量
  6. Info
  7. zoj 3758 Singles&#39; Day
  8. LayerDrawable 资源
  9. 将excel里面的数据导入到程序里面
  10. C++編程札記「基礎」