从Babel AST生成ES6代码而不是ES5代码

时间:2018-04-09 17:39:00

标签: javascript ecmascript-6 babeljs abstract-syntax-tree

我想用S.<name>(<expr>, <expr>)替换源文件中出现的所有S.<name>(<expr>)(<expr>)。我用Esprima和Escodegen写了一些东西来处理我的简单测试用例,但当我给它一个包含JSX和其他非标准结构的文件时失败了。我将代码重写为Babel插件:

'use strict';

module.exports = function(babel) {
  return {visitor: {CallExpression: applyOneByOne}};

  function applyOneByOne(path) {
    if (path.node.arguments.length > 1 &&
        path.node.callee.type === 'MemberExpression' &&
        path.node.callee.object.type === 'Identifier' &&
        path.node.callee.object.name === 'S') {
      path.replaceWith (path.node.arguments.reduce (function(expr, arg) {
        return babel.types.callExpression (expr, [arg]);
      }, path.node.callee));
    }
  }
};

这样可行,但Babel默认生成ES5输出。我想更新ES6源代码本身。是否有可能从Babel AST生成ES6代码而不是ES5代码?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

这应该由预设控制。

最简单的方法是使用babel-preset-env并为其提供所需的环境预设。

例如,

代码:

class A {
  constructor() {
    console.log('example');
  }
}

使用预设的es-2015 gives时:

'use strict';

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var A = function A() {
  _classCallCheck(this, A);

  console.log('example');
};

但是在使用预设es-2016 gives

class A {
  constructor() {
    console.log('example');
  }
}