前言

现在前端自动化已经是家常便饭,各种工具也是层出不穷,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完美胜任,下面我们来看看基本配置用法:

  1. module.exports = function(grunt) {
  2. grunt.initConfig({
  3. pkg: grunt.file.readJSON('package.json'),
  4. concat: {
  5. allInOne: {
  6. src: ['src/js/*.js'],
  7. dest: 'dest/js/<%= pkg.name %>.js'
  8. }
  9. }
  10. });
  11. grunt.loadNpmTasks('grunt-contrib-concat');
  12. grunt.registerTask('default', ['concat']);
  13. };

将src/js中所有js文件合并为一个js,放在dest/js目录下,名字为package.json中项目name。这时候项目目录中就会出现一个dest的文件夹,如下所示:

压缩:grunt-contrib-uglify

合并文件后,体积仍然比较大,上线之前要将代码压缩,因此我们接着将上一步合并后的代码压缩,这里就需要用到grunt-contrib-uglify插件。仍然直接上配置代码:

  1. module.exports = function(grunt) {
  2. grunt.initConfig({
  3. pkg: grunt.file.readJSON('package.json'),
  4. concat: {
  5. allOne: {
  6. src: ['src/js/*.js'],
  7. dest: 'dest/js/<%= pkg.name %>.js'
  8. }
  9. },
  10. uglify: {
  11. buildrelease: {
  12. options: {
  13. report: "min" //输出压缩率
  14. },
  15. files: [{
  16. expand: true,
  17. cwd: 'dest/js', //js目录
  18. src: '**/*.js', //所有js文件
  19. dest: 'dest/js', //输出到此目录下
  20. ext: '.min.js' //指定扩展名
  21. }]
  22. }
  23. }
  24. });
  25. grunt.loadNpmTasks('grunt-contrib-uglify');
  26. grunt.loadNpmTasks('grunt-contrib-concat');
  27. grunt.registerTask('default', ['concat', 'uglify:buildrelease']);
  28. };

这里我将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任务了。配置代码如下

  1. module.exports = function(grunt) {
  2. grunt.initConfig({
  3. pkg: grunt.file.readJSON('package.json'),
  4. clean: {
  5. src: 'build/'
  6. },
  7. useminPrepare: {
  8. html: 'build/index.html',
  9. options: {
  10. dest: 'build'
  11. }
  12. },
  13. uglify: {
  14. buildrelease: {
  15. options: {
  16. report: "min" //输出压缩率
  17. }
  18. }
  19. },
  20. usemin: {
  21. html: 'build/index.html',
  22. options: {
  23. dest: 'build'
  24. }
  25. },
  26. copy: {
  27. html: {
  28. files: [{
  29. expand: true,
  30. cwd: 'src',
  31. src: '**/*',
  32. dest: 'build/'
  33. }]
  34. }
  35. }
  36. });
  37. grunt.loadNpmTasks('grunt-contrib-clean');
  38. grunt.loadNpmTasks('grunt-contrib-copy');
  39. grunt.loadNpmTasks('grunt-contrib-uglify');
  40. grunt.loadNpmTasks('grunt-contrib-concat');
  41. grunt.loadNpmTasks('grunt-usemin');
  42. grunt.registerTask('default', ['clean', 'copy', 'useminPrepare', 'concat', 'uglify', 'usemin']);
  43. };

上面又引入了一个clean插件,每次构建时候先清除build目录,这样build目录就是我们打包后的要的结果了。目录结构如下:

总结

以上就是grunt最基本的使用方法,为了简单方便,插件的很多配置并没有介绍与使用,可以在此基础上查看官方文档使用更强的功能即可。项目代码使用的是大漠穷秋的angular实战的一个Demo,也是我入门angular的资料,需要注意的是打包angular项目时候要保证严格的依赖注入风格,否则合并后会报错的。

参考资料

  1. 中文官网
  2. usemin使用

[前端自动化]grunt的简单使用的更多相关文章

  1. 前端自动化grunt轻松入门

    如果你还不了解grunt,或者只是听过它的名字而没有去研究过它,那么这篇入门级的文章就是为你写的,相信看完你就会爱上grunt! grunt是什么? grunt是一个非常好的自动化工具,你只管code ...

  2. 前端自动化Grunt教程

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

  3. Grunt安装配置教程:前端自动化工作流

    Grunt这货是啥? Grunt 是一个基于任务的 JavaScript 项目命令行构建工具. 最近很火的前端自动化小工具,基于任务的命令行构建工具 http://gruntjs.com Grunt能 ...

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

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

  5. 前端自动化学习笔记(一)——Yeoman,bower,Grunt的安装

    最近看视频学习了前端自动化的一些知识,确实让我大开眼界.感觉前端越来越神器了.同时跟着视频自己也尝试运用了一些工具去构建前端项目,但是中间遇见了很多坑,磕磕绊绊的才实现了一点功能,所以打算记录一下学习 ...

  6. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  7. 前端自动化开发之grunt

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

  8. 前端自动化工具gulp自动添加版本号

    之前,我介绍了学习安装并配置前端自动化工具Gulp,觉得gulp确实比grunt的配置简单很多,于是我决定再深入学习一下gulp,就去网上查了资料,发现gulp还可以自动添加版本号,这个功能就为我平时 ...

  9. 学习安装并配置前端自动化工具Gulp

    Gulp和所有Gulp插件都是基于nodeJs来运行的,因此在你的电脑上需要安装nodeJs,安装过程请移驾安装并配置前端自动化工具--grunt.安装完成后,通过运行cmd进入DOS命令窗口,如图: ...

随机推荐

  1. 在成为测试大牛的路上,我推荐BestTest

    BestTest-Python自动化测试9月份班开始招生啦! 网络+现场同步进行,课程新升级,web自动化+接口自动化双管齐下,一线互联网测试开发工程师带你在自动化的世界里自由翱翔! 推荐优惠多多,欢 ...

  2. PHP读取XML文件数据获取节点值

    最近在接入渠道的时候遇到接口返回是xml数据.现在接口数据返回json数据格式比较常见. 如何获取xml里面真正数据? 对象结果集合单个值的强制转换处理.(直接代码说明) demo示例:  创建xml ...

  3. QT_study

    https://blog.csdn.net/a313827758/article/details/72736552 https://blog.csdn.net/xbcreal/article/deta ...

  4. day17—Flex弹性布局详解(一)

    转行学开发,代码100天——2018-04-02 今天看到一篇大神的文章,关于flex布局的详解,对flex用法介绍的相当详细,非常有助于我等初学者更深入了解这种布局方式. 文章链接 [基础知识]Fl ...

  5. java Json 技术记录

    1.Json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-c ...

  6. 【ABAP系列】SAP webservice HTTP框架出错 404错误

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP webservice H ...

  7. 【ABAP系列】SAP SAP中关于编码的解释

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP SAP中关于编码的解释 ...

  8. Rsync+inotify搭建使用

    ## Rsync搭建 ### 1.1 环境准备 ``` Rsync-Server 192.168.1.174 Client-Rsync 192.168.1.173 服务启动用户都是root,客户端的用 ...

  9. 诊断:MRP0: Background Media Recovery process shutdown with error ORA-19909

    oracle12c data guard,从库无法应用日志,检查alert日至发现 2019-10-21T14:55:40.087819+08:00 MRP0: Background Media Re ...

  10. Mybatis开发中前端控制器注解@Controller 引用的类错误

    import org.springframework.web.portlet.ModelAndView; 错误 import org.springframework.web.servlet.Model ...