grunt打包学习笔记

2018-07-30  本文已影响0人  weiee

检查CAD前端安全的时候发现login.html文件内有<script>代码块,而前端登录在对接COP后实现单点登录似乎不需要login.html文件。全局搜索后发现grunt打包文件中有对login.html操作的代码。而该Gruntfile.js文件似乎有许多无用的代码。因此想学习一下grunt打包文件里几个函数的作用以及命令行输入grunt命令后该文件的执行逻辑。

外部引用模块

var fs = require('fs');在nodejs中,每个文件都被视为独立的模块,nodejs自带核心模块在其源代码的lib/文件目录下,require()总是优先加载核心模块,即使有同名的自定义文件。

module.exports

在每个模块中,module是指向表示当前模块的对象的引用。module.exports用于指定一个模块所要输出的内容,即可通过require()访问。exports只变量在模块内有效,不能作为模块内容输出。而exports.attr可作为模块的属性输出。

grunt.initConfig()

Grunt的task配置都是在 Gruntfile.js文件中的grunt.initConfig()方法中指定的。该方法接受两个参数:

grunt.initConfig({
  pkg: grunt.file.readJSON('package.json'),    //变量
  concat: {}    //task类型
});

task类型属性包括:1. options; 2. 具体的target,target属性又包括:options、files属性。

task: {
  options: {},
  target: {
    files: [],
    options: {}
  }
}

奇怪的是除了Grunt官方网站的tasks章节,我并没有找到针对task的options属性和files属性的说明。

task与target

多个任务可通过不同的target进行配置。执行grunt concat:foo会指定处理concat任务下的foo目标,而执行grunt concat则会遍历concat任务下的所有目标并处理。

options属性

官网中只说明内层options可覆盖外层,即target层覆盖task层,task层覆盖默认值,并未说明options属性的作用。看来要自己挖掘了。

files属性

grunt提供源文件-目标文件映射方式,用于task进行操作。所有的文件格式均支持src与dest属性,而Compact与Files Array格式还支持一些额外的操作属性。

files格式

jshint: {
  foo: {
    src: ['src/x.js', 'src/y.js']
  }
}
concat: {
  foo: {
    files: {
      'dest/a.js': ['src/aa.js', 'src/aaa.js'],
      'dest/a1.js': ['src/aa1.js', 'src/aaa1.js'],
    }
  }
}
concat: {
  foo: {
    files: [
      {src: ['src/a.js', 'src/b.js'], dest: ['dest/a/'], nonull: true},
      {src: ['src/a1.js', 'src/b1.js'], dest: ['dest/a1/'], filter: 'isFile'},
    ]
  }
}

files格式之:grunt通配符

Grunt通过内置支持node-globminimatch 库来匹配文件名(又叫作globbing)。
又是一个自己的不知道的东西TT,前端路漫漫啊
简单常用通配符如下:

动态构建文件对象

compact和files array格式可附加额外的属性,expand设置为true将启用以下选项:

注意:如果不设置expand:true属性,除srcdest属性外,即使添加了其他附加属性,执行grunt时也不可用。

模板

适用<% %>分隔符指定的模板会在任务读取配置时进行自动扩展扫描,模板会被递归的展开。

grunt.loadNpmTasks()

该方法是grunt.task模块下的loadNpmTasks()方法的别名,用于加载外部插件。

grunt.option()

用于在多个任务之间共享参数,访问命令行中设置的参数。例如在命令行中:grunt userTask --target=dev会让grunt.option('target')返回dev。Boolean型参数可直接仅指定key,而省略value。例如,在命令行执行grunt deploy --staging将会使 grunt.option('staging') 返回 true。设置(获取)option:grunt.option(key[, val])

注意:在命令行输入grunt而不填加任何参数,则会默认执行名为default的任务。因此,如果要无参数执行grunt注意要在Gruntfile.js里定义default任务。

// By default, lint and run all tests.
grunt.registerTask('default', ['task']);

grunt.registerTask()

该方法是grunt.task模块下的registerTask ()方法的别名,用于创建任务。支持以下两种类型:

grunt.task.registerTask(taskName, description, taskList)
grunt.task.registerTask(taskName, description, taskFunction)

在任务函数内部,可执行其他的任务:

grunt.registerTask('foo', 'My "foo" task.', function() {
  // Enqueue "bar" and "baz" tasks, to run after "foo" finishes, in-order.
  grunt.task.run('bar', 'baz');
  // Or:
  grunt.task.run(['bar', 'baz']);
});

参考文章:

grunt中文网

上一篇 下一篇

猜你喜欢

热点阅读