grunt-babel 配置多任务

grunt-babel 配置多任务

做为一个 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 下的没有 optionsdist,这就致使了 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);
    }
}
相关文章
相关标签/搜索