Grunt 学习笔记【1】----基础知识

题记:虽然如今你们都在推Webpack,无奈业务须要,所以研究下Grunt。node

说明:本文是基于Grunt 0.4.5版本。git

一 说明

为什么要用构建工具?github

一句话:自动化。对于须要反复重复的任务,例如压缩(minification)、编译、单元测试、linting等,自动化工具能够减轻你的劳动,简化你的工做。当你在 Gruntfile 文件正确配置好了任务,任务运行器就会自动帮你或你的小组完成大部分无聊的工做。npm

为何要使用grunt?编程

Grunt 生态系统很是庞大,而且一直在增加。因为拥有数量庞大的插件可供选择,所以,你能够利用 Grunt 自动完成任何事,而且花费最少的代价。若是找不到你所须要的插件,那就本身动手创造一个 Grunt 插件,而后将其发布到 npm 上吧。先看看入门文档吧。json

二 快速入门

官网地址:https://www.gruntjs.net/getting-started数组

直接看官网就能够了。但涉及的知识点以下:app

2.1 CLI

Grunt命令行工具CLI。函数

做用:将其全局安装后,每次运行grunt 时,他就利用node提供的require()系统查找本地安装的 Grunt。正是因为这一机制,你能够在项目的任意子目录中运行grunt 。若是找到一份本地安装的 Grunt,CLI就将其加载,并传递Gruntfile中的配置信息,而后执行你所指定的任务。为了更好的理解 Grunt CLI的执行原理,请阅读源码grunt

npm install -g grunt-cli

注意:安装grunt-cli并不等于安装了 Grunt!Grunt CLI的任务很简单:调用与Gruntfile在同一目录中 Grunt。这样带来的好处是,容许你在同一个系统上同时安装多个版本的 Grunt。

2.2 建立一个简单的Grunt项目

1)package.json

此文件被npm用于存储项目的元数据,以便将此项目发布为npm模块。你能够在此文件中列出项目依赖的grunt和Grunt插件,放置于devDependencies配置段内。

package.json应当放置于项目的根目录中,与Gruntfile在同一目录中,而且应该与项目的源代码一块儿被提交。在上述目录(package.json所在目录)中运行npm install将依据package.json文件中所列出的每一个依赖来自动安装适当版本的依赖。

下面列出了几种为你的项目建立package.json文件的方式:

  • 大部分 grunt-init 模版都会自动建立特定于项目的package.json文件。

  • npm init命令会建立一个基本的package.json文件。

  • 复制下面的案例,并根据须要作扩充,参考此说明.

 1 {
 2   "name": "my-project-name",
 3   "version": "0.1.0",
 4   "devDependencies": {
 5     "grunt": "~0.4.5",
 6     "grunt-contrib-jshint": "~0.10.0",
 7     "grunt-contrib-nodeunit": "~0.4.1",
 8     "grunt-contrib-uglify": "~0.5.0"
 9   }
10 }

 配置好package.json文件后,执行npm install。

2) Gruntfile

此文件被命名为 Gruntfile.js 或 Gruntfile.coffee,用来配置或定义任务(task)并加载Grunt插件的。 此文档中提到的 Gruntfile 其实说的是一个文件,文件名是 Gruntfile.js 或 Gruntfile.coffee

 Gruntfile.js 或 Gruntfile.coffee 文件是有效的 JavaScript 或 CoffeeScript 文件,应当放在你的项目根目录中,和package.json文件在同一目录层级,并和项目源码一块儿加入源码管理器。

 1 module.exports = function(grunt) {
 2 
 3   // Project configuration.
 4   grunt.initConfig({
 5     pkg: grunt.file.readJSON('package.json'),
 6     uglify: {
 7       options: {
 8         banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
 9       },
10       build: {
11         src: 'src/<%= pkg.name %>.js',
12         dest: 'build/<%= pkg.name %>.min.js'
13       }
14     }
15   });
16 
17   // 加载包含 "uglify" 任务的插件。
18   grunt.loadNpmTasks('grunt-contrib-uglify');
19 
20   // 默认被执行的任务列表。
21   grunt.registerTask('default', ['uglify']);
22 
23 };

Gruntfile由如下几部分构成:

  • "wrapper" 函数

  • 项目与任务配置

  • 加载grunt插件和任务

  • 自定义任务

"wrapper" 函数

每一份 Gruntfile (和grunt插件)都遵循一样的格式,你所书写的Grunt代码必须放在此函数内:

module.exports = function(grunt) {
  // Do grunt-related things in here
};

项目和任务配置

大部分的Grunt任务都依赖某些配置数据,这些数据被定义在一个object内,并传递给grunt.initConfig 方法。

在下面的案例中,grunt.file.readJSON('package.json') 将存储在package.json文件中的JSON元数据引入到grunt config中。 因为<% %>模板字符串能够引用任意的配置属性,所以能够经过这种方式来指定诸如文件路径和文件列表类型的配置数据,从而减小一些重复的工做。

你能够在这个配置对象中(传递给initConfig()方法的对象)存储任意的数据,只要它不与你任务配置所需的属性冲突,不然会被忽略。此外,因为这自己就是JavaScript,你不只限于使用JSON;你能够在这里使用任意的有效的JS代码。若是有必要,你甚至能够以编程的方式生成配置。

与大多数task同样,grunt-contrib-uglify 插件中的uglify 任务要求它的配置被指定在一个同名属性中。在这里有一个例子, 咱们指定了一个banner选项(用于在文件顶部生成一个注释),紧接着是一个单一的名为build的uglify目标,用于将一个js文件压缩为一个目标文件。

 1 // Project configuration.
 2 grunt.initConfig({
 3   pkg: grunt.file.readJSON('package.json'),
 4   uglify: {
 5     options: {
 6       banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
 7     },
 8     build: {
 9       src: 'src/<%= pkg.name %>.js',
10       dest: 'build/<%= pkg.name %>.min.js'
11     }
12   }
13 });

加载 Grunt 插件和任务

像 concatenation、[minification]、grunt-contrib-uglify 和 linting这些经常使用的任务(task)都已经以grunt插件的形式被开发出来了。只要在 package.json 文件中被列为dependency(依赖)的包,并经过npm install安装以后,均可以在Gruntfile中以简单命令的形式使用:

1 // 加载可以提供"uglify"任务的插件。
2 grunt.loadNpmTasks('grunt-contrib-uglify');

自定义任务

经过定义 default 任务,可让Grunt默认执行一个或多个任务。在下面的这个案例中,执行 grunt 命令时若是不指定一个任务的话,将会执行uglify任务。这和执行grunt uglify 或者 grunt default的效果同样。default任务列表数组中能够指定任意数目的任务(能够带参数)。

1 // Default task(s).
2 grunt.registerTask('default', ['uglify']);

若是Grunt插件中的任务(task)不能知足你的项目需求,你还能够在Gruntfile中自定义任务(task)。例如,在下面的 Gruntfile 中自定义了一个default 任务,而且他甚至不依赖任务配置:

1 module.exports = function(grunt) {
2   // A very basic default task.
3   grunt.registerTask('default', 'Log some stuff.', function() {
4     grunt.log.write('Logging some stuff...').ok();
5   });
6 
7 };

特定于项目的任务没必要在 Gruntfile 中定义。他们能够定义在外部.js 文件中,并经过grunt.loadTasks方法加载。

参考资料&内容来源:

Grunt官网:https://www.gruntjs.net/

相关文章
相关标签/搜索