gruntjs开发实例

Grunt是基于Node.js的项目构建工具。它可以自动运行你所设定的任务,如编译less,sass,压缩js,合拼文件等等。
(一)安装nodejs环境,Grunt 0.4.x要求Node.js的版本>=0.8.0,如果你已安装了nodejs,命令行中运行node -v查看你的Node.js版本,如果版本号不够,重新安装覆盖旧版本。

(二)如果你的公司是用代理上网,先命令行 npm set proxy=http://ip地址 ,然后命令行 npm install -g grunt-cli 将grunt植入到你的系统里面,这样就允许你从任意目录来运行它(定位到任意目录运行grunt命令),安装grunt-cli并不等于安装了grunt任务运行器!Grunt CLI的工作很简单:在Gruntfile所在目录调用运行已经安装好的相应版本的Grunt。这就意味着可以在同一台机器上同时安装多个版本的Grunt
(三)gruntjs的运行是依靠着package.json和Gruntfile.js这两个文件配置,在你的项目根目录新建此 2 个文件,格式如下:
(1)package.json 在此文件写入你项目所依赖的Grunt版本和Grunt插件,例子:
{
"name": "pcauto",
"version": "0.1.0",
"devDependencies": {
"grunt": "~0.4.5",
"grunt-contrib-less": "~0.11.4",
"grunt-contrib-watch": "~0.6.0"
}
}
name :项目的名称,version:项目的版本号(这些都是随意的),devDependencies:设置grunt版本号与各插件 (名城:版本号,可以在官网查看相关的名称与版本号),更多插件查看
(2)在此项目根目录 shift + 右键 -> 在此处打开命令行,npm install



在根目录自动生成一个 node_modules的文件夹,里面就是你需要的grunt插件,到这步 grunt版本与插件都安装好了,下一步就是配置Gruntfile.js
(3)配置工作流Gruntfile.js
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
less: {
dev: {
files:{
'css/index.css':'less/index.less',
'css/page.css':'less/page.less'
}
}
},
watch:{
less:{
files:['less/*.less'],
tasks:['less']
}
}
});
// 加载包含 "uglify" 任务的插件。
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-watch');
// 默认被执行的任务列表。
grunt.registerTask('default', ['less','watch']);
};
【1】pkg: grunt.file.readJSON('package.json') 就是把在刚配置好的json数据导入到Grunt配置中
【2】插件调用配置
less: {
dev: {
files:{
'css/index.css':'less/index.less',
'css/page.css':'less/page.less'
}
}
}
手动匹配:调用配置,如图less 中,指定了名为dev(自定义,必需)的任务,然后执行多文件处理,格式为 files:{'xxxx输出的css文件路径与文件名':'xxx你所编写的less文件','xxxx':'xxxxx'}
自动全部文件匹配模式
less: {
dev: {
files: [{
expand: true,
cwd: 'less/',
src: ['*.less'],
dest: 'css/',
ext: '.css'
}]
}
}
为了避免每次编译都要运行一个命令行,这里有个很好的插件 watch,它能实时监控(如例子中在watch任务中监控less文件夹下的所有less文件,一旦代码有发生改变,就自动执行less编译任务,就不需要每次运行 grunt命令行。注:开始只需要运行一次 grunt命令行,然后窗口不要关闭,保持打开的状态,如下图。)
【3】加载任务插件 grunt.loadNpmTasks('grunt-contrib-less'); grunt.loadNpmTasks('grunt-contrib-watch');
【4】定义被执行的任务列表 grunt.registerTask('default', ['less','watch']); (默认任务,如果你的名称是 grunt.registerTask('yong', ['less','watch']),那么在下一步中运行命令行就是grunt yong)
到这里,已经全部都配置好,下一步就是运行
(四)在此项目根目录 shift + 右键 -> 在此处打开命令行,grunt

在之前的时代,编译less,压缩文件,与合拼文件,都需要借助不同的工具逐个逐个任务执行完成,效率很低,如今有了 Grunt,一切都自动化。
(五)注意事项:
(1)使用uglify压缩的js文件是utf-8编码的,如果你的页面是gb2312,如果你的js代码有输出中文如:document.getElementById('demo').innerHTML = '中文';那么页面就出现乱码
解决:插件提供参数:ASCIIOnly:true,将中文文字转为ASCII码,然后js文件里面的代码输出就是 document.getElementById("demo").innerHTML="\u4e2d\u6587";
uglify:{
options: {
ASCIIOnly:true
}
}
(2)使用cssmin,默认情况下,会把css_hack,如ie6的属性去掉;
解决:
cssmin: {
options : {
compatibility : 'ie8', //设置兼容模式
noAdvanced : true //取消高级特性
}
}
(六)常用插件
grunt-spritesmith //图片合拼与生成代码片段
grunt-contrib-watch //实时监听文件,执行任务
grunt-contrib-cssmin //样式合拼与压缩
grunt-contrib-uglify //脚步合拼与压缩
贴上一个配置例子,仅供参考:
package.json
{
"name": "pcauto",
"version": "0.1.0",
"devDependencies": {
"grunt": "~0.4.5",
"grunt-contrib-less": "~1.0.0",
"grunt-contrib-uglify": "~0.7.0",
"grunt-contrib-imagemin":"~0.9.0",
"grunt-contrib-cssmin": "~0.7.0",
"grunt-contrib-watch": "~0.6.0"
}
}
Gruntfile.js
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
//less编译为css
less: {
dev: {
files: [{
expand: true,
cwd: 'src/less/',
src: ['*.less'],
dest: 'src/css/',
ext: '.css'
}]
}
},
//css文件压缩
cssmin:{
dev:{
files: [{
expand: true,
cwd: 'src/css/',
src: ['*.css', '!*.min.css'],
dest: 'css/',
ext: '.min.css'
}]
}
},
//压缩js文件
uglify:{
options: {
banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd hh:mm") %> */\n'
},
dev:{
files:[{
expand:true,
cwd:'src/js/',
src:'*.js',
dest:'js/',
ext: '.min.js'
}]
}
},
//图片压缩
imagemin:{
dev:{
files:[{
expand: true,
cwd: 'src/image/',
src: ['*.{png,jpg}'],
dest: 'image/'
}]
}
},
//实时监控任务
watch:{
less:{
files:['src/less/*.less'],
tasks:['less']
},
uglify:{
files:['src/js/*.js'],
tasks:['uglify']
},
cssmin:{
files:['src/css/*.css'],
tasks:['cssmin']
},
imagemin:{
files:['src/image/*.{png,jpg}'],
tasks:['imagemin']
}
}
});
// 加载包含 "uglify" 任务的插件。
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-imagemin');
// 默认被执行的任务列表。
grunt.registerTask('default', ['less','cssmin','uglify','imagemin','watch']);
};
gruntjs开发实例的更多相关文章
- ecshop二次开发 给商品添加自定义字段【包含我自己进一步的开发实例详解】
本文包含商品自定义添加教程及进一步的开发实例: 教程: 说起自定义字段,我想很多的朋友像我一样会想起一些开源的CMS(比如Dedecms.Phpcms.帝国)等,他们是可以在后台直接添加自定义字段的. ...
- RDIFramework.NET -.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(WebForm版)
RDIFramework.NET—.NET快速开发整合框架 [开发实例]之产品管理(WebForm版) 接上篇:RDIFramework.NET (.NET快速信息化系统开发整合框架) [开发实例]之 ...
- RDIFramework.NET-.NET快速信息化系统开发整合框架 【开发实例 EasyUI】之产品管理(MVC版)
RDIFramework.NET—.NET快速开发整合框架 [开发实例]之产品管理(MVC版) 接上篇:RDIFramework.NET (.NET快速信息化系统开发整合框架) [开发实例]之产品管理 ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(二)
最近新浪.百度.腾讯.京东.大众点评.淘宝等流行的网站都加大了招聘HTML5的力度,HTML5开发人员成了抢手货,本次连载的是由大众点评前端工程师和一淘网前端工程师基情奉献的<HTML5网页开发 ...
- RDIFramework.NET开发实例━表约束条件权限的使用-Web
RDIFramework.NET开发实例━表约束条件权限的使用-Web 在上一篇文章“RDIFramework.NET开发实例━表约束条件权限的使用-WinForm”我们讲解了在WinForm下表约束 ...
- RDIFramework.NET开发实例━表约束条件权限的使用-WinForm
RDIFramework.NET开发实例━表约束条件权限的使用-WinForm 在实际的应用中,客户常有这样的需求,指定用户或角色可以看指定条件下的数据,这里的“指定条件”在RDIFramework. ...
- RDIFramework.NET V2.8版本 ━ 开发实例之产品管理(WinForm)
RDIFramework.NET V2.8版本 ━ 开发实例之产品管理(WinForm) 现在,我们使用.NET快速开发整合框架(RDIFramework.NET)来开发一个应用,此应用皆在说明如何使 ...
- Android音乐播放器的开发实例
本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的 ...
随机推荐
- 解决Android版Firefox字体显示过大的问题
在用Android版Firefox查看博客园首页发现中间区域的字体显示非常大,开始以为是首页css对移动版浏览器支持不好. 后来发现原来这是Firefox for Android的知名bug: Tha ...
- Why do some system users have /usr/bin/false as their shell? What's the difference between /sbin/nologin and /bin/false
https://www.quora.com/How-can-bin-true-and-bin-false-Linux-utilities-be-used MySQL :: MySQL 8.0 Refe ...
- Python爬虫基础(四)Requests库的使用
requests文档 首先需要安装:pip install requests get请求 最基本的get: # -*- coding: utf-8 -*-import requests respons ...
- python设置redis过期时间
import time import redis if __name__ == "__main__": try: conn=redis.StrictRedis(host='192. ...
- 大规模Docker平台自动化监控之路
本文介绍了通过Monitor,如何实现大规模容器运维平台的自动化监控需求. 尽管Docker技术目前还处于不稳定的发展与标准制定阶段,但这门技术已经呈现了极其火热的增长状态,却已经是不争的实事.到底有 ...
- SQL和access随机数
Access: CLng(Rnd(种子数字)*1000000) SQL Server ceiling(rand(abs(checksum(newid())))*1000000)
- 洛谷P5151 HKE与他的小朋友 快速幂/图论+倍增
正解:矩阵快速幂/tarjan+倍增 解题报告: 传送门! 跟着神仙做神仙题系列III 这题首先一看到就会想到快速幂趴?就会jio得,哦也不是很难哦 然而,看下数据范围,,,1×105,,,显然开不下 ...
- DNS中A记录和CNAME记录的区别(转)
A记录是域名到ip的映射,即为ip起别名:CNAME是域名别名到域名的映射,即为域名起别名. 还有一个常用的记录是MX记录,它是与邮件相关的,MX记录记录了发送电子邮件时域名对应的服务器地址. 原文: ...
- 38初识xml
XML(可扩展标记语言)是一种用于记录多种数据类型的标记语言.使用XML可以将各类型的文档定义为容易读取的格式,便于用户读取.而且,在应用程序中使用XML,可以轻松实现数据交换. QT中提供两种访问X ...
- 尚未指定报表“Report1”的报表定义
在做RDLC项目中遇到这样的错误 本地报表处理期间出错. 尚未指定报表“Report1”的报表定义 未将对象引用设置到对象的实例. 解决方案: 打开reportViewer->LocalRepo ...