win7如何自定义任务栏Grunt任务

酷勤网 C 程序员的那点事!
当前位置: >
浏览次数:次
这篇文章将带领你用Grunt来提速和优化网站开发的流程。首先我们会简短介绍Grunt的功能,然后我们直接上手,介绍如何用Grunt的不同插件来替你完成网站项目开发中的很多繁冗工作。
接着我们会创建一个简单的input校验器,用来完成CSS的预处理,我们会学习如何用grunt-cssc和CssMin来合并和压缩CSS,如何用来保证我们的HTML正确无误,以及如何实现在运行时部署和压缩我们的文件。最后,我们会学习如何用来极简化我们的JavaScript以尽可能地节约带宽。
是一个JavaScript任务运行工具,它能替你完成重复性的任务,如极简化、编译、单元测试和linting。
过去几年JavaScript的发展速度令人震惊,不管是像Backbone.js和Ember.js这样的开发框架,还是JSBin这样的开发社区,这个语言的发展都不仅改变了我们作为用户对网站的体验,还改变了我们作为开发者对网站的开发方式。
使用JavaScript,你往往需要定期去执行一系列的任务,在大部分项目里人们可能对此已习以为常了,但它们仍然是重复的、浪费时间的活计。身处一个如此活跃的开发社区,你大概已经猜到,有现成的工具可以帮你自动化和加速完成这些任务了&&这就是Grunt的用武之地。
Grunt是什么?
Grunt基于Node.js之上,是一个以任务处理为基础的命令行工具,可以减少优化开发版本为发布版本所需的人力和时间,从而加速开发流程。它的工作原理是把这些工作整合为不同的任务,在你开发时自动执行。基本上,你可以让Grunt完成任何让你厌烦的任务:那些你需要重复进行的手工设置和运行发布的任务。
早期版本的Grunt自带JSHint和Uglify等plugin,最新的版本(version0.4)则完全依赖用户指定plugin来运行任务。到底有哪些任务可以运行呢?这个单子可是长得很,可以说,Grunt能干任何你扔给它的活,从极简化()到合并JavaScript()。它还可以完成一些跟JavaScript无关的任务,比如从LESS和Sass编译CSS。我们甚至还用过它跟来做编译失败的提醒。
为什么要用Grunt?
Grunt最大的优势之一是给团队带来一致性。如果你和别人一起工作过,你肯定知道代码风格的不一样有多让人伤神。Grunt能让团队使用一套统一的命令,从而保证每个人写的代码符合统一标准。说到底,如果因为团队中几个人代码风格的微小不同而导致编译失败,那可是最烦人的事了。
Grunt还有一个极其活跃的开发者社区,定期发布新的plugin。使用Grunt的门槛也相对较低,因为很多工具和自动化任务都是直接可用的。
要使用Grunt,第一件事是安装Node.js。(即使你没用过Node.js也不用担心&&你只需安装它让Grunt能运行。)
安装了Node.js之后,用命令行工具执行以下命令:
$ npm install -g grunt-cli
要确认Grunt是否正确安装,可以使用以下命令:
$ grunt --version
下一步是在你的项目的根目录下创建package.json和gruntfile.js两个文件。
创建package.json文件
这个JSON文件让我们指定我们的开发环境所依赖的必须模块。有了它,项目的所有开发者都能保证安装上一致的必须模块,从而保证所有人拥有一样的开发环境。
在项目根目录下的pacakge.json文件中写上:
&name& : &SampleGrunt&,
&version& : &0.1.0&,
&author& : &Brandon Random&,
&private& : true,
&devDependencies& : {
&grunt& : &~0.4.0&
然后在命令行工具运行:
$ npm install
该命令告诉npm需要安装的必须模块,npm会安装它们,自动保存在项目根目录下一个叫做node_modules的文件夹里。
创建gruntfile.js文件
gruntfile.js文件本质上就是一个wrapper函数,接受grunt作为参数:
module.exports = function(grunt){
grunt.initConfig({
pkg: grunt.file.readJSON('package.json')
grunt.registerTask('default', []);
现在你已经可以在项目根目录下运行grunt命令行工具了。
& Task &default& not found. Use --force to continue.
这里我们只指定了Grunt作为必须模块,还没定义任何任务。接下来我们就要指定任务和必须模块。首先来看如何拓展package.json文件。
拓展package.json文件
使用Node.js最好的一点,就是它可以根据package.json文件的内容,一次性查找和安装多个package。要安装我们项目的所有必须任务,只须在package.json文件中加上以下内容:
&name& : &SampleGrunt&,
&version& : &0.1.0&,
&author& : &Mike Cunsolo&,
&private& : true,
&devDependencies& : {
&grunt& : &~0.4.0&,
&grunt-contrib-cssmin&: &*&,
&grunt-contrib-sass&: &*&,
&grunt-contrib-uglify&: &*&,
&grunt-contrib-watch&: &*&,
&grunt-cssc&: &*&,
&grunt-htmlhint&: &*&,
&matchdep&: &*&
那么如何实现安装?你肯定已经猜到了:
$ npm install
使用Grunt载入任务
package安装好后,还必须被Grunt载入才能为我们所用。使用matchdep,我们用一行代码就可以自动载入所有任务。这是开发流程的一大优化,因为现在我们只须把必须任务列表写在package.json一个文件里,便于管理。
在gruntfile.js里,grunt.initConfig之上,写上以下代码:
require(&matchdep&).filterDev(&grunt-*&).forEach(grunt.loadNpmTasks);
要是没有matchdep,我们就必须为每一个必须任务写一次grunt.loadNpmTasks(&grunt-task-name&);,随着我们使用的任务的增加,这些载入任务的代码很快就会变得相当繁冗。在Grunt载入这些任务前,我们还可以指定设置选项。
现在我们需要创建我们的HTML文件(index.html):
&!DOCTYPE html&
&html lang=&en&&
&meta charset=&utf-8&&
&meta name=&viewport& content=&width=device- initial-scale=1.0; maximum-scale=1.0;&&
&title&Enter your first name&/title&
&link rel=&stylesheet& href=&build/css/master.css&&
&label for=&firstname&&Enter your first name&/label&
&input id=&firstname& name=&firstname& type=&text&&
&p id=&namevalidation& class=&validation&&&/p&
&script type=&text/javascript& src=&build/js/base.min.js&&&/script&
用HTMLHint验证HTML
在grunt.initConfig里加入下列设置代码:
htmlhint: {
options: {
'tag-pair': true,
'tagname-lowercase': true,
'attr-lowercase': true,
'attr-value-double-quotes': true,
'doctype-first': true,
'spec-char-escape': true,
'id-unique': true,
'head-script-disabled': true,
'style-disabled': true
src: ['index.html']
一般来说,一个plugin的设置方法如下:plugin的名称(去掉grunt-contrib-或grunt-前缀),选择使用此plugin的一个或多个对象(在这里可以给不同文件设置此plugin的不同选项),一个选项object,以及plugin要作用的对象。现在,如果我们用命令行工具运行grunthtmlhint,该plugin就会检查我们在src里指定的HTML文件,验证其中有没有错误!但是每个小时都要手动运行几次这个任务,很快就让人觉得很繁琐了。
自动化任务运行
watch是一个特殊的任务,它可以在目标文件保存时自动触发一系列任务的运行。在grunt.initConfig里加入以下设置:
files: ['index.html'],
tasks: ['htmlhint']
然后,在命令行工具中运行gruntwatch命令。现在,你可以试试在index.html里加一行注释,保存文件。你会注意到,保存文件时会自动触发HTML的验证!这是对开发流程的一大优化:在你写代码时,watch任务就会默默同时为你验证代码,如果验证失败任务就会报告失败(它还会告诉你问题在哪)。
注意gruntwatch任务会一直运行,直到命令行工具关闭,或手动停止(control+c在Mac中)。
保持JavaScript极简
让我们来写一个验证用户输入的名字的JavaScript文件。简便起见,我们这里只检查其中是否含有非字母的字符。我们的JavaScript会使用strict模式,这可以防止我们写可用但低质量的JavaScript。创建assets/js/base.js文件并在其中写上:
function Validator()
&use strict&;
Validator.prototype.checkName = function(name)
&use strict&;
return (/[^a-z]/i.test(name) === false);
window.addEventListener('load', function(){
&use strict&;
document.getElementById('firstname').addEventListener('blur', function(){
var _this = this;
var validator = new Validator();
var validation = document.getElementById('namevalidation');
if (validator.checkName(_this.value) === true) {
validation.innerHTML = 'Looks good! &img src=&/wp-includes/images/smilies/icon_smile.gif& alt=&:)& class=&wp-smiley&& ';
validation.className = &validation yep&;
_this.className = &yep&;
validation.innerHTML = 'Looks bad! &img src=&/wp-includes/images/smilies/icon_sad.gif& alt=&:(& class=&wp-smiley&& ';
validation.className = &validation nope&;
_this.className = &nope&;
让我们用UglifyJS来极简化这个源代码,在grunt.initConfig中加上以下设置:
'build/js/base.min.js': ['assets/js/base.js']
UglifyJS会替换所有的变量和函数名,剔除所有空白和注释,从而生成占据最小空间的JavaScript文件,对发布非常有用。同样地,我们需要设置一个watch任务来使用它,在watch的设置里加入以下代码:
files: ['assets/js/base.js'],
tasks: ['uglify']
从Sass源文件生成CSS
Sass对CSS相关工作非常有用,特别是在团队中。使用Sass可以大量减少代码量,因为Sass可通过变量、mixin函数生成CSS代码。Sass的具体使用方法并不在本教程探讨的范围内,所以如果你还不想使用Sass这样的CSS预处理器,可以跳过这一段。但我们这里会介绍一个很简单的用例,使用变量、一个mixin函数和Sass式CSS语法(SCSS)。
Grunt的Sassplugin需要使用Sassgem,为此你需要安装Ruby(OSX中已经预装了Ruby)。用以下命令你可以测试系统中是否已安装Ruby:
使用以下命令安装Sassgem:
gem install sass
根据系统设置的不同,你可能需要用sudo来运行此命令&&即sudogeminstallsass&&这里你会被要求输入管理者密码。安装好Sass,在assets文件夹里创建sass文件夹,并在其中创建文件master.sass,然后写上:
@mixin prefix($property, $value, $prefixes: webkit moz ms o spec) {
@each $p in $prefixes {
@if $p == spec {
#{$property}: $
-#{$p}-#{$property}: $
$input_field: #999;
$input_focus: #559ab9;
$validation_passed: #8aba56;
$validation_failed: #ba5656;
$bg_colour: #f4f4f4;
$box_colour: #
$border_style: 1
$border_radius: 4
background: $bg_
width: 720
padding: 40
margin: 80
background: $box_
box-shadow: 0 1px 3px rgba(0, 0, 0, .1);
border-radius: $border_
font-family: sans-
input[type=&text&] {
@include prefix(appearance, none, webkit moz);
@include prefix(transition, border .3s ease);
border-radius: $border_
border: $border_style $input_
width: 220
input[type=&text&]:focus {
border-color: $input_
outline: 0;
input[type=&text&],
.validation {
line-height: 1;
font-size: 1
padding: 10
margin-right: 20
input.yep {
border-color: $validation_
input.nope {
border-color: $validation_
color: $validation_
color: $validation_
你会注意到SCSS比起普通的Sass更像CSS。这个样式表使用了Sass的两个特性:mixin和变量。一个mixin根据给它的参数生成CSS代码块,很像函数。而一个变量可以用来定义一段CSS代码片段,然后在很多地方重用。变量对定义Hex颜色尤其有用,我们可以用它建立一个色表,然后在尝试不同设计时,只须修改一处代码,从而大大提高了效率。这里的mixin则用来给CSS3的apperance和transition等属性生成前缀,减少了冗余代码。编写一个很长的样式表文件时,任何减少代码量的方法,都会让团队中日后更新此样式表的人受益。
在Sass之外,grunt-cssc任务可以整合CSS文件中定义的样式规则,最大限度削减所生成的CSS文件中的重复内容。在中到大型项目中经常出现重复的样式规则,使用这个任务就很有益处。但是,由此生成的CSS文件也不一定就是最简的,所以我们还需要使用cssmin任务,它既能剔除所有空白,还能把颜色值替换为可能的最简形式(比如white会被替换为#fff)。在gruntfile.js中加入如下内容:
options: {
consolidateViaDeclarations: true,
consolidateViaSelectors: true,
consolidateMediaQueries: true
'build/css/master.css': 'build/css/master.css'
src: 'build/css/master.css',
dest: 'build/css/master.css'
'build/css/master.css': 'assets/sass/master.scss'
现在我们设置好了处理样式表的任务,还要让它们自动运行。Grunt自动创建了build文件夹来存放所有的发布用script、CSS和(如果这是一个完整的网站项目的话)压缩后的图片文件。这意味着assets文件夹里可以包含为开发而做的详细的注释文件甚至说明文档,而build文件夹里则只会包含极简化代码和优化压缩过的图像文件。
我们给CSS相关的工作定义一套新的任务,在gruntfile.js里的defaulttask下面加上以下内容:
grunt.registerTask('buildcss', ['sass', 'cssc', 'cssmin']);
现在,运行gruntbuildcss任务就会按顺序运行所有CSS相关的任务,比起分别运行gruntsass、gruntcssc然后gruntcssmin来,这样简洁多了。最后我们需要做的就是更新watch任务的设置,让这些CSS相关任务也能自动运行:
files: ['assets/sass/**/*.scss'],
tasks: ['buildcss']
这个路径可能看起来有点奇怪,它的用途是递归地遍历我们assets/sass文件夹里的所有文件和子文件夹,来查找.scss文件。如此一来,我们就可以创建任意多的.scss文件,而不需要在gruntfile.js里添加它们的路径。现在,你的gruntfile.js应该是下面这样:
module.exports = function(grunt){
&use strict&;
require(&matchdep&).filterDev(&grunt-*&).forEach(grunt.loadNpmTasks);
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
options: {
consolidateViaDeclarations: true,
consolidateViaSelectors: true,
consolidateMediaQueries: true
'build/css/master.css': 'build/css/master.css'
src: 'build/css/master.css',
dest: 'build/css/master.css'
'build/css/master.css': 'assets/sass/master.scss'
files: ['index.html'],
tasks: ['htmlhint']
files: ['assets/js/base.js'],
tasks: ['uglify']
files: ['assets/sass/**/*.scss'],
tasks: ['buildcss']
htmlhint: {
options: {
'tag-pair': true,
'tagname-lowercase': true,
'attr-lowercase': true,
'attr-value-double-quotes': true,
'doctype-first': true,
'spec-char-escape': true,
'id-unique': true,
'head-script-disabled': true,
'style-disabled': true
src: ['index.html']
'build/js/base.min.js': ['assets/js/base.js']
grunt.registerTask('default', []);
grunt.registerTask('buildcss', ['sass', 'cssc', 'cssmin']);
现在我们有了一个静态HTML页面,一个存放Sass和JavaScript源文件的assets文件夹,一个存放优化后的CSS和JavaScript的build文件夹,以及package.json文件和gruntfile.js文件。
至此你已经有了一个不错的基础来进一步探索Grunt。像之前提到的,一个非常活跃的开发者社区在为Grunt开发前端plugin。我建议你现在就到去看看那300个以上的plugin。
& 相关主题:
本文来源:如何自定义Grunt任务_百度知道
如何自定义Grunt任务
一、准备1. 新建一个目录g12. 新建package.json,放入g13. 新建Gruntfile.js,放入g1package.json{
&name&: &g1&,
&version&: &0.1.0&,
&author&: &@snandy&,
&homepage&: &&,
&devDependencies&: {
&grunt&: &~0.4.0&
}}4. cd进入g1,npm install安装grunt包这整个目录结构如下Gruntfile.js暂时空着。二、创建一个最简单的任务grunt.registerTask(taskName, [description,] taskFunction)taskName 任务名称,命令行里使用 grunt + taskNamedescription
任务的描述taskFunction 任务的实现Gruntfile.js里填入一下代码module.exports = function(grunt) {
grunt.registerTask('mytask', '一个最简单的任务演示,根据参数打印不同的输出.', function(arg1, arg2) {
if (arguments.length === 0) {
grunt.log.writeln('任务' + this.name + &, 没有传参数&);
} else if (arguments.length === 1) {
grunt.log.writeln('任务' + this.name + &, 有一个参数是& + arg1);
grunt.log.writeln('任务' + this.name + &, 有两个参数分别是& + arg1 + &, & + arg2);
});};注册了一个任务“mytask”,实现一个最简单的根据所传参数不同实现不同的打印输出,看运行结果我们需要进入命令行。进入到g1目录,输入 grunt mytask再输入 grunt mytask:snandy任务名后面加一个冒号就可以传参了再输入 grunt mytask:snandy:backus冒号间隔可以传多个参数三、一次创建多个任务grunt.registerMultiTask(taskName, [description,] taskFunction)可以看到参数是一样的,方法名不同。但使用方式却不太同,需要先初始化config,Gruntfile.js如下module.exports = function(grunt) {
grunt.initConfig({
t1: [1, 2, 3],
t2: 'hello world',
grunt.registerMultiTask('log', 'Log stuff.', function() {
grunt.log.writeln(this.target + ': ' + this.data);
});};进入g1目录,分别测试下输入 grunt,会依次执行三个子任务t1,t2,t3分别输入 grunt log:t1, grunt log:t2, grunt log:t3四、任务间通讯在一个任务内部可以调用另外一个任务,如下module.exports = function(grunt) {
grunt.registerTask('mytask', '一个最简单的任务演示,根据参数打印不同的输出.', function(arg1, arg2) {
if (arguments.length === 0) {
grunt.log.writeln('任务' + this.name + &, 没有传参数&);
} else if (arguments.length === 1) {
gru供袱垛惶艹耗讹同番括nt.log.writeln('任务' + this.name + &, 有一个参数是& + arg1);
grunt.log.writeln('任务' + this.name + &, 有两个参数分别是& + arg1 + &, & + arg2);
grunt.registerTask('default', '默认的任务', function() {
// 调用mytask
grunt.task.run('mytask:param1:param2')
})};进入命令行,输入grunt调用多个任务,以逗号分隔传给run方法即可,或者以数组形式grunt.registerTask('default', '默认的任务', function() {
grunt.task.run('mytask1', 'mytask2')
grunt.task.run(['mytask1', 'mytask2'])
其他类似问题
为您推荐:
自定义的相关知识
其他2条回答
1. 新建一个目录g1
2. 新建package.json,放入g1
3. 新建Gruntfile.js,放入g1
package.json
&name&: &g1&,
&version&: &0.1.0&,
&author&: &@snandy&,
&homepage&: &&,
&devDependencies&: {
&grunt&: &~0.4.0&
4. cd进入g1,npm install安装grunt包
这整个目录结构如下
Gruntfile.js暂时空着。
二、创建一个最简单的任务
grunt.registerTask(taskName, [description,] taskFunction)
taskName 任务名称,命令行里使用 grunt + taskName
description 任务的描述
taskFunction 任务的实现
Gruntfile.js里填入一下代码
module.exports = function(grunt) {
grunt.re...
1. 新建一个目录g1
2. 新建package.json,放入g1
3. 新建Gruntfile.js,放入g1
package.json
&name&: &g1&,
&version&: &0.1.0&,
&author&: &@snandy&,
&homepage&: &&,
&devDependencies&: {
&grunt&: &~0.4.0&
4. cd进入g1,npm install安装grunt包
这整个目录结构如下
Gruntfile.js暂时空着。
二、创建一个最简单的任务
grunt.registerTask(taskName, [description,] taskFunction)
taskName 任务名称,命令行里使用 grunt + taskName
description 任务的描述
taskFunction 任务的实现
Gruntfile.js里填入一下代码
module.exports = function(grunt) {
grunt.re...
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Posts - 95,
Articles - 0,
Comments - 600
lua?python?R?java?c/c++?javaScript?php?
23:01 by youxiachai, ... 阅读,
作为一个正在准备从java 后端转大前端,一直都有想着,在js 的世界里面有没有类似于maven或者gradle 的东西..然后,就找到了grunt 这玩意
Grunt是用来干什么的
诸如ant,maven,gradle,make 之流的,那么我们为什么要学这么一个工具了,我们用IDE编程不是好好的吗,要让人去学这么一个工具,那么必然要有这个工具能够为我们搞定什么的原因.
选择Grunt原因
管理我们的文件依赖
随心所欲的批处理任务
整合常用的前端工具,js混淆,文件合并压缩.
说了这么多,上面就是我们为什么要选择grunt.js 作为我们项目构建的工具,如果你没有任何项目构建的概念,我建议了就不要看有关grunt的任何资料了,包括本文.因为,你看不懂我接下来我要写东西,也看不懂任何有关grunt相关资料,所以,就不要浪费时间了.
让Grunt 干活
如果,你之前有接触过构建工具,或者你现在有项目构建的概念,那么任务(tasks)这个概念想必理解起来不会有太大的难度了.
创建我们第一个任务
只要在我们的Gruntfile.js 文件写上这么几句
module.exports = function (grunt) {
grunt.registerTask('test', 'my first tasks', function () {
grunt.log.write('Hello World!').ok();
接着我们只要在当前目录运行 grunt test
就能看到控制台输出
Hello World.
接下来咱们有个node 环境就可以想干嘛的就干嘛了..停住!如果只是这样,这跟我们写个shell脚本有什么区别呢?实际上grunt跟shell 脚本没什么区别,只是grunt有一个node 运行环境,可以比写shell脚本简单那么一些,如果你已经是shell脚本达人,我觉得没有再学grunt必要了.
任务的任务
有时候,我们有很多任务,不过这里任务,都可以归类为一中,我们就需要注册一个多任务来处理这种情况,例如,文件的操作就有,创建,打开,重命名,这些任务都可以归类为文件操作任务
module.exports = function (grunt) {
grunt.initConfig({
create: 'source file',
open: 'open file',
delete: 'delete file'
grunt.registerMultiTask('file', 'Log stuff.', function () {
grunt.log.writeln(this.target + ': ' + this.data);
这个时候我们运行的时候,就会看到如下接口
grunt file:create
create: &source file&
grunt file:open
open: &open file&
grunt file:delete
delete: &delete file&
那么在我们自定义多任务的时候,可以通过this.target 获得当前任务命令,然后通过this.data 获取到我们的配置值,接下来就是发挥你的想象力的时候了.
实际上grunt不是什么神奇的时候,它最不过是一个运行在node的一个命令行工具,可以方便我们用js写脚本而已.
grunt-contrib-watch
监听文件修改
grunt-curl
想curl 下载远程js
grunt-contrib-clean
文件清理工具
grunt-contrib-cssmin
css压缩工具
grunt-contrib-copy
文件复杂工具
generated by

我要回帖

更多关于 grunt 执行任务 的文章

 

随机推荐