grunt轻松入门
项目目录,js源文件
gruntest
Gruntfile.js
package.json
-- js
ext
community_plugin.js
glogin_frm_cover.js
iLogin.js
kkpv.js
lnk_plugin.js
md5.js
storyleak_plugin.js
tabSwitch.js
-- 5.2
js
download_main.js
mp4
js
kankan_commercial_mp4.js
kankan_page_mp4.js
kkc.js
kkcs.js
我用grunt简单的完成以下任务,
1. js/ext/(community_plugin.js、iLogin.js、lnk_plugin.js、tabSwitch.js)压缩到js/*-min.js ,js/ext/(glogin_frm_cover.js、kkpv.js、md5.js、storyleak_plugin.js) 压缩合并到js/exm-min.js
2. 5.2/js/download_main.js压缩到5.2/js/download_main-min.js
3. 5.2/mp4/js/*.js压缩到5.2/mp4/js/*-min.js
任务配置文件Gruntfile.js语法
grunt.initConfig({
js_exm_dir:{ //全局变量、自定义
src:['js/ext/glogin_frm_cover.js','js/ext/kkpv.js','js/ext/md5.js','js/ext/storyleak_plugin.js'],
dest:'js/exm-min.js'
},
concat: { //任务concat
options: {
//任务配置
},
js_exm: { //子任务,自定义
options和文件 ,子任务的option会覆盖任务option
}
}
});
1)<%= %>读取变量值,最外层要有''包围!
2)可直接在子任务中配置文件
1. concat: {
js_exm: {
src:['src/b1.js','src/b2.js'],
dest:'dest/a1.js'
}
}
2.jshint:{ //只有src可以采用此方式
with_overrides:['js/**/*.js'],
}
3.jshint:{ //只有src可以采用此方式
with_overrides:'js/**/*.js',
}
3)另外子任务属性files有三种方式配置文件
1.concat: {
js_exm:{
files:{
'dest/a1.js':['src/b1.js','src/b2.js'],
'dest/a1.js':['src/c1.js','src/c2.js']
}
}
}
2.concat: {
js_exm:{
files:[
{dest:'dest/a1.js',src:['src/b1.js','src/b2.js']},
{dest: 'dest/a1.js',src:['src/c1.js','src/c2.js']}
]
}
}
3.jshint:{
with_overrides: {
files: {src: ['js/**/*.js']}
}
}
除了dest、src还有其他属性filter、nonull、dot、matchBase、expand。
源文件是多个文件时对文件列表进行平行展开即:['src/a.js','src/b.js','src/c.js']与[['src/a.js','src/b.js'],'src/c.js']是等效的。
另外有几种路径短配符*(匹配多个字符除/)、?(匹配单个字符除/)、**(匹配多个字符)、{}(用,隔开的or语句)、!(表示不匹配此路径)
下面介绍几种任务模块
1)文件合并
首先安装插件,在任务目录下 npm install grunt-contrib-concat --save-dev

concat: {
options: {
separator: ';' ,
banner: '/*! <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
js_exm:{
dest:'<%= js_exm_dir.dest %>',src:'<%= js_exm_dir.src %>'
}
},
2)文件压缩
首先安装插件,在任务目录下 npm install grunt-contrib-uglify --save-dev

uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
js_exm_min: {
files: {
'js/exm.min.js': ['<%= concat.js_exm.dest %>']
}
}
}
3)代码优化
首先安装插件,在任务目录下 npm install grunt-contrib-jshint --save-dev

最后要注册插件
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
及注册任务
grunt.registerTask(taskname, [description,],tasklist)
如: grunt.registerTask('build', ['concat','uglify','jshint']);
另外可以注册任务的子任务只选择子任务运行如: grunt.registerTask('build-exm', ['concat:js-exm','uglify','jshint:with_overrides']);
运行命令为

可以利用grunt-api自定义任务,比如定义一个压缩单个js的任务
grunt.registerTask('ug-js', ['uglify:js_min']);
grunt.registerTask('ug-single','uglify single js',function(src,dest){
grunt.config('tmpsrc',src);
grunt.config('tmpdest',dest);
grunt.task.run('ug-js');
});
uglify: {
js_min:{
files:{'<%= tmpdest %>':'<%= tmpsrc %>'}
}
},
运行命令为

传入的参数不能有''。
还有一种从命令行传入参数进而定义一个压缩单个js的方式为:
var src = grunt.option('src');
var dest = grunt.option('dest');
grunt.config('tmpsrc',src);
grunt.config('tmpdest',dest);
运行命令为

传入的参数不能有''。
Gruntfile.js代码如下:
module.exports = function(grunt) {
grunt.initConfig({
pkg:grunt.file.readJSON('package.json'),
js_exm_dir:{ //全局变量、自定义
src:['js/ext/glogin_frm_cover.js','js/ext/kkpv.js','js/ext/md5.js','js/ext/storyleak_plugin.js'],
dest:'js/exm.js'
},
concat: { //任务concat
options: { //配置
separator: ';' ,
banner: '/*! <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
js_exm:{ //子任务js_exm options和文件 ,子任务的option会覆盖任务concat全局option
dest:'<%= js_exm_dir.dest %>',src:'<%= js_exm_dir.src %>'
}
},
uglify: {
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
},
js_exm_min: {
files: {
'js/exm-min.js': ['<%= concat.js_exm.dest %>']
}
},
js_min_test:{
files:[
{dest:'js/community_plugin.js',src:'js/ext/community_plugin.js'},
{dest:'js/iLogin.js',src:'js/ext/iLogin.js'},
{dest:'js/lnk_plugin.js',src:'js/ext/lnk_plugin.js'},
{dest:'js/tabSwitch.js',src:'js/ext/tabSwitch.js'}]
},
js_min:{
files:{'<%= tmpdest %>':'<%= tmpsrc %>'}
}
},
qunit: {
files: ['test/**/*.html']
},
jshint: {
beforeconcat: ['Gruntfile.js'],
options: {
// options here to override JSHint defaults
"-W099":true,
"-W100":true,
globals: {
//module: true
}
},
with_overrides: {
options: {
"-W002":true,
"-W004":true,
"-W009":true,
"-W027":true,
"-W030":true,
"-W032":true,
"-W033":true,
"-W038":true,
"-W041":true,
"-W044":true,
"-W049":true,
"-W051":true,
"-W053":true,
"-W057":true,
"-W058":true,
"-W060":true,
"-W061":true,
"-W065":true,
"-W069":true,
"-W075":true,
"-W082":true,
"-W083":true,
"-W084":true,
"-W088":true,
"-W107":true,
"-W120":true,
ignores:['Gruntfile.js','js/exm-min.js'],
},
files: [
{src: ['js/**/*.js']},{src:['5.2/**/*.js']}
],
}
},
watch: {
files: ['<%= jshint.with_overrides.files %>'],
tasks: ['jshint', 'qunit']
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('build-exm', ['concat:js_exm','uglify:js_exm_min']);
grunt.registerTask('ug-js', ['uglify:js_min']);
grunt.registerTask('ug-single','uglify single js',function(src,dest){
grunt.config('tmpsrc',src);
grunt.config('tmpdest',dest);
grunt.task.run('ug-js');
});
var src = grunt.option('src');
var dest = grunt.option('dest');
grunt.config('tmpsrc',src);
grunt.config('tmpdest',dest);
}
package.json代码如下:
{
"family": "test",
"version": "0.0.1",
"name": "gruntTest",
"spm": {
"alias": {
"jquery": "gallery/jquery/1.8.2/jquery",
"dialog": "dist/styles/component/dialog/src/dialog"
}
},
"devDependencies": {
"grunt": "~0.4.1",
"grunt-contrib-concat": "~0.3.0",
"grunt-contrib-uglify": "~0.2.4",
"grunt-contrib-jshint": "~0.6.4",
"grunt-contrib-qunit": "~0.3.0",
"grunt-contrib-watch": "~0.5.3"
}
}
grunt轻松入门的更多相关文章
- 前端自动化grunt轻松入门
如果你还不了解grunt,或者只是听过它的名字而没有去研究过它,那么这篇入门级的文章就是为你写的,相信看完你就会爱上grunt! grunt是什么? grunt是一个非常好的自动化工具,你只管code ...
- Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)
摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html Groovy轻松入门--通过与Java的比较,迅速掌握Groovy ...
- Groovy轻松入门——搭建Groovy开发环境
摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/17/104391.html Groovy轻松入门--搭建Groovy开发环境 多日来,我发表了 ...
- C++ STL编程轻松入门基础
C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...
- Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)
转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...
- Grunt使用入门
Grunt使用入门 (by vczero) 一.前言 项目中一直在使用Grunt,只是对Grunt的基本使用,却未系统的总结过.为什么要构建工具?一句话:自动化.对于需要反复重复的任务,例如压缩(mi ...
- JavaScript面向对象轻松入门之封装(demo by ES5、ES6、TypeScript)
本章默认大家已经看过作者的前一篇文章 <JavaScript面向对象轻松入门之抽象> 为什么要封装? 封装(Encapsulation)就是把对象的内部属性和方法隐藏起来,外部代码访问该对 ...
- asp.net core轻松入门之MVC中Options读取配置文件
接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...
- AngularJs轻松入门
AngularJs轻松入门系列博文:http://blog.csdn.net/column/details/angular.html AngularJs轻松入门(一)创建第一个应用 AngularJs ...
随机推荐
- JavaWeb之JDBC
一.介绍 C#定义了ADO.Net接口来实现对SQLServer.Oracel等数据库的访问,那Java定义了JDBC接口实现对数据库的访问,数据库提供商只要实现这些接口,Java语言就能访问数据库. ...
- 面试 -- ListView对其指定的子Item进行单独的刷新
1,最近在面试题目的时候突然看到了问题"ListView对其指定的子Item进行单独的刷新",当时感觉一脸懵逼,还是第一次听到这个问题,也就是不能使用adapter.notifyD ...
- SpringMVC中@RequestBody引起的400异常处理,返回校验失败具体信息
问题 使用@RequestBody接收一个json数据的时候,如果传入的参数不符合条件,就会直接返回400的error page. 但究竟是为什么会400并没有抛出来.这对大量参数字段的我们来说,排错 ...
- php基本数据类型需要注意的地方
一.布尔(Boolean) 手册中提到特殊类型NULL(包括尚未赋值的变量)会被换为false值,我自己在测试的时候发现NULL值可以转换为false,虽然false也会输出,但是尚未赋值的变量会报N ...
- oracle学习 笔记(2)
题记:在使用Oracle数据库的时候,发现Oracle是没有自动增长列来实现主键的,所以在此记录学习.(PS:如果哪里有错误或者不足的地方还请大家帮忙指出来) 二.序列(自动增长列) 为此问题博主也是 ...
- Struts2.5简单使用入门
今天学了Struts2.5最新版的,老师在黑板上讲的很是简单,也很是容易,简单的就实现了.可是课下让我们自己弄,自己无论如何都无法运行成功,一直提示404.偶然间灵机一动,改了一下那个文件就好了.希望 ...
- 安装IPython攻略
由于对python自带的idle不太满意,看到有介绍说ipython不错,于是想装一个试试. 机器上该装的扩展包都已经装好了,比如setuptools,matplotlib,环境变量配置,所以安装起来 ...
- CI Weekly #16 | 从另一个角度看开发效率:flow.ci 数据统计功能上线
很开心的告诉大家,flow.ci 数据统计功能已正式上线. 进入 flow.ci 控制台,点击「数据分析」按钮,你可以按照时间日期筛选,flow.ci 将多维度地展示「组织与项目」的构建数据指标与模型 ...
- VB6/VBA中跟踪鼠标移出窗体控件事件(类模块成员函数指针CHooker类应用)
一.关于起因 前几天发了一篇博文,是关于获取VB类模块成员函数指针的内容(http://www.cnblogs.com/alexywt/p/5880993.html):今天我就发一下我的应用实例. V ...
- CF #401 (Div. 2) E. Hanoi Factory (栈+贪心)
题意:给你一堆汉诺塔的盘子,设内半径为a,设外半径为b,高度为h,如果bj ≤ bi 同时bj > ai 我们就认为i盘子能落在在j盘子上,问你最高能落多高 思路:一看题意我们就能想到贪心,首先 ...