【问题标题】:Grunt Add multiple input/output directoriesGrunt 添加多个输入/输出目录
【发布时间】:2017-02-22 08:30:50
【问题描述】:

我正在使用grunt-babel 将我的react-jsx 文件转换为.js

我打算为此编写一个繁重的任务。目前,我有以下

module.exports = function( grunt ) {
    require('load-grunt-tasks')(grunt);
    grunt.initConfig( {

        babel : {
            options : {
                plugins : ['transform-react-jsx'],
                presets: ['es2015', 'react']
            },
            client : {
                expand : true,
                cwd : './react_demo/test/jsx/common',
                src : ['*.jsx'],
                dest : './react_demo/static/react/components',
                ext : '.js'
            }
        }
    } );

    grunt.loadNpmTasks('grunt-babel');
    grunt.registerTask('default', ['babel:client']);

};

在我的上述任务中,我正在将文件夹./react_demo/test/jsx/common 中的所有JSX 文件转换为./react_demo/static/react/components

现在,在我未来的应用程序中,我们可以有多个文件夹,每个文件夹都有自己的一组 JSX 文件,这些文件将进入不同的目标文件夹。

我们可以有这样的文件夹:

  • /react_demo/test/jsx/common -> /react_demo/static/react/components
  • /react/test/jsx/common1 -> /react/static/react/components1
  • /react2/test/jsx/common2 -> /react2/static/react/components2

现在,我如何指定多个src/dest目录并将它们映射在一起?我尝试为 src/dest 提供一个数组,但它抱怨以下错误:

警告:路径必须是字符串。已收到 [ './react_demo/cartridge/scripts/jsx/common' ] 使用 --force 继续。

【问题讨论】:

    标签: javascript reactjs gruntjs jsx grunt-babel


    【解决方案1】:

    几天前,我遇到了这个问题。您可以使用配置文件来实现。

    编写一个配置文件(例如:main-folder/grunt/config.js)文件来注册一些快捷方式、变量以使您的 grunt 任务更加动态。

    例子:

    var demoConfig = { 
        'module1': 'script/module1',
        'module2': 'script/module2',
        'module3': 'script/module3' 
    };
    module.exports = demoConfig ;
    }
    

    并在每个任务中导入此配置: var config = require('../config');

    在 gruntfile.js 中:

    module.exports = function(grunt) {
    grunt.loadNpmTasks('grunt-task');
    var getTasks = function() {
        var jsConfig = require('../config/demoConfig'),
            jsTasks = {};
        for (var key in jsConfig) {
            jsTasks[key] = {
                files: [{
                    expand: true,
                    cwd: './react_demo/test/jsx/' + jsConfig[key],
                    src: '**/*.jsx',
                    dest: './react_demo/static/react/' +jsConfig[key],
                    ext: '.js'
                }]
            };
        }
        return jsTasks;
    };
    grunt.config('babel', getTasks());};
    

    对于您的方案,您可以在此处更改一些功能并完成它。

    希望对你有所帮助。

    有关更多信息,请阅读以下内容: dynamic grunt task with babel

    【讨论】:

      【解决方案2】:

      据我所知,您必须为每个新目的地指定一个新的 babel 目标:

      module.exports = function( grunt ) {
          require('load-grunt-tasks')(grunt);
          grunt.initConfig( {
      
              babel : {
                  options : {
                      plugins : ['transform-react-jsx'],
                      presets: ['es2015', 'react']
                  },
                  client : {
                      expand : true,
                      cwd : './react_demo/test/jsx/common',
                      src : ['*.jsx'],
                      dest : './react_demo/static/react/components',
                      ext : '.js'
                  },
                  common1 : {//add more targets
                      expand : true,
                      cwd : './react/test/jsx/common1',
                      src : ['*.jsx'],
                      dest : './react/static/react/components1',
                      ext : '.js'
                  }//etc..
      
              }
          } );
      
          grunt.loadNpmTasks('grunt-babel');
          grunt.registerTask('default', ['babel:client','babel:common1']);//reg new targets
      
      };
      

      【讨论】:

      • 是的,这就是我的想法。但我在想一定有更好的方法来做到这一点。我会等待更多的答案,否则我会接受你的。干杯!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      相关资源
      最近更新 更多