1. Grunt 的简单介绍

grunt 可以说是前端构建工具的鼻祖了,它的插件生态非常完善,用官方的话来说:grunt 的插件几乎可以自动化帮助你做任何你想做的事情。虽然 grunt 虽然强大,但是现在 grunt 基本已经退出历史舞台了。因为 grunt 的工作过程是基于临时文件实现的,所以它的构建速度相对较慢,例如你去使用 grunt 对 sass 文件的构建,我们一般先会对 sass 文件进行编译操作,再去添加一些私有属性的前缀,最后再去压缩代码。在这样的过程当中,grunt 的每一步都会有磁盘读写操作。比如在 sass 文件编译过后,它会将 sass 文件结果写入一个临时文件,然后下一个插件再去读取这个文件,如果你有一个超大型的项目,文件特别多的话,每处理一个文件都会进行磁盘读写操作,就会导致构建速度特别慢,因为你要频繁地进行 I/O 操作。
下面我们就来简单的学习一下 grunt

2. Grunt 的基本使用

我们创建一个文件,然后初始化 package.json,添加 grunt 模块

yarn init -yyarn add grunt -D

然后在根目录创建一个 gruntfile.js 的文件, gruntfile.js 就是 grunt 的入口文件

  • (1)我们就可以在 gruntfile.js 中使用 grunt 去处理一些任务
module.exports = grunt => {grunt.registerTask('foo', () => {console.log('hello grunt')})
}

然后我们在控制台执行以下命令

yarn grunt foo // 输出 hello grunt

这样 grunt 就会帮助我们执行 foo 任务

  • (2)默认任务
    如果我们将 registerTask 的第一个参数设置为 default 那么它就是一个默认任务,我们就不用指定任务
grunt.registerTask('default', '任务描述', () => {console.log('default task')
})

然后我们在控制台执行以下命令

yarn grunt // 输出 default task

如果我们将 registerTask 第二个参数设置为数组,它就会执行多个任务

grunt.registerTask('default', ['foo', 'bar'])
  • (3) 异步任务
    我们并不能直接在 registerTask 中执行异步任务,而是需要借助它内置的 async 函数
grunt.registerTask('async-task', function() {const done = this.async()setTimeout(() => {console.log('async task')}, 1000)
})

3. Grunt 标记任务失败

我们在实际开发中,如果有一个文件找不到了,我们就需要 grunt 将这个任务标记为失败任务

grunt.registerTask('bad', () => {console.log('bad work')return false
})

这时控制台就会报错
如果我们有多个任务,串行执行,那么失败的任务之后的任务都不会被执行

grunt.registerTask('bad', () => {console.log('bad work')return false
})grunt.registerTask('foo', () => {console.log('foo task')
})grunt.registerTask('bar', () => {console.log('bar task')
})grunt.registerTask('default', ['foo', 'bad', 'bar'])

这时控制台就会报错, bad 任务之后的任务都不会被执行

3. Grunt 的配置方法

除了 registerTask 处理任务的方法,grunt 还有一个 initConfig 初始化配置选项的 api

grunt.initConfig({// foo: 'bar'foo: {bar: 123}
})grunt.registerTask('foo', () => {console.log(grunt.config('foo.bar'))
})

在控制台执行下面的命令

yarn grunt foo // 输出 123

4. Grunt 多目标任务

多目标模式,可以让我们根据配置形成多个子任务, 我们可以借助 initConfig 去初始化任务

grunt.initConfig({build: {options: {foo: 'bar'},css: {options: {foo: 'baz'}},js: '2'}
})// 多目标模式,可以让我们根据配置形成多个子任务
grunt.registerMultiTask('build', function() {// console.log('build task')console.log(this.options())console.log(`target: ${this.target}, data: ${this.data}`)
})

值得注意的是,当我们在子任务中配置 option 会覆盖掉父任务中的 option

  1. Grunt 的常见的插件使用
    Grunt 提供的强大的插件,这些插件内部都封装了一些通用的任务,下面我们来看看怎么使用它们
  • (1)grunt-contrib-clean
    grunt-contrib-clean 用来帮助我们来清除项目开发中的一些临时文件
    首先我们来安装一下这个插件
yarn add grunt-contrib-clean

然我我们在 gruntfile.js 中配置一下

grunt.initConfig({clean: {temp: 'temp/*.js'}
})grunt.loadNpmTasks('grunt-contrib-clean')

然我们执行下面的命令

yarn grunt clean

这样 temp 文件夹下面的 app.js 就被清除了

  • (2)grunt-sass
    处理 sass 文件
    首先我们先安装 grunt-sass 模块
yarn add grunt-sass sass -D

然后我们在 gruntfile.js 文件中做一些配置

const sass = require('sass')module.exports = grunt => {grunt.initConfig({sass: {options: {implementation: sass,sourceMap: true,},main: {files: {'dist/css/main.css': 'src/scss/main.scss'}}},})grunt.loadNpmTasks('grunt-sass')
}

然后执行下面的命令

yarn grunt sass
  • (3)grunt-babel
    grunt-babel 用来编译 es6 的代码
    首先我们先安装它
yarn grunt grunt-babel @babel/core @babel/preset-env -D

随着我们使用更多的插件,我们会不断地使用 loadNpmTasks,这显然会比较麻烦,所以我们需要使用一个 load-grunt-tasks的插件,它会帮助我们自动加载任务

yarn add load-grunt-tasks -D

我们再来整理一下我们的 gruntfile.js 中的配置

const sass = require('sass')
const loadGruntTasks = require('load-grunt-tasks')module.exports = grunt => {grunt.initConfig({sass: {options: {implementation: sass,sourceMap: true,},main: {files: {'dist/css/main.css': 'src/scss/main.scss'}}},babel: {options: {sourceMap: true,presets: ['@babel/preset-env']},main: {files: {'dist/js/app.js': 'src/js/app.js'}}},})// grunt.loadNpmTasks('grunt-sass')loadGruntTasks(grunt) // 自动加载所有的 grunt 插件的中的任务
}

然我们再来执行一下

yarn grunt babel

这时 dist 目录就会多出一个 app.js 文件,就是 es6 转换成 es5 的代码

  • (4)grunt-contrib-watch
    我们在实际开发的时候肯定能遇到这样的需求,在我们写完一段代码之后,需要实时更新,我们就需要 grunt-contrib-watch 帮助我们去监听文件,我们来安装一下这个插件
yarn add grunt-contrib-watch -D

然我们再来对 gruntfile.js 做出一些配置


const sass = require('sass')
const loadGruntTasks = require('load-grunt-tasks')module.exports = grunt => {grunt.initConfig({sass: {options: {implementation: sass,sourceMap: true,},main: {files: {'dist/css/main.css': 'src/scss/main.scss'}}},babel: {options: {sourceMap: true,presets: ['@babel/preset-env']},main: {files: {'dist/js/app.js': 'src/js/app.js'}}},watch: {js: {files: ['src/js/*.js'],tasks: ['babel']},css: {files: ['src/scss/*.scss'],tasks: ['sass']}}})// grunt.loadNpmTasks('grunt-sass')loadGruntTasks(grunt) // 自动加载所有的 grunt 插件的中的任务grunt.registerTask('default', ['sass', 'babel', 'watch'])
}

然后我们执行下面的命令

yarn grunt

然后我们每次再修改文件后,就是会实时更新了

5. 总结

上面就是 grunt 的基本使用,其实我们对于 grunt 只需要了解就可以了,不需要在这上面消耗太多的精力,因为现在基本没有使用 grunt 的项目了,除非一些"史前"的项目。当然我们如果你了解 grunt 的话,对于你学习 gulp 是有一定帮助的,因为它们之间的语法会有一些相似的地方。

Grunt 的简单使用相关推荐

  1. 前端自动化工具 grunt 插件 uglify 的简单使用(一)

    Grunt 的简介: Grunt 是一套前端自动化工具,是一个基于 node.js 的命令行工具,它一般用于: 1.压缩文件: 2.合并文件: 3.简单的语法检测: 4.监听文件变动: 5.less ...

  2. webpack gulp grunt 简单介绍

    本文主要是讲下webpack的相关知识点,理论比较多,因为webpack的功能非常强大,说到的也基本都是经常用到的. 这三个工具都属于前端自动化的工具,都是第三方的,并且国内很多大型团队也都有自己成熟 ...

  3. gulp,grunt,bower,feoman,fis 简单说明

    一.grunt说明 (1)grunt网址: https://www.gruntjs.net/getting-started (2)说明: 自动化.对于需要反复重复的任务,例如压缩(minificati ...

  4. webpack入门之简单例子跑起来

    webpack入门之简单例子跑起来 webpack介绍 Webpack是当下最热门的前端资源模块化管理和打包工具,它可以将很多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源,还可以将按需加载 ...

  5. 前端工程化系列[02]-Grunt构建工具的基本使用

    本文主要介绍前端开发中常用的构建工具Grunt,具体包括Grunt的基本情况.安装.使用和常见插件的安装.配置和使用等内容. 1.1 Grunt简单介绍 Grunt是一套前端自动化构建工具.对于需要反 ...

  6. Grunt的配置和使用

    Grunt和Grunt插件是通过NodeJs的包管理工具npm安装并进行管理的. Grunt 0.4.x必须配合NodeJs=>0.8.0版本使用(奇数版本的NodeJs不是稳定的开发版本)   ...

  7. Grunt插件之LiveReload 实现页面自动刷新,所见即所得编辑

    苦B的前端每次在制作和修改页面时,都有一个特定的三部曲:coding-save-F5.很多时候都希望自己一改东西,页面就能立刻显示,而现在LiveReload就能做到这点. LiveReload会监控 ...

  8. grunt 打包前端代码

    [grunt整合版]30分钟学会使用grunt打包前端代码 grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于: ① 压缩文件 ② 合并文件 ③ 简单语法检查 对于其他用法, ...

  9. grunt入门讲解1:grunt的基本概念和使用

    Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.老版本的 Node. ...

  10. 看看 Grunt 的源码(一):grunt-cli 源码解析

    由于将来工作需要最近学习了Grunt,至于Grunt是什么大家百度下就好了,我就不多说了.对于它内部的实现比较感兴趣,所以看了看源码.今天先来说说grunt命令行工具grunt-cli的实现. gru ...

最新文章

  1. 配置windows失败,不能进入系统
  2. Linux 修改SSH 默认端口 22,防止被破解密码
  3. WebApi中跨域解决办法
  4. webpack打包生成的map文件_一站式搞明白webpack中的代码分割
  5. MySQL 5.7 主从复制配置
  6. android采用videoView播放视频(包装)
  7. 作为一个Java开发者,java常用算法手册pdf
  8. html广告代码自适应,很实用的对联广告代码(自适应高度)
  9. ArcCatalog不能预览地图服务
  10. Surface Pro 7 综合评测——购买感受和使用重点【品控、性能、投影】
  11. html广告网页完整代码,HTML5设计网页动态条幅广告(Banner) 已经加上完整源代码 - 伊甸一点...
  12. Set接口以及子集合(HashSet/LinkedHashSet/TreeSet)的用法和数据结构
  13. 《系统工程理论与实践》Latex 模板使用教程
  14. mysql语句批量更新数据库_sql 更新批量数据库语句
  15. vue 播放rtmp 直播拉流视频
  16. 面向边缘计算的视频监控系统架构方案
  17. PMP项目管理计算中字母含义 PV、EV、AC、SV、CV、SPI、CPI
  18. Centos7学习——echo命令
  19. HDU 6595 Everything Is Generated In Equal Probability (期望dp,线性推导)
  20. BNET通信区块链项目CEO刘建军受邀参加2018“区块链共识大会”

热门文章

  1. 新浪微博客户端开发之发布微博,Android面试题
  2. Mybatis异常:MBean: com.mchange.v2.c3p0:type=PooledDataSource,identityToken=1hgedq99n9h1k
  3. C++(指针和高级指针)-上篇
  4. 智能人物画像综合分析系统——Day7
  5. Leetcode 739 每日温度
  6. Hello C++(十九)——C++类型识别
  7. 《高效阅读——20分钟读懂一本书》读书总结
  8. 资源分享 | SAHI:超大图片中对小目标检测的切片辅助超推理库
  9. java读取服务器上文件,java 读取linux服务器上文件
  10. 市场部商业计划PPT模板