【问题标题】:Transform ES5 code to ES6 at runtime在运行时将 ES5 代码转换为 ES6
【发布时间】:2016-05-03 05:59:07
【问题描述】:

是否可以选择使用 babel API 将 javascript 代码从 ecma script 5 转换为 ecma script 6? 我的意思是说我使用以下cdn

https://cdnjs.cloudflare.com/ajax/libs/babel-core/6.1.19/browser.js

并使用简单的 ES5 代码提供数组或对象之类的源,并将其转换为 ES6 代码的某个数组/对象/字符串?

是否有可能使用 babel 或其他工具以某种方式实现此目的?

我的意思是使用这里的一些例子,例如.. https://github.com/addyosmani/es6-equivalents-in-es5

如果我输入源 ES5 代码

[1, 2, 3].map(function(n) { return n * 2; }, this);

在 ES6 中转换为箭头函数

[1, 2, 3].map(n => n * 2);

更新

其实我需要的是把ES5代码改成ES6代码,可以通过api实现

例如,我需要 API/开源来做这样的事情(我的代码在左侧)

Link for example

【问题讨论】:

  • 你想要这样的东西吗? lebab.io/try-it
  • @Hugeen - 是的,但我需要转换它的代码/API ...
  • 这仅仅是为了可读性和减少代码大小还是有任何兼容性原因?
  • 我认为这是出于学习目的。

标签: javascript ecmascript-6 babeljs


【解决方案1】:

对于只想在线将ES5 代码转换为ES6 的人。使用Lebab live demo,只需粘贴您的代码,它将转换为ES6

【讨论】:

    【解决方案2】:

    最好的办法是进入Lebabsource code

    打开bin/file.js。阅读所有行以了解该脚本。

    有趣的部分如下:

      var transformer = new Transformer({transformers: transformers});
      transformer.readFile(file[0]);
      transformer.applyTransformations();
      transformer.writeFile(program.outFile);
    

    更具体地说是transformer.applyTransformations();

    让我们打开/src/transformer.js

    在这个文件中我看到了一些有用的功能:

      /**
       * Prepare an abstract syntax tree for given code in string
       *
       * @param string
       */
      read(string) {
    
        this.ast = astGenerator.read(string, this.options);
    
      }
    

    所以你可以将转换器与一串代码(不是文件)一起使用

    现在您可以应用转换“ES5 到 ES6”

      /**
       * Apply All transformations
       */
      applyTransformations() {
    
        for (let i = 0; i < this.transformations.length; i++) {
          let transformation = this.transformations[i];
          this.applyTransformation(transformation);
    
        }
    

    然后,将其重铸成字符串

      out() {
        let result = recast.print(this.ast).code;
    
        if(this.options.formatter) {
          result = formatter.format(result, this.options.formatter);
        }
    
        return result;
      }
    

    总结

    var transformer = new Transformer({});
    transformer.read('var mySourceCode = "in ES5"');
    transformer.applyTransformations();
    console.log(transformer.out());
    

    JSFiddle 演示 here

    如果你不想要所有的转换,你可以选择你想要的选项:

    var transformers = {
      classes: false,
      stringTemplates: false,
      arrowFunctions: true,
      let: false,
      defaultArguments: false,
      objectMethods: false,
      objectShorthands: false,
      noStrict: false,
      importCommonjs: false,
      exportCommonjs: false,
    };
    
    var transformer = new Transformer({transformers: transformers});
    

    JSFiddle 演示 with options

    【讨论】:

    • 非常感谢!我喜欢你的回答:-),1+,这正是我需要直接使用代码(或一些其他 API),你能提供示例 jsFiddle 或其他东西吗?例如,我的输入将类似于 [1, 2, 3].map(function(n) { return n * 2; }, this); out 是 ES 箭头函数代码,我需要它,因为我不知道如何组合在一起......
    • 谢谢 :),假设我想使用只对箭头函数进行转换的代码,你能告诉我我应该使用哪个代码吗?我不想要求所有的库...我想使用代码本身...谢谢!
    • 顺便说一句,jsFiddle 有时会运行,有时不会出现此错误“Uncaught ReferenceError: Lebab is not defined”,知道为什么吗?
    • "假设我想采用只对箭头函数进行转换的代码,你能告诉我应该采用哪个代码吗?"我不知道,也许你可以和options一起玩。无论如何,我想我已经回答了主要问题。
    • 好的,我做了另一个测试,它似乎可以使用选项:jsfiddle.net/Hugeen/cuosht59/2
    【解决方案3】:

    您是在寻找 ES5 到 ES6 还是 ES6 到 ES5 ?你的 jsfiddle 有一个 ES6 源代码。

    我建议在 https://github.com/Daniel15/babel-standalone 上查看 babel-standalone 项目

    我修改了您的 jsfiddle 以使用 ES2015 预设转换代码,这正是您要寻找的:https://jsfiddle.net/bdrg01Lg/

    就这么简单

    var input = 'const getMessage = () => "Hello World";';
    var output = Babel.transform(input, { presets: ['es2015'] }).code;
    

    【讨论】:

    • 我试过你的小提琴,但它不起作用,请看我的更新:) 谢谢!
    • 是的,我知道您正在寻找 ES5 到 ES6。我的解决方案不起作用。
    • 您是否熟悉其他解决方案:?
    【解决方案4】:

    要将 ES5 更改为 ES6,您可以使用 https://www.npmjs.com/package/xto6

    你必须安装它

    npm install -g xto6
    

    然后就是:

    xto6 es5.js -o es6.js
    

    还有gulp插件https://www.npmjs.com/package/gulp-xto6:

    var gulp = require('gulp');
    var xto6 = require('gulp-xto6');
    
    gulp.task('default', function () {
      return gulp.src('path/to/fixtures/es5/*.js')
        .pipe(xto6())
        .pipe(gulp.dest('path/to/fixtures/es6/'));
    });
    

    【讨论】:

    • 谢谢,但我不想使用节点,我想使用一些 API/rest 可以为我提供这些数据,这可能吗?请看我的更新。
    • 请解释一下你的意图。你有一些 ES5 代码。而且您需要放置此代码并获得 es6 代码的方法?但是,如果您不需要它来将文件转换为 ES6,而是使用 ES6 代码动态地工作,那么就没有意义了,因为 ES5 代码将做与 ES6 代码完全相同的事情。你不会看到差异。
    • 谢谢我熟悉节点,但在这个项目中我不能使用它:(,我的问题是是否有其他方法可以做到这一点?让我们从箭头函数功能开始,因为这是开源的( xt06/MIT)我认为可以从中使用一些代码(我可以将代码复制到我的机器......),可以说我只想要箭头函数转换的代码,然后我把代码(就像在我的帖子中一样)并将其转移到 ES6,你能帮忙吗?
    • 这部分你的需求我理解。但是如果这个理论函数将你的代码转换为 ES6 代码,那会怎样呢?我的意思是,如果您将所有文件更改为 ES6,那么您将拥有 ES6 代码,并且您可以继续使用 ES6 进行开发。但是,如果您在代码中仅转换部分,则此代码中的这部分只是字符串。
    • 我想要它是为了学习我想要开发的工具...顺便说一句,请查看我的更新与最后一个链接...我需要一些 API/代码来做到这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2019-09-24
    • 2020-05-29
    • 2016-03-28
    相关资源
    最近更新 更多