使用Babel + grunt与ES6一起工作 - 如何转换require语句?

Ric*_*ard 9 javascript babel gruntjs ecmascript-6

我想开始使用ES6,我想使用grunt来管理我的文件.到目前为止,这是我的项目结构:

Gruntfile.js
package.json
dist/
src/
  index.es6
Run Code Online (Sandbox Code Playgroud)

这是index.es6看起来像:

import MapGL from 'react-map-gl';
const data = [];
const viewport = new Viewport();
Run Code Online (Sandbox Code Playgroud)

这些包都已定义package.json并安装.

如何将此ES6文件转换为ES5 JavaScript?是的,我能够把它变成一种类型的JavaScript,但它根本不会改变require语句.

这是我目前的Gruntfile:

module.exports = function(grunt) {
  require('load-grunt-tasks')(grunt);
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    concat: {
      options: {
        separator: ';'
      },
      dist: {
        src: ['src/**/*.js'],
        dest: 'dist/<%= pkg.name %>.js'
      }
    },
    uglify: {
      options: {
        banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n'
      },
      dist: {
        files: {
          'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>']
        }
      }
    },
    jshint: {
      files: ['src/index.js', 'test/index.js'],
      options: {
        reporterOutput: '',
        esnext: true,
        globals: {
          console: true,
          module: true,
          document: true
        }
      }
    },
    babel: {
        files: {
            expand: true,
            src: ['src/*.es6'],
            ext: '-compiled.js'
        },
        options: {
            sourceMap: true,
            presets: ['babel-preset-es2015']
        }
    },
    watch: {
      files: ['<%= jshint.files %>'],
      tasks: ['babel', 'jshint', 'concat']
    }
  });
  grunt.registerTask('default', ['babel', 'jshint', 'concat', 'uglify']);
};
Run Code Online (Sandbox Code Playgroud)

运行grunt生成以下文件:

Gruntfile.js
package.json
dist/
  myproject.js
src/
  index.es6
  index-compiled.js
  index-compiled.map
Run Code Online (Sandbox Code Playgroud)

但是myproject.js包含var _reactMapGl = require('react-map-gl');在浏览器中失败的行.

Rob*_*obC 24

是的,根据@Matthew Herbst的建议,Browserify将处理importES6模块的绑定.另外一个名为babelify的软件包将有助于处理您的babel浏览器转换.

以下似乎运作良好:

babel-cli而不是babel.

  1. 值得注意的是Babel已经被babel-cli取代为babel 6 (有关更多信息,请参阅他们的博客).所以,首先,从你的package.json(如果它存在!)中删除/卸载它:

    $ npm uninstall babel --save-dev

    ...并卸载grunt-babel:

    $ npm uninstall grunt-babel --save-dev

  2. 安装babel-cli并包括所有es2015插件babel预设:

    $ npm install --save-dev babel-cli babel-preset-es2015

  3. 接下来,创建一个.babelrc文件并将其保存在包含以下代码的项目根目录中:

    {
        "presets": ["es2015"]
    }
Run Code Online (Sandbox Code Playgroud)

grunt-browserify

  1. 接下来,安装grunt-browserify并将其保存到package.json:

    $ npm install grunt-browserify --save-dev

babelify

  1. 安装babelify来处理你的babel browserify转换:

    $ npm install babelify --save-dev

Gruntfile.js

  1. 接下来Gruntfile.js通过删除现有babel任务来更新您:
    // DELETE the following...
    babel: {
        files: {
            expand: true,
            src: ['src/*.es6'],
            ext: '-compiled.js'
        },
        options: {
            sourceMap: true,
            presets: ['babel-preset-es2015']
        }
    },
Run Code Online (Sandbox Code Playgroud)
  1. ... 而是添加以下browserify任务:
    browserify: {
        dist: {
            files: {
                // destination for transpiled js : source js
                'dist/myproject.js': 'src/index.es6'
            },
            options: {
                transform: [['babelify', { presets: "es2015" }]],
                browserifyOptions: {
                    debug: true
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)
  1. 注册您的grunt任务: 您可能还需要更新和更改传递给的数组中的任务顺序grunt.registerTask.对此:
grunt.registerTask('default', [
    'jshint',
    //'concat', <-- Probably don't need to concat the files, assuming index.es6 imports the necessary modules.
    'browserify:dist',
    'uglify'
]);
Run Code Online (Sandbox Code Playgroud)

附加说明:

可能是在使用一些好处反应预置除了ES2015预置 -这将需要修改点2,3,和7的上方相应地,然而,我没有用它自己.

希望这可以帮助!

  • 除了各种例外,上面的例子对我不起作用。似乎“babel-preset-es2015”包已被弃用,取而代之的是这里提到的另一个包:https://babeljs.io/docs/en/env/ grunt 配置选项和“.babelrc”文件都必须使用新的预设进行更新。这里还提到:/sf/ask/3702243191/ (4认同)
  • 这对我有用.如果你得到jshint运行引发的错误,将````esversion":6```添加到gruntfile.js的'jshint'部分 (2认同)
  • 按照上述步骤,我收到以下错误:“致命错误:找不到模块 '@babel/core' babelify@10 需要 Babel 7.x(包 '@babel/core')。如果你想使用 Babel 6.x ('babel-core'),你应该安装'babelify@8'。” 并且能够通过运行 `npm install @babel/core --save-dev` 来修复它 (2认同)
  • 另外,还必须将browserify.dist.options.transform中的预设指定为数组 (2认同)