项目目录,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轻松入门的更多相关文章

  1. 前端自动化grunt轻松入门

    如果你还不了解grunt,或者只是听过它的名字而没有去研究过它,那么这篇入门级的文章就是为你写的,相信看完你就会爱上grunt! grunt是什么? grunt是一个非常好的自动化工具,你只管code ...

  2. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html Groovy轻松入门--通过与Java的比较,迅速掌握Groovy ...

  3. Groovy轻松入门——搭建Groovy开发环境

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/17/104391.html Groovy轻松入门--搭建Groovy开发环境 多日来,我发表了 ...

  4. C++ STL编程轻松入门基础

    C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...

  5. Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)

    转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...

  6. Grunt使用入门

    Grunt使用入门 (by vczero) 一.前言 项目中一直在使用Grunt,只是对Grunt的基本使用,却未系统的总结过.为什么要构建工具?一句话:自动化.对于需要反复重复的任务,例如压缩(mi ...

  7. JavaScript面向对象轻松入门之封装(demo by ES5、ES6、TypeScript)

    本章默认大家已经看过作者的前一篇文章 <JavaScript面向对象轻松入门之抽象> 为什么要封装? 封装(Encapsulation)就是把对象的内部属性和方法隐藏起来,外部代码访问该对 ...

  8. asp.net core轻松入门之MVC中Options读取配置文件

    接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...

  9. AngularJs轻松入门

    AngularJs轻松入门系列博文:http://blog.csdn.net/column/details/angular.html AngularJs轻松入门(一)创建第一个应用 AngularJs ...

随机推荐

  1. Selenium2 WebDriver环境搭建

    1.下载Selenium Client Servers包 在Selenium官网上可以下载到最新的开源的包http://seleniumhq.org/download/,根据编写测试脚本所使用的语言下 ...

  2. spring-AOP-ProxyFactoryBean代理的实例

    1.一个代理模式的实例 通过 Proxy类进行代理 wait.java //定义一个接口 public interface wait { void say(); } //目标对象实现接口并重写方法 p ...

  3. pyqt样式表语法笔记(中)

    pyqt样式表语法笔记(中) pyqt QSS python 样式表 一.弹窗 在日常的各种桌面软件的使用中,我们都会碰到弹窗.例如注册,登录的时候,会有相应的信息弹窗,这里就以信息收集弹窗为例进行弹 ...

  4. Spring的IoC容器

    Spring是一个轻量级的Java开发框架,其提供的两大基础功能为IoC和AOP,其中IoC为依赖反转(Inversion of Control).IOC容器的基本理念就是"为别人服务&qu ...

  5. js面向对象-原型链

    var Person = function (name) { this.name = name; } Person.prototype.say = function () { console.log( ...

  6. iPhone与iWatch连接、控制、数据传递(Swift)

    最近在做一个项目,涉及到iPhone设备和手表传输数据.控制彼此界面跳转,在网上找了很多资料,发现国内的网站这方面介绍的不多,而国外的网站写的也不是很全,所以在这写这篇博客,给大家参考一下,望大神指点 ...

  7. [SinGuLaRiTy] 米勒罗宾素数判定法

    [SinGuLaRiTy-1003] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 背景 数论学家利用费马小定理研究出了多种素数测试办法,M ...

  8. LoonAndroid自动检测输入框 --- Author: rose && lvyerose@163.com

    LoonAndroid框架,同时给我们提供了一套自动检测输入规则的工具,用起来很是方便,下面介绍一下这个东东的使用方法(注意,该说明是基于项目已经集成了LoonAndroid框架而言,如果您未集成该框 ...

  9. 读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来

    1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定 ...

  10. Maven基础学习(一)—Maven入门

    一.概述      Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管 ...