Javascript 为什么Babel6需要一些(不必要的)代码转换
在这个简单的巴别塔(6.1.18)示例中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
Babel--presets es2015 test.js
transforms:
'use strict'; // enable strict mode
(function () {
const A = 3;
}());
到
这主要是出于好奇,但我有兴趣更好地理解原因:
-分号在第一行中的位置已移至另一行
-iife的语法已从
(function(){}())更改
到(函数(){})()代码>巴贝尔是一种传输工具,其工作方式与编译器非常相似:
Babel对代码执行词法分析。这意味着它被标记化了<代码>(function(){})(
成为一个令牌流,例如“(“function”(“)”)”…
因此,您可以看到,有几种方法可以编写相同的代码,但是当执行语义分析和代码生成时,会生成相同的代码。抽象语法树不保留格式信息,例如调用括号是在分组运算符的外部还是内部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;
})();