Javascript 为什么Babel6需要一些(不必要的)代码转换

Javascript 为什么Babel6需要一些(不必要的)代码转换,javascript,ecmascript-6,babeljs,Javascript,Ecmascript 6,Babeljs,在这个简单的巴别塔(6.1.18)示例中Babel--presets es2015 test.jstransforms: 'use strict'; // enable strict mode (function () { const A = 3; }()); 到 这主要是出于好奇,但我有兴趣更好地理解原因: -分号在第一行中的位置已移至另一行 -iife的语法已从(function(){}())更改到(函数(){})()巴贝尔是一种传输工具,其工作方式与编译器非常相似: Babe

在这个简单的巴别塔(6.1.18)示例中
Babel--presets es2015 test.js
transforms:

'use strict'; // enable strict mode

(function () {
    const A = 3;
}());

这主要是出于好奇,但我有兴趣更好地理解原因: -分号在第一行中的位置已移至另一行
-iife的语法已从
(function(){}())更改
(函数(){})()

巴贝尔是一种传输工具,其工作方式与编译器非常相似:

  • Babel对代码执行词法分析。这意味着它被标记化了<代码>(function(){})(
  • 成为一个令牌流,例如
    “(“function”(“)”)”…

  • babel创建了一个语法树。代表您的程序的线性令牌流被转换成如下树:

  • babel然后对您的代码执行语义分析。它会检查错误,确保您的代码是合法的ECMA6代码,添加缺少的分号,并确保语法树是合法的程序

  • babel从语法树生成javascript代码


  • 因此,您可以看到,有几种方法可以编写相同的代码,但是当执行语义分析和代码生成时,会生成相同的代码。

    抽象语法树不保留格式信息,例如调用括号是在分组运算符的外部还是内部r、 实际上,分组运算符(
    (…)
    )是

    这就是为什么人们正在开发一个包含这些信息,然后代码生成器可以使用这些信息来更接近原始源代码的程序


    如果代码的某一部分没有更改(例如),有些工具可以重用原始代码,但由于Babel主要专注于为浏览器传输代码,这一点可能就不那么重要了。随着Babel越来越成为一个平台,这一点可能会改变。

    它并不是真的决定在可以保持原样的情况下转换此代码……而是Babel总是使用特定的语法来输出特定的结构。您可以r输入被分解成一个抽象语法树,然后重新组装成Javascript代码这里是硬编码输出这些特定的案例。仅此而已。您可能会问为什么它以这种特定的格式输出东西,但担心为什么这个输入被转换成这个输出是毫无意义的。我确实理解巴贝尔是如何工作的,但我希望它在不需要时不那么干扰。我使用我给出的例子显示了两种情况,Babel实际上不需要传输任何东西。我文件的语法树已经包含了一个“use strict”语句,iife生成了相同的代码。但是
    (function(){}());
    的语法树与
    (function(){})();
    -这不仅仅是空白。所以肯定还有其他原因。@Bergi:这是同一个语法树,至少遵循ESTree规范。@FelixKling:所以ESTree省略了分组运算符?好吧,这似乎是合理的。这正是我感兴趣的。Babel从AST重新生成代码。这显然更像是我一厢情愿的想法假设Babel在传输我的代码时使用最小干扰的方法。我想没有人会真正关心,但我非常欣赏“重铸式”方法,其中只进行绝对必要的更改,我的代码保留尽可能多的“我的”代码。谢谢!
    'use strict' // enable strict mode
    ;
    (function () {
        var A = 3;
    })();