起因
折腾hexo时,看到了其内置主题(landscape)的Gruntfile.js:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46module.exports = function(grunt){
  grunt.initConfig({
    gitclone: {
      fontawesome: {
        options: {
          repository: 'https://github.com/FortAwesome/Font-Awesome.git',
          directory: 'tmp/fontawesome'
        },
      },
      fancybox: {
        options: {
          repository: 'https://github.com/fancyapps/fancyBox.git',
          directory: 'tmp/fancybox'
        }
      }
    },
    copy: {
      fontawesome: {
        expand: true,
        cwd: 'tmp/fontawesome/fonts/',
        src: ['**'],
        dest: 'source/css/fonts/'
      },
      fancybox: {
        expand: true,
        cwd: 'tmp/fancybox/source/',
        src: ['**'],
        dest: 'source/fancybox/'
      }
    },
    _clean: {
      tmp: ['tmp'],
      fontawesome: ['source/css/fonts'],
      fancybox: ['source/fancybox']
    }
  });
  require('load-grunt-tasks')(grunt);
  grunt.renameTask('clean', '_clean');
  grunt.registerTask('fontawesome', ['gitclone:fontawesome', 'copy:fontawesome', '_clean:tmp']);
  grunt.registerTask('fancybox', ['gitclone:fancybox', 'copy:fancybox', '_clean:tmp']);
  grunt.registerTask('default', ['gitclone', 'copy', '_clean:tmp']);
  grunt.registerTask('clean', ['_clean']);
};
发现
在上面的Gruntfile.js文件中,有三个容易被忽视的方法(思路):
临时存储区
作者使用一个tmp目录来临时存放gitclone下来的文件,取出自己需要的部分fontawesome/fonts/和fancybox/source/,然后删掉temp。
自动加载依赖
当你的Gruntfile.js里面只有少数的任务时,是否使用load-grunt-tasks无关紧要;当你有非常多任务需要load时,你就要像下面这样loadNpmTasks下去:1
2
3
4
5
6
7
8//加载插件
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-less');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-contrib-watch');
    ...
    ...
    ...
其实,你只需要像下面这样,使用插件,让它帮你去load依赖。1
require('load-grunt-tasks')(grunt);
使用load-grunt-tasks这个插件的作用就很明显了。
子任务
这点一般大家都知道,不过还是提一下:1
'gitclone:fontawesome'
只执行gitclone的fontawesome子任务。
