GruntJS学习(转)
GruntJS 是基于JavaScript的命令行构建工具,它可以帮助开发者们自动化重复性的工作。你可以把它看成是JavaScript下的Make
或者Ant
。它可以完成诸如精简、编译、单元测试、lint检查等工作。由于越来越多的开发移到了客户端,帮助开发者更高效地工作的工具就更有用了。本文中,我将展示我如何使用GruntJS来精简javascript文件。我们也将使用GruntJS的markdown插件来将markdown文档转换为HTML5文档。让我们开始吧!
为什么开发者要关心GruntJS?
主要的原因是开发者经常寻找自动化日常任务的方法,这有助于将出错的几率降到最低。手工从事重复无聊的任务的时候,我们很容易犯错。
GruntJS依赖
GruntJS要求 NodeJS 0.8.0以上版本。我们将使用 npm 包管理器来安装 GruntJS 和它的插件。新版的NodeJS默认包含 NPM 包管理器。可从官网下载最新版的 NodeJS。
GruntJS起步
在开始之前,我们需要理解Grunt的三大主要组成部分:
1. GruntJS CLI
GruntJS提供了GruntJS命令行工具。下面会提到安装 GruntJS CLI 的命令。如果你在安装时遇到错误信息,那么你可能需要 sudo 权限来运行这个命令。
npm install grunt-cli -g
上面的命令将全局安装 grunt-cli
包,这样在任何目录下都可以调用grunt
命令。GruntJS CLI不包括grunt task runner。要使用 grunt task runner,我们需要将其作为应用的开发依赖安装。grunt
和grunt-cli
的分离确保每个团队的成员使用同一版本的grunt task runner。
2. GruntJS Task Runner
grunk
命令会调用Grunt task runner。我们需要将其作为应用的开发依赖安装。让我们先开一个目录,放置我们的博客应用示例。
mkdir blog
cd blog
上面已经提到,Grunt要作为应用的开发依赖安装。所以我们需要创建一个定义应用元信息的package.json
文件。运行npm init
命令,回答一些问题即可创建package.json
文件
$ npm init
name: (blog)
version: (0.0.0)
description: My awesome blog
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (BSD-2-Clause)
About to write to /Users/shekhargulati/blog/package.json:
{
"name": "blog",
"version": "0.0.0",
"description": "My awesome blog",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "BSD-2-Clause"
}
Is this ok? (yes)
Shekhars-MacBook-Pro:blog shekhargulati$
完成这一步之后,init
命令会为我们创建 package.json
文件。由于我们不需要 main
、scripts
、author
和license
这些项目,我们可以删掉它们。现在我们有了一个最简单的 package.json
文件。
{
"name": "blog",
"version": "0.0.0",
"description": "My awesome blog"
}
运行下面的命令将Grunt安装到本地:
npm install grunt --save-dev
上面的命令将安装所需的依赖,同时也会更新 package.json
。
{
"name": "blog",
"version": "0.0.0",
"description": "My awesome blog",
"devDependencies": {
"grunt": "~0.4.1"
}
}
3. Grunt Plugins
GruntJS有一个良好的插件体系,我们需要的大多数任务都有相应的插件加以处理。GruntJS的插件可以用npm安装。在这篇文章中,我们将使用两个插件——grunt-contrib-uglify
和grunt-markdown
。完整的插件列表在此。
Gruntfile
现在我们该告诉 GruntJS 该做哪些任务了。如果我们在blog
目录中运行grunt
命令,我们会看到如下的错误信息:
$ grunt
A valid Gruntfile could not be found. Please see the getting started guide for
more information on how to configure grunt: http://gruntjs.com/getting-started
Fatal error: Unable to find Gruntfile.
为了使用Grunt,我们需要创建一个名为Gruntfile.js
的文件。Gruntfile
指定grunt需要执行的任务。这个文件包含了构建脚本。
在blog
目录下创建一个新文件,起名为 Gruntfile.js
,加入下列代码:
module.exports = function(grunt){
};
这是我们开始使用Gruntfile所需的样板。
接着我们需要配置grunt需要执行的任务。我们调用grunt的initConfig
函数,将配置对象传递给它。目前,配置对象是空白的。
module.exports = function(grunt){
grunt.initConfig({
})
};
精简
我们要执行的第一项任务是精简应用中的javascript文件。在blog
目录中创建一个js
文件夹,然后创建一个名为app.js
的新文件。
$ mkdir js
$ cd js
$ touch app.js
在文本编辑器中打开app.js
,在其中加入如下内容。app.js
文件有两个简单的方法hello
和bye
。
function hello(name){
return "Hello, " + name;
}
function bye(name){
return "Bye, " + name;
}
现在我们在grunt配置对象中添加uglify
任务。
module.exports = function(grunt) {
grunt.initConfig({
uglify: {
build: {
src: ['js/app.js'],
dest: 'js/app.min.js'
}
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.registerTask('default', ['uglify']);
};
上面的代码做了这些事:
- 我们配置了
uglify
任务,指定了源文件和目标文件。 - 接着我们加载了
grunt-contrib-uglify
插件。在运行grunt
命令之前,确保插件已经安装。所有的grunt插件都可以通过npm
安装。 - 最后,我们将这个uglify任务注册为我们的默认任务。当我们未指定任务名称而直接运行
grunt
命令的时候,Grunt将调用默认任务。
如果我们运行grunt
命令,我们会碰到下面的信息:
>> Local Npm module "grunt-contrib-uglify" not found. Is it installed?
Warning: Task "uglify" not found. Use --force to continue.
Aborted due to warnings.
运行下面的命令安装grunt-contrib-uglify
插件。
npm install grunt-contrib-uglify --save-dev
然后再次运行grunt
命令,这次我们将看到成功的信息。
$ grunt
Running "uglify:build" (uglify) task
File "js/app.min.js" created.
Done, without errors.
它成功地创建了app.min.js
文件。app.min.js
如下所示,所有的空格被删除了,函数的参数被重构为单一字母,整个文件被压缩成一行。
function hello(a){return"Hello, "+a}function bye(a){return"Bye, "+a}
今天是我的《30天学习30种新技术》挑战的第4天。目前为止我很享受,从周围的开发者那里也获得了很好的反响。整个系列的列表在此。
GruntJS学习(转)的更多相关文章
- Gruntjs构工具学习视频
在这里推荐一个Gruntjs的学习视频,非常不错! http://www.imooc.com/learn/30
- React学习笔记---项目构建
简介 ReactJs由于有FB的支持,得到了社区的极大关注,同时由于ReactJs只希望专一的做好View层次上的工作,所以本身并没有涉及很多周边工具. 今天要介绍一款工具,同时包含一个构建项目模板的 ...
- reactjs学习一(环境搭配react+es6+webpack热部署)
reactjs学习一(环境搭配react+es6+webpack热部署) 本文的源码在这里下载 https://github.com/tianxiangbing/webpack-study 或者使 ...
- 学习笔记--Grunt、安装、图文详解
学习笔记--Git安装.图文详解 安装Git成功后,现在安装Gruntjs,官网:http://gruntjs.com/ 一.安装node 参考node.js 安装.图文详解 (最新的node会自动安 ...
- grunt学习
有些时候,项目中的静态资源,比如图片占用的文件有点大,影响加载的速度,所以会选择grunt对其进行压缩打包.对于grunt其他的用法,还在继续学习中,先记录下关于grunt的一些学习. grunt是一 ...
- 前端模块化开发学习之gulp&browserify篇
随着web应用的发展,前端的比重占得越来越多,编写代码从而也越来越复杂.而通常我们需要将不同功能或者不同模块的代码分开写,最后在html中一起加载,这样做是可以的,但是当你需要进行维护或者是二次开发 ...
- 如何在疲劳的JS世界中持续学习
作者简介 cnfi 蚂蚁金服·数据体验技术团队 本文翻译自<Stay updated in JS fatigue universe>,并对内容有所补充和修改. 部分内容参考<HOW ...
- 《30天学习30种新技术》-Day 15:Meteor —— 从零开始创建一个 Web 应用
目录:https://segmentfault.com/a/1190000000349384 原文: https://segmentfault.com/a/1190000000361440 到目前为止 ...
- Grunt 学习笔记【2】---- 配置和创建任务
本文主要讲Grunt任务配置. 说明:本文所有示例都基于Grunt 0.4.5版本. 一 说明 使用Grunt实现项目的打包等工程化工作,实际上是通过Grunt提供的机制和插件,配置一个个任务(例如: ...
随机推荐
- 使用django开发博客过程记录5——日期归档和视图重写
针对每条博客的观看次数我么是使用django的Mixin实现的: def get(self, request, *args, **kwargs): last_visit = request.sessi ...
- zabbix3配置短信报警
需求:在zabbix服务器配置短信报警,当服务出现故障达到预警级别是通过发送短信的形式告诉运维人员,以便及时处理. 一.zabbix服务器端配置短信脚本 我的短信脚本放置位置为 /etc/zabbix ...
- swift3.0变化总结
Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...
- Bubble Cup 8 finals F. Bulbo (575F)
题意: 给定初始位置,查询n次区间,每次查询前可以花费移动距离的代价来移动, 查询时需要花费当前位置到区间内最近的点的距离,求最小代价. 1<=n<=5000,1<=所有位置< ...
- mac显示隐藏文件
苹果Mac OS X操作系统下,隐藏文件是否显示有很多种设置方法,最简单的要算在Mac终端输入命令. 显示/隐藏Mac隐藏文件命令如下(注意其中的空格并且区分大小写): 第一种 显示Mac隐藏文件的命 ...
- Windows 7 OpenGL配置
http://blog.csdn.net/qingyang8513/article/details/45155245
- webservice 测试窗体只能用于来自本地计算机的请求
Question: WebService部署成站点之后,如果在本地测试webservice可以运行,在远程却显示“测试窗体只能用于来自本地计算机的请求”或者"The test form is ...
- [Evolutionary Algorithm] 进化算法简介
进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- Bootstrap table使用心得
序号显示带分页信息的连续编号,在序号列添加以下格式化代码即可. { field: 'number', title: '序号', align:'center', width:45, formatter: ...