做为一个 grunt 党,其配置文件让我欲罢不能,而最近又在全面使用 ES6 的新特性,全面考察以后决定使用 grunt-babel
做为转换工具。在使用的过程当中却碰到一些坑,好比不能直接使用多任务。我的在构建 grunt
的配置文件的时候,习惯针对各个任务创建任务,以便用最小的耗时去打包,好比:javascript
grunt.initConfig({ concat: { global: { src: [ 'src/js-global/**/*.js' ], dest: 'dest/js/global.js' } }, uglify: { global: { src: '<%= concat.global.dest %>', dest: 'dest/js/global.min.js' } } });
在配置 grunt-babel
的时候,却发现这种多任务却不能正常的执行。在查看官方文档以后,发现原来是 babel
下的没有 options
和 dist
,这就致使了 grunt
会忽略整个 babel
任务,如:java
grunt.initConfig({ babel: { test: { options: { presets: [ 'babel-preset-es2015' ] }, files: { 'dest/js/test.js': 'dest/js/test.es6.js' } } } });
咱们须要将其转换成以下的格式才能正常加载配置并能够使用 babel:test
的子任务es6
grunt.initConfig({ babel: { options: { presets: [ 'babel-preset-es2015' ] }, dist: { files: { 'dest/js/test.js': 'dest/js/test.es6.js' } }, test: { files: { 'dest/js/test.js': 'dest/js/test.es6.js' } } } });
虽然有点啰嗦,不过这样仍是可以正常识别任务的,我也本身编写了个转换工具来生成这个配置,不过有个小问题就是 options
是各个子任务的集合npm
const _ = require('lodash'); function transformBabelOptions(config) { if (_.has(config, 'babel')) { var babelOptions = _.reduce(config.babel, (memo, task, taskName) => { var opts = _.get(memo, 'options', {}), files = _.get(memo, 'dist.files', {}), taskOpts = _.get(task, 'options'), taskFiles = _.get(task, 'files'); _.set(memo, 'options', _.extend(opts, taskOpts)); _.set(memo, 'dist.files', _.extend(files, taskFiles)); return memo; }, {}); _.extend(config.babel, babelOptions); } }