http://www.gruntjs.net/sample-gruntfile

Gruntfile 实例

下面就针对一个 Gruntfile 案例做简单分析,也可以作为一个实例使用:

module.exports = function(grunt) {grunt.initConfig({jshint: {files: ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js'],options: {globals: {jQuery: true } } }, watch: { files: ['<%= jshint.files %>'], tasks: ['jshint'] } }); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.registerTask('default', ['jshint']); };

在页面底部是这个 Gruntfile 实例的完整内容,如果你按顺序阅读本文的话,可以跟随我们一步步分析这个文件中的每一部分。我们会用到以下5个 Grunt 插件:

  • grunt-contrib-uglify
  • grunt-contrib-qunit
  • grunt-contrib-concat
  • grunt-contrib-jshint
  • grunt-contrib-watch

第一部分是"wrapper" 函数,它包含了整个Grunt配置信息。

module.exports = function(grunt) {
}

在这个函数中,我们可以初始化 configuration 对象:

grunt.initConfig({
});

接下来可以从package.json 文件读入项目配置信息,并存入pkg 属性内。这样就可以让我们访问到package.json文件中列出的属性了,如下:

pkg: grunt.file.readJSON('package.json')

到目前为止我们就可以看到如下配置:

module.exports = function(grunt) {grunt.initConfig({pkg: grunt.file.readJSON('package.json')});
};

现在我们就可以为我们的每个任务来定义相应的配置(逐个定义我们为项目定义的任务配置),然后每个任务的配置对象作为Grunt配置对象(即 grunt.initConfig({})所接受的配置对象)的属性,并且这个属性名称与任务名相同。因此"concat"任务就是我们的配置对象中 的"concat"键(属性)。下面便是我的"concat"任务的配置对象。

concat: {options: {// 定义一个用于插入合并输出文件之间的字符separator: ';'},dist: {// 将要被合并的文件src: ['src/**/*.js'],// 合并后的JS文件的存放位置 dest: 'dist/<%= pkg.name %>.js' } }

注意我是如何引用JSON文件(也就是我们在配置对象顶部引入的配置文件)中的name属性的。这里我使用pkg.name来访问我们刚才引入并存储在pkg属性中的package.json文件信息,它会被解析为一个JavaScript对象。Grunt自带的有一个简单的模板引擎用于输出配置对象(这里是指package.json中的配置对象)属性值,这里我让concat任务将所有存在于src/目录下以.js结尾的文件合并起来,然后存储在dist目录中,并以项目名来命名。

现在我们来配置uglify插件,它的作用是压缩(minify)JavaScript文件:

uglify: {options: {// 此处定义的banner注释将插入到输出文件的顶部banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'},dist: {files: {'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']}}
}

这里我们让uglifydist/目录中创建了一个包含压缩结果的JavaScript文件。注意这里我使用了<%= concat.dist.dest>,因此uglify会自动压缩concat任务中生成的文件。

QUnit插件的设置非常简单。 你只需要给它提供用于测试运行的文件的位置,注意这里的QUnit是运行在HTML文件上的。

qunit: {files: ['test/**/*.html']
},

JSHint插件的配置也很简单:

jshint: {// define the files to lintfiles: ['gruntfile.js', 'src/**/*.js', 'test/**/*.js'],// configure JSHint (documented at http://www.jshint.com/docs/) options: { // more options here if you want to override JSHint defaults globals: { jQuery: true, console: true, module: true } } }

JSHint只需要一个文件数组(也就是你需要检测的文件数组), 然后是一个options对象(这个对象用于重写JSHint提供的默认检测规则)。你可以到JSHint官方文档站点中查看完整的文档。如果你乐于使用JSHint提供的默认配置,那么在Gruntfile中就不需要重新定义它们了.

最后,我们来看看watch插件:

watch: {files: ['<%= jshint.files %>'],tasks: ['jshint', 'qunit']
}

你可以在命令行使用grunt watch来运行这个任务。当它检测到任何你所指定的文件(在这里我使用了JSHint任务中需要检测的相同的文件)发生变化时,它就会按照你所指定的顺序执行指定的任务(在这里我指定了jshint和qunit任务)。

最后, 我们还要加载所需要的Grunt插件。 它们应该已经全部通过npm安装好了。

grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-qunit');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');

最后设置了一些task。最重要的是default任务:

// 在命令行上输入"grunt test",test task就会被执行。
grunt.registerTask('test', ['jshint', 'qunit']);// 只需在命令行上输入"grunt",就会执行default task grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);

下面便是最终完成的 Gruntfile 文件:

module.exports = function(grunt) {grunt.initConfig({pkg: grunt.file.readJSON('package.json'),concat: {options: {separator: ';'},dist: {src: ['src/**/*.js'],dest: 'dist/<%= pkg.name %>.js' } }, uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n' }, dist: { files: { 'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>'] } } }, qunit: { files: ['test/**/*.html'] }, jshint: { files: ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js'], options: { //这里是覆盖JSHint默认配置的选项 globals: { jQuery: true, console: true, module: true, document: true } } }, watch: { files: ['<%= jshint.files %>'], tasks: ['jshint', 'qunit'] } }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.registerTask('test', ['jshint', 'qunit']); grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']); };
Found an error in the documentation? File an issue.

Grunt-几个常用的任务配置,加载,执行的写法相关推荐

  1. Spring boot外部配置加载顺序

    外部配置加载顺序 Spring boot 可以从以下位置加载配置 优先级从高到低 高优先级的配置,覆盖低优先级的配置 所有的配置,会形成互补配置 官网,给出了17个位置 这里,只介绍常用的11个位置 ...

  2. Pytorch:NLP 迁移学习、NLP中的标准数据集、NLP中的常用预训练模型、加载和使用预训练模型、huggingface的transfomers微调脚本文件

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) run_glue.py微调脚本代码 python命令执行run ...

  3. 关于flume配置加载(二)

    为什么翻flume的代码,一方面是确实遇到了问题,另一方面是想翻一下flume的源码,看看有什么收获,现在收获还谈不上,因为要继续总结.不够已经够解决问题了,而且确实有好的代码,后续会继续慢慢分享,这 ...

  4. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)

    1.外部配置加载顺序 SpringBoot也可以从以下位置加载配置: 优先级从高到低 高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置  1.命令行参数 所有的配置都可以在命令行上进行指定 ...

  5. 配置文件加载位置||外部配置加载顺序||自动配置原理

    配置文件加载位置 SpringBoot会从这四个位置全部加载主配置文件:互补配置: 外部配置加载顺序 自动配置原理 1.自动配置原理: 1).SpringBoot启动的时候加载主配置类,开启了自动配置 ...

  6. 对集合变量定义赋值_SpringBoot配置加载原理(自定义加载配置)

    前言 在SpringBoot应用程序中会有很多的地方定义配置文件,如: bootstrap.properties application.properties 或者是SpringCloud中定义的远程 ...

  7. SpringBoot_配置-外部配置加载顺序

    接下来我们再来看SpringBoot的一个特点,外部配置的加载顺序,也就是说,SpringBoot我们要写一些配置,配置可以写在我们的配置文件,application.properties,放到类路径 ...

  8. Dubbo(十)之配置加载流程

    转载自  Dubbo配置加载流程 Dubbo 中的配置加载流程介绍 此篇文档主要讲在应用启动阶段,Dubbo框架如何将所需要的配置采集起来(包括应用配置.注册中心配置.服务配置等),以完成服务的暴露和 ...

  9. Soul网关源码阅读(九)插件配置加载初探

    Soul网关源码阅读(九)插件配置加载初探 简介     今日来探索一下插件的初始化,及相关的配置的加载 源码Debug 插件初始化     首先来到我们非常熟悉的插件链调用的类: SoulWebHa ...

  10. 二、SpringBoot配置-简述配置加载原理

    springboot使用一个全局配置文件 application.properties application.yml 配置文件放在src/main/resources目录或者类路径/config下 ...

最新文章

  1. 关系型数据库到HBase的数据储存方式变迁
  2. 学计算机选电脑,大学准备学计算机,选怎样配置的电脑好?
  3. iis里面的mime没有php扩展,IIS - 无后缀(无扩展名)的MIME类型配置
  4. 数据库-优化-MYSQL数据库设计原则
  5. EcmaScript正則表達式( 深入淺出系列之淺出 )
  6. MongoDB 3.0 新增特性一览
  7. html中显示数据库中的一条数据,如何使用html表显示数据库中的数据
  8. 链表递增输出并释放空间
  9. python小游戏-16行代码实现3D撞球小游戏!-源码下载
  10. Java 用接口实现加减乘除计算器
  11. mysql 触发器条件判断偶尔失效_mysql┃多个角度说明sql优化,让你吊打面试官!...
  12. 软件测试(原书第2版中文)PDF版
  13. 你可能不知道的 AS 小技巧之「Extract Resource」
  14. mac 读写ntfs
  15. 洛谷P6158 封锁,平面图最小乘积最短路
  16. 潇洒郎: 解决EDAS论文上传文字没有嵌入问题:Upload failed: The font Arial,Italic is not embedded in the file.
  17. d3.js使用svg制作图标
  18. 文件岛 服务器大陆,重回文件岛《究极数码暴龙》奇遇系统解析
  19. fastJson与String、对象、集合之间相互转换
  20. 网络运营商名称显示amp;SIM名称显示

热门文章

  1. 一文彻底搞懂 zookeeper 核心知识点(修订版)
  2. 为了面试,从头到尾说一次 Java 垃圾回收
  3. SpringBoot+RabbitMQ ,保证消息100%投递成功并被消费(附源码)
  4. 知乎服务化的实践与思考
  5. 这是一份不完整的数据竞赛年鉴
  6. 《数据竞赛入门讲义》下载,北航计算机硕士两年经验总结
  7. 机器学习数学基础:随机事件与随机变量
  8. 盘点深度学习中的各种数据增强技巧
  9. 你就是个普通博士,安心去个三四流高校就可以了!杰青优青不是你努力了就能拿到的......
  10. 清华 NLP 实验室:AI 诗人「九歌」喊你来对对子