我想用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代码?如果是这样,怎么样?
答案 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');
}
}