自动化构建的老前辈-Grunt

之前在开篇我们提到过,Grunt是一个老牌的自动化构建工具。那边本章就是从配置以及案例分析的角度去使用Grunt。

配置文件

gruntfile.js是Grunt的入口文件,需要放在项目的根目录。用于定义一些需要Grunt自动执行的任务。
文件内需要导出一个函数,函数接收一个grunt的形参,内部提供一些创建任务时可以用到的API

module.exports = grunt => {
    grunt.registerTask("foo", () => {
        console.log("hello foo")
    })
    grunt.registerTask("bar","任务描述", () => {
        console.log("hello bar")
    })
    grunt.registerTask("default",["foo", "bar"])
}

可以使用yarn grunt <任务名>的方式执行任务,假如任务名为default则可以省略任务名。
由于Grunt默认执行的是同步任务,如果任务直接使用

grunt.registerTask("async-task", () => {
        setTimeout(() => {
            console.log("async-task")
        },1000)
    })

会发现不会执行内部的回调
如果想要执行异步任务需要使用内部的 this.async()

grunt.registerTask("async-task", function() {
        const done = this.async()
        setTimeout(() => {
            console.log("async-task")
            done()
        },1000)
    })

标记任务失败

只需要在任务中 return false 即可

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

对于一个任务数组,假如失败任务后面的任务将不会执行,认识如果我们在执行命令后面增加--force,如:yarn grunt default --force则会全部执行,但是会在错误的任务后面报错。

yarn grunt default --force
//返回结果
Running "foo" task
hello foo

Running "bad" task
hello bad
Warning: Task "bad" failed. Used --force, continuing.

Running "bar" task
hello bar

而对于异步任务想要标记失败只需要done(false)即可

配置选项

module.exports = grunt => {
    grunt.initConfig({
        foo: "bar"
    })
    grunt.registerTask("foo", () => {
        console.log(grunt.config("foo"))
    })
}

多目标任务

多目标模式,可以让任务根据配置行成多个子任务

module.exports = grunt => {
    grunt.initConfig({
        build: {   //必须为对象
            options: {
                foo: "bar" // 内部配置选项
            },
            css: "css",
            js: "js"
        }
    })
    grunt.registerMultiTask("build", function() {
        console.log(this.options())
        console.log(`target: ${this.target}, data: ${this.data}`)
    })
}

运行多目标任务必须需要目标对象
build可以一起执行也可以分开执行yarn grunt build || yarn grunt build:css
可以再目标对象中配置,配置项options,在子目标也可以配置,并且会覆盖相同的值。读options的值的时候可以用this.options()这个方法获取。

插件的使用

  1. install 执行插件
  2. 使用loadNpmTasks加载插件
  3. 给插件配置子目标
module.exports = grunt => {
    grunt.initConfig({
        clean: {
            temp: "temp/app.js"
        }
    })
    grunt.loadNpmTasks("grunt-contrib-clean") 
}

常用插件

  • grunt-sass
// yarn add grunt-sass sass
const sass = require("sass")

module.exports = grunt => {
    grunt.initConfig({
       sass: {
           options: {
            sourceMap: true,
            implementation: sass
          //等等诸多配置项
           },
           main: {
               files: {
                   "dist/css/main.css": "scss/main.scss" //   output / origin
               },
           }
       }
    })
    grunt.loadNpmTasks("grunt-sass") 
}
  • yarn add load-grunt-tasks 用来避免因为任务过多导致频繁 执行loadNpmTasks
  • grunt-babel
    yarn add grunt-babel @babel/core @babel/preset-env --dev
babel: {
           options: {
            presets: ["@babel/preset-env"]
           },
           main: {
               files: {
                   "dist/js/app.js": "js/app.js" // output : orgin
               }
           }
       }
  • grunt-contrib-watch
    yarn add grunt-contrib-watch --dev
watch: {
           js: {
               files: ["js/*.js"],
               tasks: ['babel']
           },
           css: {
               files: ["scss/*.scss"],
               tasks: ["sass"]
           }
       }

由于watch是只有文件变更的时候才执行所以需要我们最开始的时候先执行一个任务
grunt.registerTask("default",["sass", "babel","watch"])

自此我们Grunt基本功能就大致了解了,其他无非就是功能的扩展,因为现在新建的项目极少使用Grunt,所以我们只需要了解使用方式,能够对老项目的配置项读懂即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容