安装
yarn add grunt
使用
基本使用
在项目根目录添加 gruntfile.js ,这是 grunt 项目的入口文件。
// Grunt 的入口文件// 用于定义一些需要 Grunt 自动执行的任务// 需要导出一个函数// 此函数接收一个 grunt 的对象类型的形参// grunt 对象中提供一些创建任务时会用到的 APImodule.exports = grunt => {// 调用命令: yarn grunt foogrunt.registerTask('foo', 'a sample task', () => {console.log('hello grunt')})// 调用命令: yarn grunt bargrunt.registerTask('bar', () => {console.log('other task')})}
如果定义的任务名为 default ,那将作为默认任务执行,输入命令行时无需带上任务名。
// 调用: yarn gruntgrunt.registerTask('default', () => {console.log('default task')})
defalut 任务可以执行其他任务。
// 第二个参数可以指定此任务的映射任务,// 这样执行 default 就相当于执行对应的任务// 这里映射的任务会按顺序依次执行,不会同步执行grunt.registerTask('default', ['foo', 'bar'])
也可以在任务函数中执行其他任务。
grunt.registerTask('run-other', () => {// foo 和 bar 会在当前任务执行完成过后自动依次执行grunt.task.run('foo', 'bar')console.log('current task runing~')})
默认情况下, grunt 采用同步模式编码,如果需要异步可以使用 this.async() 方法创建回调函数。
// 由于函数体中需要使用 this,所以这里不能使用箭头函数grunt.registerTask('async-task', function () {const done = this.async()setTimeout(() => {console.log('async task working~')done()}, 1000)})
通过 return false 可以标记为任务失败。异步任务则需要在回调函数传入 false
grunt.registerTask('bad', () => {console.log('bad working ~')return false})// 这里执行到bad的时候失败,后面的bar会失败,如果要继续执行,可以在命令后加上 --forcegrunt.registerTask('default', ['foo','bad', 'bar'])// 异步失败任务grunt.registerTask('bad-async', function () {const done = this.async()setTimeout(() => {console.log('bad async task~')done(false)}, 1000)})
配置选项
initConfig 是 grunt 的配置选项方法。
module.exports = grunt => {grunt.initConfig({foo: {bar: 123}})grunt.registerTask('foo', () => {console.info(grunt.config('foo.bar'))})}
多目标任务
module.exports = grunt => {// 多任务必须有一个同名的配置选项grunt.initConfig({build: {options: { // options 会作为配置选项而不是 target 出现foo: 'bar'}css: {options: { // target 中的 options 会覆盖任务中的 optionsfoo: 'bar'}}, // 单独运行命令:yarn grunt build:cssjs: '2'}})// 多任务模式下,可以让任务根据配置形成多个子任务grunt.registerMultiTask('build', function() {console.info(this.options()) // 获取任务的配置选项console.info(`target: ${this.target}, data: ${this.data}`) //通过target获取到任务目标,data获取到数据})}
插件
插件是 grunt 的核心。
module.exports = grunt => {grunt.initConfig({// clean插件的配置选项clean: {temp_1: 'temp/*.js', // 清除temp文件夹的所有js文件temp: 'temp/**' // 清除temp文件夹下的所有文件}})// 清除文件插件grunt.loadNpmTasks('grunt-contrib-clean')}
const sass = require('sass')const loadGruntTasks = require('load-grunt-tasks')module.exports = grunt => {grunt.initConfig({// 编译sass插件配置选项sass: {options: {sourceMap: true, //生成sourceMapimplementation: sass //指定处理sass编译的模块},main: {files: {'dist/css/main.css': 'src/scss/main.scss'}}},// 编译 js 的插件配置选项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'])}
