如果你还不了解grunt,或者只是听过它的名字而没有去研究过它,那么这篇入门级的文章就是为你写的,相信看完你就会爱上grunt!

grunt是什么?

grunt是一个非常好的自动化工具,你只管codeing,它会自动帮你将代码合并(concat)、压缩(uglify)、语法检查(jshint)、自动编译less(contrib-less)和sass(contrib-sass)、压缩图片(contrib-imagemin)、读写拷贝移动文件等等,极大地简化了你的工作,它有很多插件,前面说到的每个功能都是一个插件,如果没有符合你胃口的插件,你可以自己开发并提交到这里

要使用grunt,从哪里开始?

OK,相信grunt提供的某些功能还是能吊起你的胃口,grunt和grunt的插件都是通过npm安装和卸载的,npm是Nodejs的包管理器,所以我们首先安装nodejs,有同学在这里就被吓到了,nodejs我完全不会啊,接下来还看得懂吗?放一万个心,完全没问题。安装nodejs很简单,打开nodejs官网,戳中间那个INSTALL按钮就好。安装好了之后打开命令行,不要告诉我你不知道什么叫命令行?OK,按下快捷键win+r键,输入cmd回车,出现一个黑黑的窗口,输入node -v回车之后会显示你刚刚安装好的nodejs版本,那就表示nodejs安装成功了,恭喜你完成了第一步!

接下来需要安装CLI,这是个什么鬼?为什么要装它?不爱问为什么的同学不是好同学。OK,CLI就是grunt的命令行,安装了CLI之后,就可以在任何目录下执行grunt命令了。什么是grunt命令?请继续往下看。

安装CLI命令:

npm install -g grunt-cli

执行完之后

接下来要讲的内容,是一个项目刚刚开始用grunt管理的时候应该怎么去做,就好像你学会了grunt,现在想将grunt应用到手上的项目中去。我们在E盘建一个demo文件夹,这个demo就好比你手上的项目。

首先在项目的根目录下(也就是demo下)新建两个文件:package.json 和 Gruntfile.js。

package.json里面放些什么东西呢?什么项目名称啊、版本号啊、描述之类的,当然最重要的是将项目所用到的grunt插件放到它的devDependencies字段内,它大概长这样:

{
"name": "demo",
"version": "1.0.0",
"description": "这就是个demo",
// 项目用到的grunt插件列表及插件版本号
"devDependencies": {"grunt": "^0.4.5",
"grunt-contrib-concat": "~0.3.0","grunt-contrib-copy": "^0.8.0",
"grunt-contrib-jshint": "^0.11.2",
"grunt-contrib-requirejs": "~0.4.1",
"grunt-contrib-uglify": "~0.2.1",
"grunt-contrib-watch": "^0.6.1"
}
}

当然了,如果你知道插件的版本号,可以直接写在这里面,如果不知道,可以在安装插件的时候在命令行后面加一个命令“--save-dev”让它自动保存在这里。

Gruntfile.js是用来配置grunt任务的,它还可以用来加载grunt插件。看到这里不明白不要紧,后面还会说。

配置好了package.json,回到命令行,切换到demo根目录下(怎么切换?直接输入E:然后回车就切换到E盘了,然后输入cd demo回车就打开demo目录),执行下面的命令会自动安装package.json里配置的grunt插件,现在知道package.json的用处了吧,执行命令前先把package.json里那句注释去掉,不然会报错

npm install

安装完后,demo里面会多出来一个node_modules文件夹,里面就是刚刚安装的grunt插件了

OK,安装步骤到这里结束,下面开始真正使用grunt的阶段了。

任务配置——文件合并

什么是任务?每个grunt插件都是一个任务,安装了上面那么些插件,都有些什么用?先来看第一个插件"grunt-contrib-concat",它是用来合并文件的,下面看看它怎么用的吧。

先在demo下新建一个src文件夹,在里面新建3个js文件分别叫a.js、b.js和c.js;3个文件内容分别是:

// a.js内容
function aaa(){
return "aaa";
}
// b.js内容
function bbb(){
return "bbb";
}
// c.js内容
function ccc(){
return "ccc";
}

那么怎么用插件"grunt-contrib-concat"来合并这3个文件呢?请在Gruntfile.js里面写入下面的内容:

module.exports = function(grunt) {
// 任务配置
grunt.initConfig({
// 配置concat任务
concat: {
options: {
// 配置合并的文件内容之间的分隔符
separator: ';'
},
dist: {
// 要合并的文件
src: ['src/a.js', 'src/b.js', 'src/c.js'],
// 合并为哪个文件
dest: 'dist/all.js'
}
}
});
// 加载插件
grunt.loadNpmTasks('grunt-contrib-concat');
}

保存之后在命令行里输入grunt concat回车,命令行输出“File 'dist/all.js' created”就表示文件合并成功了!就这么简单!

demo文件夹下会多出一个dist文件夹,里面就是合并好的文件all.js

到这一步你已经学会了grunt的基本用法了,其它任务也都是两步:一配置任务,二调用任务执行,而且任务配置好了以后只要调用命令执行就好了,一劳永逸啊。

也许你还不太理解上面Gruntfile.js的配置怎么来的?Gruntfile.js包括四个部分:

  • "wrapper" 函数
  • 任务配置
  • 加载grunt插件和任务
  • 自定义任务

从上面的配置已经可以看得很清楚了,最外层的函数就是"wrapper"函数,任务配置即grunt.initConfig({……})这一段,grunt.loadNpmTasks(插件名称)用于加载grunt插件和任务的,最后一个自定义任务在哪呢?

自定义任务:grunt.registerTask(taskName,description,taskFunction)接收三个参数,第一个是任务名称,第二个是任务描述,第三个是任务执行时执行的函数。当第二个参数是数组时,数组内可以传入其它任务名称,当执行自定义任务时,就会执行数组内的任务。

任务配置里面配置了哪个任务,那么下面就要用grunt.loadNpmTasks加载对应的插件,这里配置的是concat这个任务,因此下面对应加载grunt-contrib-concat插件。任务配置是以任务名称命名的属性,grunt.initConfig中可以配置多个任务,每个任务的具体配置参数可以到这里找到对应的插件进行查看。

任务配置——代码压缩

接下来我们来配置多个任务,将合并后的js压缩,压缩js的插件"grunt-contrib-uglify"在package.json有配置过,在执行npm install命令的时候已经安装好了,下面开始配置:

module.exports = function(grunt) {
// 任务配置
grunt.initConfig({
// 配置concat任务
concat: {
options: {
// 配置合并的文件内容之间的分隔符
separator: ';'
},
dist: {
// 要合并的文件
src: ['src/a.js', 'src/b.js', 'src/c.js'],
// 合并为哪个文件
dest: 'dist/all.js'
}
},
    // 配置压缩任务
uglify: {
client: {
files:{
            // 压缩后js路径和要压缩的js路径(没错,这里是个数组,可以直接将多个js合并后压缩)
"dist/all.min.js": ["dist/all.js"]
}
}
}
});
// 加载插件
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
// 自定义任务
grunt.registerTask("build",["concat","uglify"]);
}

执行自定义任务build

grunt build

输出的all.min.js就是合并且压缩后的代码

任务配置——文件watch+自动编译less

最后,来做一个自动编译less的案例,这个案例需要用到watch插件和less插件,这俩插件之前没有安装,那么现在安装一下

npm install grunt-contrib-watch --save-dev
npm install grunt-contrib-less --save-dev

后面的“--save-dev”会将这个插件及其版本号保存到package.json。安装完成后在Gruntfile.js加入配置:

module.exports = function(grunt) {
// 任务配置
grunt.initConfig({
// 配置watch任务
watch: {
// 要监听的文件
files: ["less/index.less"],
// 监听的文件发生变化时执行的任务
tasks: ["less"]
},
less: {
development: {
options: {
// 是否压缩编译后的css
compress: true
},
files: {
// 编译后的css路径和要编译的less路径
"less/index.css": ["less/index.less"]
}
}
} });
// 加载插件
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-less');
// 自定义任务
grunt.registerTask("default",["watch"]);

执行任务

grunt

注意:因为配置里面自定义任务设置了default即默认任务为watch,所以命令行里输入grunt和grunt watch的效果是一样的。执行后,命令行输出

Running "watch" task
Waiting...

表示正在监听,切换到index.less去新增一些样式然后保存,watch监听到index.less有变化输出

Completed in 1.560s at Fri Jun 26 2015 23:41:22 GMT+0800 (中国标准时间) - Waitin
g...
>> File "less\index.less" changed.
Running "less:development" (less) task
File less/index.css created

同时执行了less编译任务,在less文件夹自动生成了index.css。以前用考拉(一个less编译软件)编译less,经常写了几行样式发现软件没有打开,换做grunt之后就方便多了。

以上就是本次要分享的全部内容了,是不是很轻松就入门了?如果本文对你有所帮助,麻烦点个赞吧!

grunt中文官网

by:王美建 from:http://www.cnblogs.com/wangmeijian/ 转载请保留署名及出处!

前端自动化grunt轻松入门的更多相关文章

  1. [前端自动化]grunt的简单使用

    前言 现在前端自动化已经是家常便饭,各种工具也是层出不穷,grunt.gulp.webpack是应用最广的三种工具,虽然grunt看似已垂垂老矣,但是以前写的很多项目一直用的就是grunt,温故方能知 ...

  2. 四、vue前端路由(轻松入门vue)

    轻松入门vue系列 Vue前端路由 七.Vue前端路由 1. 路由的基本概念与原理 后端路由 前端路由 实现简单的前端路由 vue-router基本概念 2. vue-router的基本使用 基本使用 ...

  3. gulp前端自动化构建工具入门篇

    现在我们通过这3个问题来学习一下: 1.什么是gulp? 2.为什么要用gulp? 3.怎么用?   什么是gulp 答:是一个前端自动化的构建工具,直白点说,如果没有这个工具,我们利用人工依旧可以做 ...

  4. 前端自动化-----gulp详细入门(转)

    简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以很愉快的编写代码 ...

  5. 前端自动化工具gulp入门基础

    gulp是前端开发过程中经常要用到的工具,非常值得花时间去掌握.利用gulp,我们可以使产品流程脚本化,节约大量的时间,有条不紊地进行业务开发.本文简单讲一下入门gulp需要掌握的东西. 安装gulp ...

  6. grunt轻松入门

    项目目录,js源文件 gruntest Gruntfile.js package.json -- js ext community_plugin.js glogin_frm_cover.js iLog ...

  7. 前端自动化Grunt教程

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

  8. 前端自动化开发之grunt

    上篇文章介绍了前端模块化开发工具seaJs,利用seaJs我们可以轻松实现前端的模块化编程,参见http://www.cnblogs.com/luozhihao/p/4818782.html 那么今天 ...

  9. 前端工作流程自动化——Grunt/Gulp 自动化

    什么是自动化 先来说说为什么要自动化.凡是要考虑到自动化时,你所做的工作必然是存在很多重复乏味的劳作,很有必要通过程序来完成这些任务.这样一来就可以解放生产力,将更多的精力和时间投入到更多有意义的事情 ...

随机推荐

  1. Atcoder Grand 012 C - Tautonym Puzzle

    题意: 构造一个字符串,使得这个字符串有只有n个形如AA这样的子序列. 神TM构造题不会做,, 我们构造一个长度为2*m的字符串,前m个是一个1-m的排列,后m个就是按顺序1-m. 这样这个串里符合要 ...

  2. 部署tms过程记录

    背景:工作中经常需要进行工程部署,将过程记录下来,减少不必要的时间浪费. 1 问题总结 dubbo服务启动注册报 java.net.UnknownHostException 未知的名称或服务解决办法 ...

  3. hdu3374解题报告

    hdu3374 Solution: 最小表示法+KMP 设一个字符串S的最小循环节是T.(如S=“abababab”,则T=“ab”) 在最小循环节T中,只有1个最小字符串和最大字符串.则最小字符串的 ...

  4. 用rem来做响应式开发(转)

    由于最近在做公司移动项目的重构,因为要实现响应式的开发,所以大量使用到了rem的单位,觉得这个单位有点意思.但是现在貌似用他的人很少.上一篇文章我分享了淘宝写的一篇rem的介绍,介绍的非常全面,但是他 ...

  5. Openstack 错误日志查看方法

    openstack错误日志查看方法 https://blog.csdn.net/ZanShichun/article/details/72672945

  6. C++委托模式

    希望想理解C++委托的同学,能够从代码中悟出其中的原理.有什么不太清楚的地方,欢迎留言交流. #include <bits/stdc++.h> using namespace std; # ...

  7. 数组指针与指针数组(good)

    数组指针和指针数组的区别 数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p ...

  8. Hbuild开发App入门

    http://ask.dcloud.net.cn/article/89建议必看网站 http://www.html5plus.org/doc/h5p.html  API下载地址

  9. 流媒体技术学习笔记之(八)海康、大华IpCamera RTSP地址和格式

    海康: rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream 说明: username: 用户名 ...

  10. Your Prediction Gets As Good As Your Data

    Your Prediction Gets As Good As Your Data May 5, 2015 by Kazem In the past, we have seen software en ...