grunt学习笔记1 理论知识

你需要检查js语法错误,然后再去压缩js代码。如果这两步你都去手动操作,会耗费很多成本。
Grunt就能让你省去这些手动操作的成本。

“—save-dev”的意思是,在当前目录安装grunt的同时,顺便把grunt保存为这个目录的开发依赖项。看到“开发依赖项”这一次,是不是觉得有些眼熟?
上文在配置package.json时,其中的“devDependencies”中就会存储开发依赖项。

下面就是一些常有grunt开发依赖插件

Contrib-jshint——javascript语法错误检查;
Contrib-watch——实时监控文件变化、调用相应的任务重新执行;
Contrib-clean——清空文件、文件夹;
Contrib-uglify——压缩javascript代码
Contrib-copy——复制文件、文件夹
Contrib-concat——合并多个文件的代码到一个文件中
karma——前端自动化测试工具

使用uglify插件(压缩javascript代码)
Uglify插件的功能就是压缩javascript代码。至于javascript代码压缩的必要和意义有很多,这里就不用说了
几乎每一个javascript类库或者框架,都有一个 **.min.js 压缩版。

“options”中规定允许生成的压缩文件带banner,即在生成的压缩文件第一行加一句话说明。
注意,其中使用到了pkg获取package.json的内容。
banner选项(用于在文件顶部生成一个注释)

npm install -g grunt-cli
上述命令执行完后,grunt 命令就被加入到你的系统路径中了,以后就可以在任何目录下执行grunt命令了。

每次运行grunt 时,他就利用node提供的require()系统查找本地安装的 Grunt。正是由于这一机制,你可以在项目的任意子目录中运行grunt 。

package.json: 此文件被npm用于存储项目的元数据,以便将此项目发布为npm模块。你可以在此文件中列出项目依赖的grunt和Grunt插件,
放置于devDependencies配置段内。

Gruntfile: 此文件被命名为 Gruntfile.js 或 Gruntfile.coffee,用来配置或定义任务(task)并加载Grunt插件的。 此文档中提到的 Gruntfile 其实说的是一个文件,
文件名是 Gruntfile.js 或 Gruntfile.coffee。

package.json应当放置于项目的根目录中,与Gruntfile在同一目录中,并且应该与项目的源代码一起被提交。

过npm install <module> --save-dev命令。此命令不光安装了<module>,还会自动将其添加到devDependencies 配置段中,
遵循tilde version range格式。

build的uglify目标,用于将一个js文件压缩为一个目标文件。

只要在 package.json 文件中被列为dependency(依赖)的包,并通过npm install安装之后,都可以在Gruntfile中以简单命令的形式使用:

通过定义 default 任务,可以让Grunt默认执行一个或多个任务。
这和执行grunt uglify 或者 grunt default的效果一样。default任务列表数组中可以指定任意数目的任务(可以带参数)。

src-dest(源文件-目标文件)文件映射的方式
所有的文件格式都支持src和dest属性
然这并不是一个综合的匹配模式方面的教程,你只需要知道如何在文件路径匹配过程中使用它们即可:

// 指定单个文件:
{src: ‘foo/this.js‘, dest: ...}
// 指定一个文件数组:
{src: [‘foo/this.js‘, ‘foo/that.js‘, ‘foo/the-other.js‘], dest: ...}
// 使用一个匹配模式:
{src: ‘foo/th*.js‘, dest: ...}

// 一个独立的node-glob模式:
{src: ‘foo/{a,b}*.js‘, dest: ...}
// 也可以这样编写:
{src: [‘foo/a*.js‘, ‘foo/b*.js‘], dest: ...}

// foo目录中所有的.js文件,按字母顺序排序:
{src: [‘foo/*.js‘], dest: ...}
// 首先是bar.js,接着是剩下的.js文件,并按字母顺序排序:
{src: [‘foo/bar.js‘, ‘foo/*.js‘], dest: ...}

// 除bar.js之外的所有的.js文件,按字母顺序排序:
{src: [‘foo/*.js‘, ‘!foo/bar.js‘], dest: ...}
// 按字母顺序排序的所有.js文件,但是bar.js在最后。
{src: [‘foo/*.js‘, ‘!foo/bar.js‘, ‘foo/bar.js‘], dest: ...}

// 模板也可以用于文件路径或者匹配模式中:
{src: [‘src/<%= basename %>.js‘], dest: ‘build/<%= basename %>.min.js‘}
// 它们也可以引用在配置中定义的其他文件列表:
{src: [‘foo/*.js‘, ‘<%= jshint.all.src %>‘], dest: ...}

使用<% %>分隔符指定的模板会在任务从它们的配置中读取相应的数据时将自动扩展扫描。
模板会被递归的展开,直到配置中不再存在遗留的模板相关的信息(与模板匹配的)。

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

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

最后设置了一些task。最重要的是default任务:
// 在命令行上输入"grunt test",test task就会被执行。
grunt.registerTask(‘test‘, [‘jshint‘, ‘qunit‘]);

// 只需在命令行上输入"grunt",就会执行default task
grunt.registerTask(‘default‘, [‘jshint‘, ‘qunit‘, ‘concat‘, ‘uglify‘]);
官方文档配置Grungfile.js
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‘]);

};

wrapper函数,这是Node.js的典型写法,使用exports公开API

grunt-contrib-thmlmin options属性
Options 选项

以下选项类型均为布尔型,默认值均为false。

removeComments

删除HTML注释

removeCommentsFromCDATA

删除<script>和<style>标签内的HTML注释

removeCDATASectionsFromCDATA

类型:布尔

默认:false

删除<script>和<style>标签中的CDTA区段

collapseWhitespace

删除文档树中文本节点的空白。不会影响重大的空白,比如在SCRIPT,STYLE,PRE或TEXTAREA等元素内容。

collapseBooleanAttributes

删除布尔属性

<input disabled="disabled"> => <input disabled>

removeAttributeQuotes

删除属性的引号,当安全的情况下。

removeRedundantAttributes

删除多余的属性,像type="text/javascript"。

useShortDoctype

用短的HTML5的<!DOCTYPE html>代替doctype

removeEmptyAttributes

删除空(或空白)属性

removeOptionalTags

一些元素允许省略标签,像</td>

removeEmptyElements

删除空元素

时间: 2024-10-07 03:27:01

grunt学习笔记1 理论知识的相关文章

TestNG学习-001-基础理论知识

此 文主要讲述用 TestNG 的基础理论知识,TestNG 的特定,编写测试过程三步骤,与 JUnit4+ 的差异,以此使亲对 TestNG 测试框架能够有一个简单的认知. 希望能对初学 TestNG 测试框架的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激! TestNG是什么?TestNG是一个灵感来自于 JUnit 和 NUnit 的一个设计用来简化广泛的测试需求的开源自动化测试框架,其引入了一些新的功能,使其功能更强大,而且易于使用,但是 TestNG 不是 JUnit 的扩展.它

C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字节的值,该如何在它上面调用方法? 二:值类型转换为引用类型--装箱 2.1CLR对值类型进行装箱时:新分配托管堆内存,将值类型的实例字段拷贝到新分配的内存中,返回托管堆中新分配对象的地址.这个地址就是一个指向对象的引用. int i = 10; Object obj = i; 三:将引用类型转换为值

[Golong]学习笔记(一) 基础知识

Go编程基础 Go的内置关键字(25个) 不多 break default func interface select case defer go map struct chan else goto package switch const fallthrough if range type continute for import return var Go的注释方法(和js一样) 单行注释: // 多行注释: /**/ Go程序一般结构 common_structure.go 通过 pack

C#学习笔记(基础知识回顾)之枚举

一:枚举的含义 枚举是用户定义的整数类型.在声明一个枚举时,要指定该枚举的示例可以包含的一组可接受的值.还可以给值指定易于记忆的名称.个人理解就是为一组整数值赋予意义. 二:枚举的优势 2.1:枚举可以使代码更易于维护,有助于确保给变量指定合法的.期望的值. 2.2:枚举可以使代码清晰,用描述性的名称来表示整数值,增加代码可读性. 三:枚举的使用 /// <summary> /// 声明一个枚举,审核状态 /// </summary> public enum AduitStatus

CCNA 学习笔记(七)--交换知识(VLAN VTP TRUNK)

前面认识到了路由的相关方面知道,现在我们又要开始交换机方面的学习,现在就从最基础的开始学习交换机的基本知识.路由主要是工作于OSI协议的三层(网络层),而交换机主要是工作于二层(数据链路层),但三层交换除外. 1.路由器与交换机的区别有那些? 答:1.从外观上面来区分:路由器上面的WAN口比交换机的多,交换机一般只有二到四个WAN口,而路由器最少会有四个WAN口,交换机lan口比较多,一般有4/8/16/24/48个. 2.路由器比交换机多一个路由功能,基于路由转发,二层的交换机MAC地址转发,

[傅里叶变换及其应用学习笔记] 一. 预备知识

这份是本人的学习笔记,课程为网易公开课上的斯坦福大学公开课:傅里叶变换及其应用. 本课程学习路线: 从傅里叶级数开始,后续过渡到傅里叶变换. 扼要描述 傅里叶级数(fourier series),几乎等同于周期性现象的学习. 傅里叶变换(fourier transform),可作为傅里叶级数的极限情况,是对非周期性现象的数学分析. 两者间的共同点 分析(analysis),分解一个信号(函数),把它拆分成一系列组成部分,并希望这些组成部分比复杂的原始信号(函数)简单. 合成(synthesis)

.net学习笔记---xml基础知识

一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基础: <?xml version="1.0" encoding="utf-8" ?> <books ISBN="9787544238212"> <title>xml学习笔记</title> <pr

R语言学习笔记:基础知识

1.数据分析金字塔 2.[文件]-[改变工作目录] 3.[程序包]-[设定CRAN镜像] [程序包]-[安装程序包] 4.向量 c() 例:x=c(2,5,8,3,5,9) 例:x=c(1:100) 表示把1 - 100的所有数字都给x这个变量 5.查看x的类型:>mode(x) 6.查看x的长度:>length(x) 7.将两个向量组成一个矩阵: >rbind(x1, x2)  注:r是row的意思,即行,按行组成矩阵. >cbind(x1, x2)  注c是column的意思,

grunt学习笔记(适用初学者)

1.在学习grunt之前,首先要对nodejs有一些简单的理解.安装nodejs的步骤很简单,根据官网的提示安装即可,在此文中将不再累述. http://www.nodejs.org/ 2. Grunt介绍 Grunt是一个自动化的项目构建工具. 如果你需要重复的执行像压缩, 编译, 单元测试, 代码检查以及打包发布的任务. 那么你可以使用Grunt来处理这些任务, 你所需要做的只是配置好Grunt, 这样能很大程度的简化你的工作. 如果在团队中使用Grunt, 你只需要与其他人员约定好使用Gr