侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

js模块化开发Gruntfile.js详解

前端  /  管理员 发布于 7年前   340

一、grunt模块简介

grunt插件,是一种npm环境下的自动化工具。对于需要反复重复的任务,例如压缩、编译、单元测试、linting等,自动化工具可以减轻你的劳动,简化你的工作。grunt模块根据Gruntfile.js文件中的配置进行任务。
如果在package.json中定义如下命令:

【相关课程推荐:JavaScript视频教程】

"scripts": {    "build": "npm install && grunt"}

因为运行npm run build会先安装devDependencies中定义的一些模块,则运行npm run build这个命令相当于做如下操作:

● npm install grunt-cli -g

● npm install

● grunt

二、gruntfile.js的结构:

● "wrapper" 函数

● 项目和任务配置

● 加载 grunt 插件和任务

● 自定义任务

三、"wrapper" 函数

每一份 Gruntfile.js(和grunt插件)都遵循同样的格式,你所书写的Grunt代码必须放在此函数内:

module.exports = function(grunt){         //do grunt-related things in here}

四、项目和任务配置

大部分的Grunt任务都依赖某些配置数据,我们通过grunt.initConfig 方法来配置Grunt任务的参数。
grunt.initConfig 方法的参数是一个JSON对象,你可以在这个配置对象中存储任意的数据。此外,由于这本身就是JavaScript,你还可以在这里使用任意的有效的JS代码。甚至你可以用<% %>模板字符串来引用已经配置过的属性,例如:

// 项目和任务配置grunt.initConfig({  pkg: grunt.file.readJSON('package.json'), //获取 package.json 中的元数据(js代码)  proj:{    name:'hello',    description:'a hello demo'  },  hello: {    options: {      name: '<%= proj.name %>'  //用<% %>模板字符串匹配hello    },    srcs: ['1.txt', '2.txt']  }});

在grunt.initConfig 方法中配置的属性,在任务模块中,可用grunt.config方法进行访问,例如:

grunt.config("proj.name");

另外,grunt任务模块会自动根据任务名来提取配置对象中和任务名对应的属性,比如定义任务hello,则在配置对象对应的属性"hello"中配置任务执行函数中所需用到的配置和数据。

五、加载grunt插件任务

为了减少重复劳动,我们可以加载已有的插件任务。

1.加载自己私有的grunt插件

可将自己定义的一些task脚本放在同一个目录下,通过grunt.loadTasks方法从指定目录加载该目录下所有的grunt任务脚本。

2.加载在npm中发布的grunt插件

像 grunt-contrib-copy和grunt-contrib-uglify这些常用的任务都已经以grunt插件的形式被开发出来了,且被发布在npm公开库中,只要在 package.json 文件中将需要使用的插件列在dependency中,并通过npm install安装之后,就可以直接加载该任务。

// 加载能够提供"copy"任务的插件。grunt.loadNpmTasks('grunt-contrib-copy');

3.直接加载所有以"grunt-"打头的插件

npm上有个load-grunt-tasks插件可以用来加载dependency列表中所有以"grunt-"打头的插件。
将需要使用的"grunt-"打头的插件列在dependency中,然后在Gruntfile.js中进行调用。

//Load grunt tasks from NPM packagesload-grunt-tasks

六、自定义任务

1.直接定义任务的行为

grunt.registerTask('hello', 'Show some msg', function() {  console.log(this.options().name); //输出hello});

2.定义为任务列表

可以将一个任务定义为一系列任务的组合,这一系列任务将按照顺序执行。

grunt.registerTask('dothings', 'copy and Show some msg', ['copy','hello']);

3.定义默认任务

通过定义 default 任务,可以让Grunt默认执行一个或多个任务。执行 grunt 命令时如果不指定一个任务的话,将会执行默认任务。如进行下面定义的话执行grunt 相当于执行grunt hello。

grunt.registerTask('default', ['hello']);

4.定义复合任务

registerMultiTask方法可以定义一个复合任务,复合任务将会对grunt.initConfig 方法中配置的相应属性中除了options外定义的属性依次作为target:data对进行处理。

module.exports = function(grunt) {    grunt.initConfig({        Log: {options: {    sep: ';'},srcs: ['1.txt', '2.txt'],dests: ['d1.txt', 'd2.txt']        }    });    grunt.registerMultiTask("Log", function() {        var options = this.options({ sep: '&' });        console.log(this.target);         console.log(this.data.join(options.sep));    });};

执行grunt Log将会输出:

Running "Log:srcs" (Log) task
srcs
1.txt;2.txt
Running "Log:dests" (Log) task
dests
d1.txt;d2.txt

定义任务行为Tips

1.任务内部可以执行其他的任务。

grunt.registerTask('mytask', function() {  grunt.task.run('task1', 'task2');  // Or:  grunt.task.run(['task1', 'task2']);});

2.定义异步任务

grunt.registerTask('mytask', function() {  var done = this.async();  //do something  done();});

3.当任务失败时,所有后续任务都将终止

在任务中,当执行失败,可以return false来表明当前任务执行失败,一般,多个任务按顺序执行,如果有任务失败时,所有后续任务都将终止。可以通过在命令行后加上--force来使有任务失败时,后续任务能继续进行。

4.任务中检查前置任务状态

有些任务可以依赖于其他任务的成功执行。通过grunt.task.requires方法来检查其前置任务是否已经执行,并且没有失败。

5.任务中检查配置属性

可以用方法grunt.task.requiresConfig指定一个或者多个字符串或者数组的配置属性为必需的。如果一个或多个必需的配置属性缺失,就通知系统当前任务失败。

本文来自 js教程 栏目,欢迎学习!

以上就是js模块化开发—Gruntfile.js详解的详细内容,更多请关注其它相关文章!


  • 上一条:
    值得收藏的CSS性能优化方法
    下一条:
    jQuery如何动态添加删除CSS样式?(代码示例)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客