grunt由浅入深

Grunt是一个任务管理器,能大大提高您运行前端开发工作流程。使用大量的Grunt插件可以自动执行任务,例如编译Sass和CoffeeScript,优化图像和验证您的JavaScript代码与JSHint。
在过去你可能使用类似CodeKit或Hammer来处理这些任务。我认为这两种应用程序是伟大的(过去广泛的使用他们),但Grunt比他们更优秀,他可以定制任务。有很多插件可以帮助你优化图片和在你的工作流中加入CSS样式。
在这篇文章里你将学习如何设置Grunt和配置Compass & Sass,JSHint和CSS连接的任务。

一:安装Grunt CLI

我们第一件是要做的就是安装Grunt CLI。这是在你的项目上安装Grunt和加载Gruntfile.js(稍后详细介绍)。
Grunt和Grunt插件安装都需要使用npm,和Node.js包管理。如果你的机器上没有安装Node.js,可以访问下载页面为您的操作系统安装程序。按照安装向导中的步骤,你可以在任保时间启动并运行npm安装。
一旦你安装好了Node.js和npm,你可以安装grunt-cli
包。
npm install -g grunt-cli
使用-g标记安装grunt-cli表示全局安装,你可以在任何项目中使用这个命令。

创建package.json文件

现在,您已经完成了Grunt CLI安装,可以使用Grunt管理任务。
为了更好的管理项目的依赖关系,需要给项目创建一个package.json
package.json文件需要放置在你项目的根目录下。这文件定义了项目的数据,如项目名,版本和作者。package.json文件还负责项目任务所需的依赖关系。devDependencies属性定义了您的应用程序所需要的任务包。

{
  "name": "project-name",
  "version": "0.1.0",
  "author": "Your Name",
  "devDependencies": {
    "grunt": "~0.4.1",
    "grunt-contrib-jshint": "~0.6.3",
    "grunt-contrib-watch": "~0.5.3",
    "grunt-contrib-compass": "~0.6.0"
  }
}

注:这是一个非常基本的例子中的package.json文件。为了全面了所有属性,可以点击此处查阅。
一旦你创建好了package.json文件,你可以在终端如此头发下面的命令,安装任务所需要的依赖关系:

$ npm install

这个命令将获取所有的包,并把他们存储在项目根目录下的node_module目录中。你可能要在这个目录下添加.gitignore文件(或类似),这样才不至于将他们签入版本控制器中。确保你的package.json文件添加到你的版本控制器中,用来确保其他开发人员在将使用这个项目需要的安装包。
如果你想安装任务包,你可以在命令行中运行npm install
进行安装。你可以通过指定任务包安装你想要的任务。

$ npm install <module> --save-dev

使用--save-dev可以通过npm自动将任务包安装所需要依赖的关系添加到你的package.json文件中。安装之后确认更新你自己的文件。

在Gruntfile中定义任务

接下来你要在你的项目根目中创建一个叫Gruntfile.js文件。这个文件用来定义和配置你想在Grunt运行的任务。
我们来看一个例子,配置你的package.json文件中指定的Grunt插件。

module.exports = function(grunt) {

  // 项目配置
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    watch: {
      css: {
        files: [
          '**/*.sass',
          '**/*.scss'
        ],
        tasks: ['compass']
      },
      js: {
        files: [
          'assets/js/*.js',
          'Gruntfile.js'
        ],
        tasks: ['jshint']
      }
    },
    compass: {
      dist: {
        options: {
          sassDir: 'assets/sass',
          cssDir: 'assets/css',
          outputStyle: 'compressed'
        }
      }
    },
    jshint: {
      options: {
        jshintrc: '.jshintrc'
      },
      all: ['Gruntfile.js', 'assets/js/*.js']
    }
  });

  // 加载Grunt插件
  grunt.loadNpmTasks('grunt-contrib-compass');
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-jshint');

  // 注册grunt默认任务
  grunt.registerTask('default', ['watch']);
};

Wrapper函数

所有代码都必须放置在Gruntfile文件中的wrapper函数中。这个约定了Grunt所有插件在这里配置。

module.exports = function(grunt) {
 // 配置任务和插件
};

项目配置

第二部分是在Gruntfile中配置项目。这是通过grunt.initConfig方法来配置。这种方法通过一个对象来实现,其中包含了项目配置以及任务配置。
pkg.grunt.file.readJSON('package.json'),直接从之前创建的package.json文件导入配置数据。依赖关系中提供了插件的名称和版本。

grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),
  task: {...},
  task_two: {...}
});

配置任务

每个Grunt任务都在grunt.configInit
中有自己配置的信息。属性的名称包含了任务的配置,包括Grunt任务的名称和任务。
允许通过你的Gruntfile
文件配置运行指定的任务。
**watch
**任务是用来监控文件被改变时执行的任务。这个任务是有用的,例如,Sass文件修改保存后保存,这个任务会自动监控,将Sass文件编译成CSS文件。具体的配置如下:

watch: {
  css: {
    files: [
      '**/*.sass',
      '**/*.scss'
    ],
    tasks: ['compass']
  },
  js: {
    files: [
      'assets/js/*.js',
      'Gruntfile.js'
    ],
    tasks: ['jshint']
  }
},

在这个任务中,我们指定了两个不同的子任务。一个是处理Sass文件发生的变化,另一个是处理JavaScript文件发生的变化。files属性用来监控任务中指定的两种目标文件。你可以使用*
来匹配文件列表中的每个文件。tasks属性定义了Grunt任务的数组,执行改变项目目标中的文件。
Gruntfile使用了grunt-contrib-compass插件来编译Sass,你也可以添加Compass。如果你不使用Compass,还有一个Sass插件。你需要安装RubySassCompass才能安装正常运行。

compass: {
  dist: {
    options: {
      sassDir: 'assets/sass',
      cssDir: 'assets/css',
      outputStyle: 'compressed'
    }
  }
},

配置Compass插件非常简单。里面的options属性定义了Sass文件的目录和你想编译出来的CSS文件目录。outputStyle
属性指定了Sass代码要如何编译。指定compressed
值,编译出来的CSS将被压缩。
接下来,我们看看JSHint任务。如果你之前没有使用过,现在告诉你,JSHint是一个很好的工具,可以检测你的JavaScript代码是否有错误。它也可以用来帮助你统一代码风格,以便你的代码易于阅读,方便团队更好的做一个项目。

jshint: {
  options: {
    jshintrc: '.jshintrc'
  },
  all: ['Gruntfile.js', 'assets/js/*.js']
}
```
这里的`all`属性用于指定哪些文件用JSHint来检查。再次使用通配符(*)来指定选择`assets/js`目录下的所有JavaScript文件。

你可以指定`options`属性,指定JSHint应该运行的`options`属性。你可以直接在`Gruntfile`文件中列出这些选项或者把他们提出来放到一个`.jshintrc`文件中。

这里有一个简单的`.jshintrc`文件的示例,他看起来像这样:
```
{
  "node": true,
  "esnext": true,
  "curly": false,
  "smarttabs": true,
  "indent": 2,
  "quotmark": "single",
  "globals": {
    "jQuery": true
  }
}
```

**注意:**有关于JSHint中所有的选项列表,可以查阅[文档](http://www.jshint.com/docs/options/)。
在本节中我们只触及了我们所使用的Grunt任务的一些基本配置。更多的信息可以查看每个插件的文档。
 [Watch文档](https://github.com/gruntjs/grunt-contrib-watch)
 [Compass文档](https://github.com/gruntjs/grunt-contrib-compass)
 [JSHint文档](https://github.com/gruntjs/grunt-contrib-jshint)

###加载插件

第二部分在`Gruntfile.js`文件中加载你想使用的Grunt插件。这些插件需要在你的`package.json`文件中指定和使用`npm install`来安装。如果你试图运行没有安装的Grunt插件,将会报错。
```
// 加载Grunt插件
grunt.loadNpmTasks('grunt-contrib-compass');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-jshint');
```
###注册默认任务
`grunt.registerTask`方法用来指定一个运行Grunt任务的默认组,当你运行`grunt`命令行会执行这指定的默认任务。
```
// 注册默认的任务
grunt.registerTask('default', ['watch']);
```
该方法的第一个参籹指定任务的名称(如本例中的`default`),第二个参数用来指定你希望执行的默认任务的组合。在前面的`watch`任务中我们定义了监测`compass`和`jshint`任务,所以我们只要在这里执行`watch`任务。
###运行Grunt
Grunt这些配置是非常强大的,但你如何在实际中运行Grunt呢?
在你的终端执行`grunt`命令,将会执行在`default`任务中指定的所有任务。
你也可以通过`grunt`后加对应的任务名,执行单独的任务:
```
grunt //运行指定的默认任务
grunt compass //仅仅执行compass任务
```
###添加新的插件
现在您已经了解如何设置和运行Grunt,让我们添加另一个插件[CSS样式注入](http://css-tricks.com/style-injection-is-for-winners/)。这是一个很整洁的工具,更新浏览器中的CSS而无需刷新页面。
先要安装`grunt-browser-sync`任务包.使用`--save-dev`自动将插件插入`package.json`文件中。
```
npm install grunt-browser-sync --save-dev
```
你也需要在`Gruntfile`文件中加载插件:
```
grunt.loadNpmTasks('grunt-browser-sync')
```
接下来在`Gruntfile.js`文件中添加`browser_sync`任务的配置。指定了CSS文件应该被注入到的页面中。这个插件也可以处理图像、JavaScript和模板文件。然而,这些将触发一个完整的页面刷新。
```
browser_sync: {
  files: {
    src : [
      'assets/css/*.css',
      'assets/img/*',
      'assets/js/*.js',
      '**/*.html'
    ],
  },
  options: {
    watchTask: true
  }
},
```

这个`watchTask`选项设置为true
,因为我们使用了`watch`插件。因为我编译Sass,我们需要确认任何任务执行的顺序是正确的。否则浏览浏览器加入的CSS是`compass`任务之前生成的CSS文件。
**注意:**浏览器同步在测试跨设备变得更明显,更强大。插件将决定网络的IP地址,可以跨设备同步工作。然而,如果你使用的是自定义域名或浏览器同步找不到正确的IP地址,您可以指定`host`主机。
```
host: 'treehouse.dev'```
接下来,你需要更新默认任务,里面指定`browser_sync`任务。

```
grunt.registerTask('default', ['browser_sync', 'watch']);```

使用[WebSockets](http://blog.teamtreehouse.com/an-introduction-to-websockets)将消息发送到浏览器,触发样式的注入或页面的更新,实现浏览器同步。如果你第一次执行`grunt`命令,将会给您的HTML添加两行代码,用来创建WebSocket连接。
```
<script src='http://YOUR_HOST:3000/socket.io/socket.io.js'></script>
<script src='http://YOUR_HOST:3001/browser-sync-client.min.js'></script>```

你已经完成了!您现在能够更新你的CSS、JavaScript和HTML文件,自动在浏览器中更新页面。每次修改文件不需要手动刷新浏览器窗口真爽。



-----------
英文原文:[http://blog.teamtreehouse.com/getting-started-with-grunt](http://blog.teamtreehouse.com/getting-started-with-grunt)
中文译文:[http://www.w3cplus.com/tools/getting-started-with-grunt.html](http://www.w3cplus.com/tools/getting-started-with-grunt.html)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容