[前端自动化]grunt的简单使用
前言
现在前端自动化已经是家常便饭,各种工具也是层出不穷,grunt、gulp、webpack是应用最广的三种工具,虽然grunt看似已垂垂老矣,但是以前写的很多项目一直用的就是grunt,温故方能知新,这里把grunt的基本操作再记录一下。
grunt常用插件
开始使用grunt很简单,在项目的根目录中添加两份文件:package.json 和 Gruntfile.js。npm安装模块和插件的操作就不细说了,主要是在Gruntfile.js中填写配置代码。代码目录结构如下:

然后我们就来介绍最常用的几个插件:
合并:grunt-contrib-concat
合并代码是我们最需要的一个功能了,当项目变大并且模块很多的时候,就拿我们这个angular的单页应用项目来说,index页面会有一列的js代码,如下图所示:

我们需要将这些js合并为一个文件,大大减少网络请求数量因此来提升性能。grunt-contrib-concat完美胜任,下面我们来看看基本配置用法:
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
allInOne: {
src: ['src/js/*.js'],
dest: 'dest/js/<%= pkg.name %>.js'
}
}
});
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('default', ['concat']);
};
将src/js中所有js文件合并为一个js,放在dest/js目录下,名字为package.json中项目name。这时候项目目录中就会出现一个dest的文件夹,如下所示:

压缩:grunt-contrib-uglify
合并文件后,体积仍然比较大,上线之前要将代码压缩,因此我们接着将上一步合并后的代码压缩,这里就需要用到grunt-contrib-uglify插件。仍然直接上配置代码:
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
concat: {
allOne: {
src: ['src/js/*.js'],
dest: 'dest/js/<%= pkg.name %>.js'
}
},
uglify: {
buildrelease: {
options: {
report: "min" //输出压缩率
},
files: [{
expand: true,
cwd: 'dest/js', //js目录
src: '**/*.js', //所有js文件
dest: 'dest/js', //输出到此目录下
ext: '.min.js' //指定扩展名
}]
}
}
});
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.registerTask('default', ['concat', 'uglify:buildrelease']);
};
这里我将concat后的js文件仍然输出到当前目录dest/js下,如下图所示:

引用替换:grunt-usemin(grunt-contrib-copy,grunt-contrib-clean)
使用上面两个插件合并压缩后,每次都需要手动去html页面中修改引用路径,这并不是我们想要的结果,并且直接在源版本上修改也不利于测试与发布,因此首先我们需要用到grunt-contrib-copy插件,将源代码copy一份,然后在副本上进行压缩合并,这样无论是全部压缩还是部分压缩就比较灵活了,copy之后就可以使用grunt-usemin插件了,usemin是一个多任务插件,它包括两个任务,useminPrepare和usemin。
useminPrepare用来检测html页面中的脚本块,包括脚本文件的源路径,目的路径,从而更新后续需要使用到的Grunt任务的配置信息,如前面使用的concat,uglify。useminPrepare只是分析文件,获取文件及路径信息,不更新内容。HTML中的脚本块如下:

而usemin则进行文件引用替换,将源文件中的文件块替换为压缩文件。useminPrepare已经帮助我们自动配置了concat,uglify针对的源文件以及目的文件的路径信息,因此就无需再手动配置concat和uglify任务了。配置代码如下
module.exports = function(grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
clean: {
src: 'build/'
},
useminPrepare: {
html: 'build/index.html',
options: {
dest: 'build'
}
},
uglify: {
buildrelease: {
options: {
report: "min" //输出压缩率
}
}
},
usemin: {
html: 'build/index.html',
options: {
dest: 'build'
}
},
copy: {
html: {
files: [{
expand: true,
cwd: 'src',
src: '**/*',
dest: 'build/'
}]
}
}
});
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-usemin');
grunt.registerTask('default', ['clean', 'copy', 'useminPrepare', 'concat', 'uglify', 'usemin']);
};
上面又引入了一个clean插件,每次构建时候先清除build目录,这样build目录就是我们打包后的要的结果了。目录结构如下:

总结
以上就是grunt最基本的使用方法,为了简单方便,插件的很多配置并没有介绍与使用,可以在此基础上查看官方文档使用更强的功能即可。项目代码使用的是大漠穷秋的angular实战的一个Demo,也是我入门angular的资料,需要注意的是打包angular项目时候要保证严格的依赖注入风格,否则合并后会报错的。
参考资料
[前端自动化]grunt的简单使用的更多相关文章
- 前端自动化grunt轻松入门
如果你还不了解grunt,或者只是听过它的名字而没有去研究过它,那么这篇入门级的文章就是为你写的,相信看完你就会爱上grunt! grunt是什么? grunt是一个非常好的自动化工具,你只管code ...
- 前端自动化Grunt教程
最近在学习Bootstrap,了解一部分之后,发现Bootstrap使用了LESS,好嘛,开始学习LESS,LESS了解部分,发现自动编译工具Grunt,了解Grunt过程发现需要使用node.js的 ...
- Grunt安装配置教程:前端自动化工作流
Grunt这货是啥? Grunt 是一个基于任务的 JavaScript 项目命令行构建工具. 最近很火的前端自动化小工具,基于任务的命令行构建工具 http://gruntjs.com Grunt能 ...
- 前端工作流程自动化——Grunt/Gulp 自动化
什么是自动化 先来说说为什么要自动化.凡是要考虑到自动化时,你所做的工作必然是存在很多重复乏味的劳作,很有必要通过程序来完成这些任务.这样一来就可以解放生产力,将更多的精力和时间投入到更多有意义的事情 ...
- 前端自动化学习笔记(一)——Yeoman,bower,Grunt的安装
最近看视频学习了前端自动化的一些知识,确实让我大开眼界.感觉前端越来越神器了.同时跟着视频自己也尝试运用了一些工具去构建前端项目,但是中间遇见了很多坑,磕磕绊绊的才实现了一点功能,所以打算记录一下学习 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 前端自动化开发之grunt
上篇文章介绍了前端模块化开发工具seaJs,利用seaJs我们可以轻松实现前端的模块化编程,参见http://www.cnblogs.com/luozhihao/p/4818782.html 那么今天 ...
- 前端自动化工具gulp自动添加版本号
之前,我介绍了学习安装并配置前端自动化工具Gulp,觉得gulp确实比grunt的配置简单很多,于是我决定再深入学习一下gulp,就去网上查了资料,发现gulp还可以自动添加版本号,这个功能就为我平时 ...
- 学习安装并配置前端自动化工具Gulp
Gulp和所有Gulp插件都是基于nodeJs来运行的,因此在你的电脑上需要安装nodeJs,安装过程请移驾安装并配置前端自动化工具--grunt.安装完成后,通过运行cmd进入DOS命令窗口,如图: ...
随机推荐
- 【java】Split函数踩坑记
先看一段代码: String line = "openssh|7.1"; String[] pkg = line.split("|"); System.out. ...
- vue项目中数学公式的展示
在这里有个mathjax的插件,可以将dom中的数学公式展示. 第一步安装mathjax npm install mathjax 安装完之后,你会在index.html中发现,已经引用了js文件,并且 ...
- <sql></sql>标签是干嘛的
<sql id="Base_Column_List"> id, emp_id, emp_name, org_id, org_name, corporate_name, ...
- 简单的DOS攻击之死亡之ping详解
DOS攻击之死亡之ping详解,dos攻击,俗称拒绝服务攻击,通过发送大量的无用请求数据包给服务器,耗尽服务器资源,从而无法通过正常的访问服务器资源,导致服务器崩溃. 如果多个ip通过发起对一个服务器 ...
- js点击获取—通过JS获取图片的相对坐标位置
一.通过JS获取鼠标点击时图片的相对坐标位置 源代码如下所示: <!DOCTYPE html> <html lang="en"> <head> ...
- 笨办法学Python(learn python the hard way)--练习程序31-35
下面是练习31-练习35,基于python3 #ex31.py 1 print("You enter a dark room witn two doors. Do you go throug ...
- 将原生JS和jquery里面的DOM操作进行了一下整理
创建元素节点 1.原生: document.createElement("div") 2.jquery: $("<div></div>" ...
- Installing Symfony project with PHP 7.3 version
参考地址:https://cmsdk.com/php/installing-symfony-project-with-php-7-3-version.html Tryng to install (an ...
- Repository模式--采用EF Fluent API使用EntityTypeConfiguration分文件配置Model映射关系
EF中类EntityTypeConfiguration是一个很有用的类,在nopCommerence中就使用这个类来分文件分文件配置Model映射关系.今天我就来谈谈Repository模式在Enti ...
- window.location.href后携带参数
JS文件中: window.location.href后可携带参数,但是不安全,虽然在技术上是可以实现的 1.传参:window.location.href = "RecordCare.as ...