Grunt in action
2016-05-18 15:57
204 查看
Grunt 是一个自动任务运行器,会安装预先定义的顺序自动运行一系列的的任务,可以简化工作流程,减少重复性的工作从而提高工作交流,
这篇简易教程会从0着手详细介绍grunt。
1、安装
grunt是基于nodejs的,如果你还没有安装,请从http://nodejs.org/下载安装windows版或者Linux版,安装nodejs后,运行如下命令:
sudo npm install -g grunt-cli
grunt-cli是grunt命令行工具,-g 表示全局安装。安装命令行工具后需要安装模块才能使用相应的模块,模块安装推荐局部安装,因为不同的项目对模块版本的要求可能是不一样的。
2、环境搭建
一般需要在你的项目中添加两个文件:packeage.json 和Gruntfile(Gruntfile.js for js,Gruntfile.coffee for coffeescript)
package.json : 此文件被npm用于存储项目的元数据,以便次项目可以发布为npm模块,并且可以在这个文件中指定项目依赖的grunt或者grunt plugin,这些依赖信息放在 devDependencies字段里
GruntFile :用来配置或定义任务(task)并加载grunt plugin的。
生成package.json
首先在项目的根目录下建一个文件名为package.json文件,或者通过npm init 生成一个。为了介绍方便,我们从grunt官网上找一个现成的文件,内容如下:
{
“name”: “my-project-name”,
“version”: “0.1.0”,
“author”: “Your Name”,
“devDependencies”: {
“grunt”: “0.x.x”,
“grunt-contrib-jshint”: “*”,
“grunt-contrib-concat”: “~0.1.1”,
“grunt-contrib-uglify”: “~0.1.0”,
“grunt-contrib-watch”: “~0.1.4”
}
}
稍微解释下里面的devDependencies,grunt核心模块为最新的0.x.x版,jshint插件为最新版本,concat插件不低于0.1.1版,uglify插件不低于0.1.0版,watch插件不低于0.1.4版。
然后就可以通过命令行安装模块了,将相应的模块装到该目录下的node_modules文件夹内,命令如下:
npm install
当然如果已经有package.json不包括相应的模块,就可以一个一个安装,命令如下:
npm install <module> –save-dev
可以通过下面的命令安装同样的模块:
npm install grunt –save-dev
npm install grunt-contrib-jshint –save-dev
npm install grunt-contrib-concat –save-dev
npm install grunt-contrib-uglify –save-dev
npm install grunt-contrib-watch –save-dev
需要补充的是–save-dev 不但可以安装对应的模块,还没有保存到devDependencies字段内。
建立Gruntfile文件
在package.json文件的统计目录,建立一个GruntFile.js文件,它是grunt的配置文件。包括如下几个方法:
wrapper函数
项目与任务配置
加载grunt插件和任务
4. 自定义任务
要遵循nodejs的模块写法,grunt作为参数:
module.exports = function(grunt) {
// 配置Grunt各种模块的参数
grunt.initConfig({
jshint: { /* jshint的参数 */ },
concat: { /* concat的参数 */ },
uglify: { /* uglify的参数 */ },
watch: { /* watch的参数 */ }
});
// 从node_modules目录加载模块文件
grunt.loadNpmTasks(‘grunt-contrib-jshint’);
grunt.loadNpmTasks(‘grunt-contrib-concat’);
grunt.loadNpmTasks(‘grunt-contrib-uglify’);
grunt.loadNpmTasks(‘grunt-contrib-watch’);
// 每行registerTask定义一个任务
grunt.registerTask(‘default’, [‘jshint’, ‘concat’, ‘uglify’]);
grunt.registerTask(‘check’, [‘jshint’]);
};
grunt.initConfig:定义各种模块的参数,每一个成员项对应一个同名模块。
grunt.loadNpmTasks:加载模块。
grunt.registerTask:定义具体的任务,第一个参数为任务名(即grunt 后面的参数,如 grunt check),第二个参数是一个数组,表示该任务需要依次使用的模块。default任务名表示,如果直接输入grunt命令,后面不跟任何参数所调用的模块;该例的check任务则表示使用jshint插件对代码进行语法检查。
3、Grunt例子,更多的例子可以访问http://gruntjs.com/plugins,找你需要的插件。
(1) grunt-contrib-cssmin,cssmin模块的作用是最小化CSS文件
首先,在项目的根目录下安装该模块。
npm install grunt-contrib-cssmin –save-dev
完整的代码如下:
module.exports = function(grunt) {
grunt.initConfig({
cssmin: {
minify: {
expand: true,
cwd: ‘css/’,
src: [‘.css’, ‘!.min.css’],
dest: ‘css/’,
ext: ‘.min.css’
},
combine: {
files: {
‘css/out.min.css’: [‘css/part1.min.css’, ‘css/part2.min.css’]
}
}
}
});
grunt.loadNpmTasks(‘grunt-contrib-cssmin’);
grunt.registerTask(‘default’, [‘cssmin:minify’,’cssmin:combine’]);
};
expand:如果设为true,就表示下面文件名的占位符(即*号)都要扩展成具体的文件名。
cwd:需要处理的文件(input)所在的目录。
src:表示需要处理的文件。如果采用数组形式,数组的每一项就是一个文件名,可以使用通配符。
dest:表示处理后的文件名或所在目录。
ext:表示处理后的文件后缀名。
(2)grunt-contrib-jshint,js文件静态检查
它在grunt.initConfig方法里面的配置代码如下:
jshint: {
options: {
eqeqeq: true,
trailing: true
},
files: [‘Gruntfile.js’, ‘lib/*/.js’]
}
完整的jshint配置可以参考这里:http://jshint.com/docs/options/。eqeqeq表示要用===取代==,trailing表示行尾不得有多余的空格,files表示要检查的文件。
(3)grunt-contrib-concat,用来合并文件,不止合并js文件,还可以合并css文件。
concat: {
js: {
src: [‘lib/module1.js’, ‘lib/module2.js’, ‘lib/plugin.js’],
dest: ‘dist/script.js’
}
css: {
src: [‘style/normalize.css’, ‘style/base.css’, ‘style/theme.css’],
dest: ‘dist/screen.css’
}
},
(4)grunt-contrib-uglify,用来压缩代码
uglify: {
options: {
banner: bannerContent,
sourceMapRoot: ‘../’,
sourceMap: ‘distrib/’+name+’.min.js.map’,
sourceMapUrl: name+’.min.js.map’
},
target : {
expand: true,
cwd: ‘js/origin’,
src : ‘*.js’,
dest : ‘js/’
}
},
详细的解释配置:https://www.npmjs.com/package/grunt-contrib-uglify
(5)grunt-contrib-watch,监控文件,然后自动执行任务
watch: {
scripts: {
files: ‘*/.js’,
tasks: ‘jshint’,
options: {
livereload: true,
},
},
css: {
files: ‘*/.sass’,
tasks: [‘sass’],
options: {
livereload: true,
},
},
}
设置好上面的代码,打开另一个进程,运行grunt watch。此后,任何的js代码变动,文件保存后就会自动运行jshint任务;任何sass文件变动,文件保存后就会自动运行sass任务。
4、其他的模块
(1)grunt-contrib-clean,删除文件或目录
clean: {
build: {
src: [“path/to/dir/one”, “path/to/dir/two”]
}
}
(2) grunt-contrib-connect,在本机运行一个Web Server
(3)grunt-htmlhint html语法检查
5 自动加载grunt plugin
有时候删除一个插件而忘了更新Gruntfile文件,这时候运行就会报错,构建将会停止。你想象一下,如果有很多插件手动维护还是挺麻烦的,我们可以通过一个比较小巧的插件(load-grunt-tasks)实现,有了它,多行的
grunt.loadNpmTasks(‘grunt-contrib-concat’);
grunt.loadNpmTasks(‘grunt-contrib-uglify’);
grunt.loadNpmTasks(‘grunt-contrib-imagemin’);
就可以变成一行:
require(‘load-grunt-tasks’)(grunt);
6 使用load-grunt-config插件将Gruntfile拆分
详细的参考http://www.html5rocks.com/en/tutorials/tooling/supercharging-your-gruntfile/
参考链接:
http://www.html5rocks.com/en/tutorials/tooling/supercharging-your-gruntfile/
http://www.sitepoint.com/writing-awesome-build-script-grunt/
http://javascript.ruanyifeng.com/tool/grunt.html
https://www.npmjs.com/package/grunt-contrib-jshint
http://www.gruntjs.net/docs/getting-started/
这篇简易教程会从0着手详细介绍grunt。
1、安装
grunt是基于nodejs的,如果你还没有安装,请从http://nodejs.org/下载安装windows版或者Linux版,安装nodejs后,运行如下命令:
sudo npm install -g grunt-cli
grunt-cli是grunt命令行工具,-g 表示全局安装。安装命令行工具后需要安装模块才能使用相应的模块,模块安装推荐局部安装,因为不同的项目对模块版本的要求可能是不一样的。
2、环境搭建
一般需要在你的项目中添加两个文件:packeage.json 和Gruntfile(Gruntfile.js for js,Gruntfile.coffee for coffeescript)
package.json : 此文件被npm用于存储项目的元数据,以便次项目可以发布为npm模块,并且可以在这个文件中指定项目依赖的grunt或者grunt plugin,这些依赖信息放在 devDependencies字段里
GruntFile :用来配置或定义任务(task)并加载grunt plugin的。
生成package.json
首先在项目的根目录下建一个文件名为package.json文件,或者通过npm init 生成一个。为了介绍方便,我们从grunt官网上找一个现成的文件,内容如下:
{
“name”: “my-project-name”,
“version”: “0.1.0”,
“author”: “Your Name”,
“devDependencies”: {
“grunt”: “0.x.x”,
“grunt-contrib-jshint”: “*”,
“grunt-contrib-concat”: “~0.1.1”,
“grunt-contrib-uglify”: “~0.1.0”,
“grunt-contrib-watch”: “~0.1.4”
}
}
稍微解释下里面的devDependencies,grunt核心模块为最新的0.x.x版,jshint插件为最新版本,concat插件不低于0.1.1版,uglify插件不低于0.1.0版,watch插件不低于0.1.4版。
然后就可以通过命令行安装模块了,将相应的模块装到该目录下的node_modules文件夹内,命令如下:
npm install
当然如果已经有package.json不包括相应的模块,就可以一个一个安装,命令如下:
npm install <module> –save-dev
可以通过下面的命令安装同样的模块:
npm install grunt –save-dev
npm install grunt-contrib-jshint –save-dev
npm install grunt-contrib-concat –save-dev
npm install grunt-contrib-uglify –save-dev
npm install grunt-contrib-watch –save-dev
需要补充的是–save-dev 不但可以安装对应的模块,还没有保存到devDependencies字段内。
建立Gruntfile文件
在package.json文件的统计目录,建立一个GruntFile.js文件,它是grunt的配置文件。包括如下几个方法:
wrapper函数
项目与任务配置
加载grunt插件和任务
4. 自定义任务
要遵循nodejs的模块写法,grunt作为参数:
module.exports = function(grunt) {
// 配置Grunt各种模块的参数
grunt.initConfig({
jshint: { /* jshint的参数 */ },
concat: { /* concat的参数 */ },
uglify: { /* uglify的参数 */ },
watch: { /* watch的参数 */ }
});
// 从node_modules目录加载模块文件
grunt.loadNpmTasks(‘grunt-contrib-jshint’);
grunt.loadNpmTasks(‘grunt-contrib-concat’);
grunt.loadNpmTasks(‘grunt-contrib-uglify’);
grunt.loadNpmTasks(‘grunt-contrib-watch’);
// 每行registerTask定义一个任务
grunt.registerTask(‘default’, [‘jshint’, ‘concat’, ‘uglify’]);
grunt.registerTask(‘check’, [‘jshint’]);
};
grunt.initConfig:定义各种模块的参数,每一个成员项对应一个同名模块。
grunt.loadNpmTasks:加载模块。
grunt.registerTask:定义具体的任务,第一个参数为任务名(即grunt 后面的参数,如 grunt check),第二个参数是一个数组,表示该任务需要依次使用的模块。default任务名表示,如果直接输入grunt命令,后面不跟任何参数所调用的模块;该例的check任务则表示使用jshint插件对代码进行语法检查。
3、Grunt例子,更多的例子可以访问http://gruntjs.com/plugins,找你需要的插件。
(1) grunt-contrib-cssmin,cssmin模块的作用是最小化CSS文件
首先,在项目的根目录下安装该模块。
npm install grunt-contrib-cssmin –save-dev
完整的代码如下:
module.exports = function(grunt) {
grunt.initConfig({
cssmin: {
minify: {
expand: true,
cwd: ‘css/’,
src: [‘.css’, ‘!.min.css’],
dest: ‘css/’,
ext: ‘.min.css’
},
combine: {
files: {
‘css/out.min.css’: [‘css/part1.min.css’, ‘css/part2.min.css’]
}
}
}
});
grunt.loadNpmTasks(‘grunt-contrib-cssmin’);
grunt.registerTask(‘default’, [‘cssmin:minify’,’cssmin:combine’]);
};
expand:如果设为true,就表示下面文件名的占位符(即*号)都要扩展成具体的文件名。
cwd:需要处理的文件(input)所在的目录。
src:表示需要处理的文件。如果采用数组形式,数组的每一项就是一个文件名,可以使用通配符。
dest:表示处理后的文件名或所在目录。
ext:表示处理后的文件后缀名。
(2)grunt-contrib-jshint,js文件静态检查
它在grunt.initConfig方法里面的配置代码如下:
jshint: {
options: {
eqeqeq: true,
trailing: true
},
files: [‘Gruntfile.js’, ‘lib/*/.js’]
}
完整的jshint配置可以参考这里:http://jshint.com/docs/options/。eqeqeq表示要用===取代==,trailing表示行尾不得有多余的空格,files表示要检查的文件。
(3)grunt-contrib-concat,用来合并文件,不止合并js文件,还可以合并css文件。
concat: {
js: {
src: [‘lib/module1.js’, ‘lib/module2.js’, ‘lib/plugin.js’],
dest: ‘dist/script.js’
}
css: {
src: [‘style/normalize.css’, ‘style/base.css’, ‘style/theme.css’],
dest: ‘dist/screen.css’
}
},
(4)grunt-contrib-uglify,用来压缩代码
uglify: {
options: {
banner: bannerContent,
sourceMapRoot: ‘../’,
sourceMap: ‘distrib/’+name+’.min.js.map’,
sourceMapUrl: name+’.min.js.map’
},
target : {
expand: true,
cwd: ‘js/origin’,
src : ‘*.js’,
dest : ‘js/’
}
},
详细的解释配置:https://www.npmjs.com/package/grunt-contrib-uglify
(5)grunt-contrib-watch,监控文件,然后自动执行任务
watch: {
scripts: {
files: ‘*/.js’,
tasks: ‘jshint’,
options: {
livereload: true,
},
},
css: {
files: ‘*/.sass’,
tasks: [‘sass’],
options: {
livereload: true,
},
},
}
设置好上面的代码,打开另一个进程,运行grunt watch。此后,任何的js代码变动,文件保存后就会自动运行jshint任务;任何sass文件变动,文件保存后就会自动运行sass任务。
4、其他的模块
(1)grunt-contrib-clean,删除文件或目录
clean: {
build: {
src: [“path/to/dir/one”, “path/to/dir/two”]
}
}
(2) grunt-contrib-connect,在本机运行一个Web Server
(3)grunt-htmlhint html语法检查
5 自动加载grunt plugin
有时候删除一个插件而忘了更新Gruntfile文件,这时候运行就会报错,构建将会停止。你想象一下,如果有很多插件手动维护还是挺麻烦的,我们可以通过一个比较小巧的插件(load-grunt-tasks)实现,有了它,多行的
grunt.loadNpmTasks(‘grunt-contrib-concat’);
grunt.loadNpmTasks(‘grunt-contrib-uglify’);
grunt.loadNpmTasks(‘grunt-contrib-imagemin’);
就可以变成一行:
require(‘load-grunt-tasks’)(grunt);
6 使用load-grunt-config插件将Gruntfile拆分
详细的参考http://www.html5rocks.com/en/tutorials/tooling/supercharging-your-gruntfile/
参考链接:
http://www.html5rocks.com/en/tutorials/tooling/supercharging-your-gruntfile/
http://www.sitepoint.com/writing-awesome-build-script-grunt/
http://javascript.ruanyifeng.com/tool/grunt.html
https://www.npmjs.com/package/grunt-contrib-jshint
http://www.gruntjs.net/docs/getting-started/
相关文章推荐
- 我们究竟如何判断一个想法值不值得做呢?IOS开发
- LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- UIControl
- 使用Grunt启动和运行
- ActiveMQ入门实例
- Ubuntu下使用ssh远程登录时出现错误提示connect to host localhost port 22:Connection refused
- Android使用Matrix对Bitmap进行处理
- angularjs中的interceptor和挺好的例子
- 从2月14号开始,上传AppStore会碰到:Failed to locate or generate matching signing assets
- NYOJ 119 士兵杀敌(RMQ)
- JS中的call()和apply()方法
- 为sublime text 3 手动安装Package Control, 并设置HTTP 代理
- 程序员必知8大排序3大查找
- C++学习笔记(一)
- Node.js返回JSONP详解
- MYSQL 日期格式
- PHP数组元素的顺序与逆序排序
- $watch How the $apply Runs a $digest
- 实现微信翻页效果
- angularjs培训之service