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插件。你需要安装Ruby
,Sass
和Compass
才能安装正常运行。
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)