前端自动化,这样的一个名词听起来非常的有吸引力,向往力。当今时代,前端工程师需要维护的代码变得及为庞大和复杂,代码维护、打包、发布等流程也 变得极为繁琐,同时浪费的时间和精力也越来越多,当然人为的错误也随着流程的增加而增加了更多的出错率。致使每一个团队都希望有一种工具,能帮助整个团队 在开发中能精简流程、提高效率、减少错误率。随之讨论自动化部署也越来越多,并且国内很多大型团队也都有自己成熟的自动化部署工具。据我所知,百度有 FIS,腾讯有Modjs,360有燕尾服,还有很多团队在使用Ant,Shell等,而现在讨论较多的是Grunt

出于对这方面的兴趣爱好,我也开始加入Grunt的使用大军,也开始在学习并尝试使用Grunt。那么从今天开始,我和大家将一起学习和使用Grunt。

Grunt是什么

Grunt是一个基于JavaScript上的一个很强大的任务管理器(task runner),或许这么一说让很多人觉得费解,简单来说就是你可以在你的终端机上,用JavaScript去执行一些程序来完成一些任务。比如说验证 HTML、CSS、JavaScript的语法,压缩CSS、JavaScript、图像,Sass、LESS和Stylus编译成CSS等等,这些东西 佛教徒吧很适合用Grunt来解决。

Grunt其实就是一个基于NodeJS,可用于自动化构建、测试、生成文档的项目管理工具。他可以更好的帮助一个团队更好的提高效率、减少错误率。

简单点来说,Grunt不仅仅是构建工具,实际上他只是任务运行器,管理每个子任务的自动化运行,我们还能使用他做更多东西。

为什么要用Grunt

或许有很多要都像我一样,会问“为什么要用Grunt”?其实用一句话可以概括出来:为了自动化。对于前端项 目,为了明确模块分工,我们可以会将JavaScript、CSS代码拆解成很多个模块,他们都有独立的一个个文件,但这样一来用来页面上,增加了文件个 数,同时也产生过多的Http请求,可从性能的角度来考虑,不利于页面优化。所以我们需要合并这些JavaScript和CSS文件。这样一来,也期望有 一种工具能代替我们手工操作,去完成这些任务。

大家都非常清楚,在项目发布之前,我们都需要做一个步骤,那就是尽可能的将项目中的文件进行尽可能压缩,比如JavaScript、CSS、 images甚至是HTML文件,主要目的是减小加载文件的带宽。另外,在很多情况为了安全性考虑,我们需要对我们项目的源代码做一些单元测试和回归测 试。然而这些工作都是一些重复性的、乏味的工作。对于一个小型项目来说,或许没有太大的感觉,但对于一个大中型的项目,特别的参与人员过多的项目时,这些 工作就显得更重要了。同时让大家更觉得自动化工具是多么的重要。

Grunt能做什么

Grunt就是一个工具箱,就像一个百宝箱,拥有非常丰富的任务插件,可以帮助开发人员实现各式各样的构建目标。

在Grunt工具箱中,按任务目标我们可以分为:

  • 编译文档型:比如编译LESS、Sass、Stylus、Coffeescript等;
  • 文件操作型:比如说合并、压缩JavaScript、CSS、图片等;
  • 质量保障型:比如JSHint、Jasmin、Mocha等;
  • 类库构建型:比如说Backbone.js、ember.js、angular.js等。

这些任务都依赖于给Grunt提供的插件来完成的,但很多工作依旧需要在命令终端手工输入命令来完成这些操作。为此在Grunt中可以使用watch任务来实现一些监听文件改变、自动触发构建等功能。从而减少人工去每次操作任务。

运行Grunt需要什么?

前面也说过,Grunt是基于Node.js基础上运行的。需要能正常运行Grunt,必先在你的系统上正确安装Node.jsNPM

如果你从未接触过node.js并不用太担心,只需要根据教程可以很容易帮助您在系统上安装Node.js。

环境好了之后,可以通过终端命令中安装grunt运行工具:

$ npm install -g grunt-cli

Grunt的运行工具具有两个版本,一个是服务器端的版本(grunt),另一个是客户端版本(grunt-cli)。而我们在项目中需要安装的是客户端版本。也就是上面所示的安装命令。这条命令将会把grunt命令植入到你的系统路径中,这样就允许你从任意目录来运行它(定位到任意目录运行grunt命令)。

一个Grunt项目还有两个文件特别的重要:package.jsonGruntfile.js,前者用于Nodejs包管理,比如Grunt插件安装,后者是Grunt配置文件,配置任务或者自定义任务。

  • package.json:这个文件被用来存储已经作为npm模块发布的项目元数据(也就是依赖模块)。你将在这个文件中列出你的项目所依赖的Grunt(通常我们在这里配置Grunt版本)和Grunt插件(相应版本的插件)
  • Gruntfile.js:通常这个文件被命名为Gruntfile.js或者Gruntfile.coffee,它是用于配置或者定义Grunt任务和加载Grunt插件的。

值得注意的是,package.jsonGruntfile.js两个文件都放置在项目的根目录中,并且应该与项目的源代码一起被提交。

创建package.json的方式

package.json是一个JSON文件,而这个文件是每个Grunt项目必备的文件,因此在首要条件需要先创建这个文件。创建package.json文件方式有很多种:

  • 根据grunt-init模板自动创建一个特定的package.json文件;
  • 在命令终端通过npm init命令自动创建一个基本的package.json文件;
  • 官网上复制或者下载一个package.json文件;
  • 手工创建一个package.json文件;
  • 在Grunt项目的根目录下运行npm install创建一个空的package.json文件(不过我没有成功过,一直有错误信息提示,不知道是不是我的系统还是node环境有问题,正在查找中)

package.json文件模板

我采用了一种最简单的方式——手工创建package.json文件。而这个文件又是Grunt项目中必备文件之一,因此如何创建package.json文件内容就非常的重要,那么这里,向大家显示一个最简单的package.json文件模板:

{
"name":"项目名称",
"version":"项目版本号",
"description":"项目描述",
"author":"项目创建者",
"license":"项目版权",
"devDependencies": {
//项目依赖插件
}
}

我们来看看一个测试项目的package.json文件中的真正内容:

{
"name": "testGrunt",
"version": "0.1.0",
"description": "this is test project with grunt.",
"author": "airen",
"license": "BSD",
"devDependencies": {
"grunt": "~0.4.1"
}
}

可以手动在package.json中添加Grunt的插件,也可以通过以下命令的方式向package.json文件中添加:

$ npm install grunt插件名 --save-dev

这不仅会在本地安装Grunt插件,它还会使用一个波浪形字符的版本范围自动将所安装的Grunt插件添加到项目依赖中。

例如使用下面的命令可以把最新版本的Grunt安装到你的项目中,并自动将它添加到你的项目依赖中:

$ npm install grunt --save-dev

特别声明:使用这个命令,在我的环境中没有成功过,希望有知道原因的朋友能告诉我,下面是报错信息:

npm ERR! Error: Invalid name: "testGrunt"
npm ERR! at ensureValidName (/usr/local/lib/node_modules/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/fixer.js:281:15)
npm ERR! at Object.module.exports.fixNameField (/usr/local/lib/node_modules/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/fixer.js:196:5)
npm ERR! at /usr/local/lib/node_modules/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/normalize.js:29:38
npm ERR! at Array.forEach (native)
npm ERR! at normalize (/usr/local/lib/node_modules/npm/node_modules/read-package-json/node_modules/normalize-package-data/lib/normalize.js:28:15)
npm ERR! at final (/usr/local/lib/node_modules/npm/node_modules/read-package-json/read-json.js:310:33)
npm ERR! at then (/usr/local/lib/node_modules/npm/node_modules/read-package-json/read-json.js:124:33)
npm ERR! at /usr/local/lib/node_modules/npm/node_modules/read-package-json/read-json.js:284:48
npm ERR! at fs.js:207:20
npm ERR! at Object.oncomplete (fs.js:107:15)
npm ERR! If you need help, you may report this log at:
npm ERR! <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR! <npm-@googlegroups.com> npm ERR! System Darwin 13.0.0
npm ERR! command "node" "/usr/local/bin/npm" "install" "grunt" "--save-dev"
npm ERR! cwd /Users/airen/Sites/grunt/testGrunt
npm ERR! node -v v0.10.13
npm ERR! npm -v 1.3.2
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR! /Users/airen/Sites/grunt/testGrunt/npm-debug.log
npm ERR! not ok code 0

创建Gruntfile.js文件

package.json文件搞定之后,就可以在项目根目下创建Gruntfile.js文件,这个时候你可以使用grunt-init或者直接手工创建一个。我们先来看一个Gruntfile.js的文件模板:

module.exports = function(grunt){
// 构建任务配置
grunt.initConfig({
//读取package.json的内容,形成个json数据
pkg: grunt.file.readJSON('package.json'), //Grunt 任务配置
}); //加载Grunt插件
grunt.loadNpmTasks('Grunt插件名'); //默认的Grunt任务
grunt.registerTask('default',['Grunt任务']);
};

我们来看一个简单的示例:

module.exports = function(grunt) {
// 构建任务配置
grunt.initConfig({
//读取package.json的内容,形成个json数据
pkg: grunt.file.readJSON('package.json'),
uglify: {
//文件头部输出信息
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
},
//具体任务配置
build: {
//源文件
src: 'src/hello-grunt.js',
//目标文件
dest: 'build/hello-grunt-min.js'
}
}
});
// 加载指定插件任务
grunt.loadNpmTasks('grunt-contrib-uglify');
// 默认执行的任务
grunt.registerTask('default', ['uglify']);
};

到此,Grunt项目所需的package.jsonGruntfile.js文件都算是创建完成。有了这两个文件之后,Grunt项目算是万事具备,只欠东风了。你只需要在你的Grunt项目下运行:

$ npm install

执行完后,你将会在你的命令终端看到一大串类似于下面的一些信息:

...
npm http 200 https://registry.npmjs.org/source-map/-/source-map-0.1.31.tgz
npm http GET https://registry.npmjs.org/wordwrap
npm http GET https://registry.npmjs.org/amdefine
npm http 304 https://registry.npmjs.org/amdefine
npm http 304 https://registry.npmjs.org/wordwrap
grunt@0.4.1 node_modules/grunt
├── which@1.0.5
├── dateformat@1.0.2-1.2.3
├── eventemitter2@0.4.13
├── colors@0.6.2
├── hooker@0.2.3
├── async@0.1.22
├── coffee-script@1.3.3
├── underscore.string@2.2.1
├── findup-sync@0.1.2 (lodash@1.0.1)
├── iconv-lite@0.2.11
├── lodash@0.9.2
├── nopt@1.0.10 (abbrev@1.0.4)
├── rimraf@2.0.3 (graceful-fs@1.1.14)
├── glob@3.1.21 (inherits@1.0.0, graceful-fs@1.2.3)
├── minimatch@0.2.12 (lru-cache@2.3.1, sigmund@1.0.0)
└── js-yaml@2.0.5 (esprima@1.0.4, argparse@0.1.15) grunt-contrib-uglify@0.2.5 node_modules/grunt-contrib-uglify
├── grunt-lib-contrib@0.6.1 (zlib-browserify@0.0.1)
└── uglify-js@2.4.1 (uglify-to-browserify@1.0.1, async@0.2.9, source-map@0.1.31, optimist@0.3.7)

这个时候表示你的Grunt项目创建完成。你的项目结构也将变化成:

|--testGrunt
|----Gruntfile.js
|----node_modules
|--------grunt
|--------grunt-contrib-uglify
|----package.json

这里演示的仅仅是一个简单的示例,给大家对Grunt有一个初步的认识,在接下来,我将和大家一起探讨有关于Grunt更多的应用,希望对大家有所帮助。

Grunt教程——初涉Grunt的更多相关文章

  1. Grunt教程——安装Grunt

    Grunt教程--安装Grunt 作者:大漠 日期:2013-11-04 点击:3124 tools grunt 在上一节<Grunt教程--初涉Grunt>一文中介绍了Grunt是什么, ...

  2. 前端自动化Grunt教程

    最近在学习Bootstrap,了解一部分之后,发现Bootstrap使用了LESS,好嘛,开始学习LESS,LESS了解部分,发现自动编译工具Grunt,了解Grunt过程发现需要使用node.js的 ...

  3. 安装好grunt,cmd 提示"grunt不是内部或外部命令" 怎么办?

    Grunt和所有grunt插件都是基于nodejs来运行的,因此,必须安装node.js. (一) 去官网http://nodejs.org/ 下载安装包 node-v6.9.2.msi,直接点击安装 ...

  4. 【Grunt】关于Grunt可视化的尝试

    使用Grunt遇到的问题? 必须要安装NodeJS 必须安装grunt-cli 需要编写复杂的Gruntfile.js规则 每个项目中必须存在nodejs的grunt模块 不方便管理每一个包含grun ...

  5. grunt 入门 应用grunt对代码进行压缩

    1.什么是grunt grunt的官方解释是:javascript世界的构建工具. 为何要构建工具? 一句话:自动化.对于需要反复重复的任务,例如压缩(minification).编译.单元测试.li ...

  6. bootstrap之编译CSS和Javascript-0基础安装grunt教程

    昨天晚上看到 bootstrap 全局CSS样式中 使用Less 章节中提到的通过grunt重新编译CSS和Javascript文件,对于我这样从未接触过windows cmd node控制台 npm ...

  7. grunt教程

    https://blog.csdn.net/sinat_38992528/article/details/79400595

  8. grunt入门之grunt watch的使用

    watch几乎是grunt必不可少的应用,一旦配置好watch,保存文件后将立即执行命令 安装方式如下: npm install grunt-contrib-watch --save-dev 安装好以 ...

  9. “Fatal error: Unable to find local grunt.” when running “grunt” command

    下载到本地 >npm install grunt >grunt 命令行运行:grunt,出现以下问题: 这些是Gruntfile.js中引用的,依次安装: npm install grun ...

随机推荐

  1. Codeforces 390A( 模拟题)

    Inna and Alarm Clock Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64 ...

  2. [MAC] mac系统如何显示和隐藏文件

    转载地址: http://www.cnblogs.com/lm3515/archive/2010/12/08/1900271.html 显示Mac隐藏文件的命令:defaults write com. ...

  3. How to Optimize Battery Health?

    1. click on the battery icon from taskbar next to the date and time. 2. click "More power optio ...

  4. 强制JSP页面刷新,防止被服务器缓存(可用于静态include强制刷新)

    对于jsp页面,为了防止页面被服务器缓存.始终返回同样的结果. 通常的做法是在客户端的url后面加上一个变化的参数,比如加一个当前时间. 我现在使用的方法是在jsp头部添加以下代码: <%    ...

  5. mac平台下面nodejs环境搭配

    方法一(pkg方式:下载链接http://nodejs.org/dist/v0.12.4/node-v0.12.4.pkg): 官网:https://nodejs.org/download/ 例子: ...

  6. 神经网络:多层网络与C++实现

    相关源码可参考最新的实现:https://github.com/ronnyyoung/EasyML ,中的neural_network模块,后持续更新,包括加入CNN的结构. 一.引言 在前一篇关于神 ...

  7. C++的那些事:数据与类型

    一.前言 最近在看C++Primer第5版,先前已经看过第4版,但是发现第5版在整个知识布局与个别知识的讲解上跟第4版差别还是挺大的,尤其是新增了C++11的内容,正如孟岩老师在第5版前言中所讲:“现 ...

  8. C++Premer Plus学习(五)——函数探幽

    一.内联函数 1.优点: 内联函数就是比较省资源,然后一般就是将简短,使用频率高的函数作为内联函数会比较合适. 2.一个demo #include "stdafx.h" #incl ...

  9. ScrollView与ListView的冲突

    众所周知ListView与ScrollView都具有滚动能力,对于这样的View控件,当ScrollView与ListView相互嵌套会成为一种问题: 问题一:ScrollView与ListView嵌 ...

  10. 我与C++的不解情缘

    我是一个老实人,我当时报考C++真的全心是为了自己自考的免考,绝不是为了什么二级证,可是,进行到一半的时候,突然获悉,C++自我们这次开始,不作为免考科目了,当时我的心里啊,那个纠结,那个痛啊,随后, ...