[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"content-why-babel-exists":3,"$f16qt7wnpclflp":21},{"id":4,"type":5,"slug":6,"title":7,"date":8,"category":9,"tags":10,"body_markdown":13,"permalink":14,"excerpt_src":14,"media_type":14,"media_title":14,"media_author":14,"media_url":14,"rating":14,"layout":14,"pv":15,"admin_only":15,"created_at":16,"updated_at":16,"deleted_at":14,"status":17,"html":18,"excerpt":19,"cover":20},187,"article","why-babel-exists","【问答】为什么会允许babel这种解析工具的存在？","2019-03-28 18:21","web",[11,12],"JavaScript","babel","\n本文来自知乎问题[为什么会允许babel这种解析工具的存在？](https:\u002F\u002Fwww.zhihu.com\u002Fquestion\u002F315934143\u002Fanswer\u002F634975427)\n\n希望提问者真的没有在调侃……因为在我看来，这有点像“何不食肉糜”的提问了。\n\nES6又名ES2015，也就是在2015年定稿的，在定稿之前其实大家已经讨论了很久了。但是光讨论有什么用呢？没有任何一个环境是支持ES6运行的。所以就讨论讨论再讨论，然后大家一拍桌子，好，定稿？\n\n事实上在ES2015之前，ES5可能就是这么定下来的，ES4可能也是这么废弃的。\n\n这时候，就有个神奇的东西，叫6to5出现了，它的第一次提交出现在2012年9月。Initial import · babel\u002Fbabel@aedcd4e 它的作用就是把ES6的代码编译成ES5的代码，它的神奇之处就在于，虽然一个能支持ES6的环境都没有，但是我们仍然可以使用ES6来编写代码。这是一种前所未有的模式，甚至在其它语言中都没有出现过这种模式。（希望不是孤陋寡闻，至少py3 -> py2是没有见到类似工具的。）\n\n于是，我们可以在规范还没有定稿的时候就先用用看，用着觉得不爽了再回去修改规范。这样是不是比拍桌子要科学得多？事实上现在的ES规范制定过程就是这么干的，定了stage 0到stage 4等几个级别，而且规定了需要在多少个环境中先验证，验证完之后才可以定稿发布。基本上可以毫不客气地说，这个东东就是由6to5开创的新局面。\n\n\u003C!-- more -->\n\n当然，在规范发展过程中，浏览器、Node.js等环境也在不断实现ES6规范的特性，6to5的作者自然也清楚，等环境都支持ES6了，可能就没我什么事了。（像题主这样，认为大家都支持就好，不需要编译了。）所以这个作者又开了个脑洞，首先将6to5做了个改名，以便让它的适应范围更广，要不然以后ES 7\u002F8\u002F9出来的时候玩得名不正言不顺的嘛。然后，将所有的转译过程全部插件化，你可以自由选择某个ES6\u002F7\u002F8特性是否要做转换。这样作为一个转译插件，它就可以更好、更长久地生存下去，也能持续为JS社区带来价值。不得不说，作者真是个天才。（据说写6to5的时候还是个高中生……）\n\n这个神奇的6to5后来改的名字，就叫babel。可以说，没有babel就没有JS社区今天在语言规范上的高度繁荣。也就没有提主提问的前提存在了。\n\n（当然，也要承认，在6to5同期也有其它的转译插件，例如来自Google的traceur，但babel一开始在转译后的代码可读性上就有优势，后期改名和插件化又是神来之笔，因此很快胜出。）\n\n再来说今天仍然使用babel的重要性。\n\n首先一个很重要的点，用户用什么鬼玩意你是无法决定的。虽然现在主流浏览器对ES6的支持都能到99%以上，但是如果用户用的safari 8呢？用的IE9呢？用的Android 4.0呢？这一点很多答主都已经解释得很清楚了，不再多说。\n\n第二个点其实在看完上面一大段后也容易理解了，babel != ES6，并不是只有ES6才可以用babel呀。事实上你用的ESM模块化规范import\u002Fexport，并不属于ES6规范，你用的async\u002Fawait也不属于ES6规范，你用的666的解构，也有一部分不属于ES6规范……但是非常幸运的是，babel并不苛求你知道它属不属于ES6，而是默默都帮你处理了。因此，后ES6时代，babel仍然可能长期存在。（这也再次印证作者眼光很毒！）\n\n第三个点，babel除了做ES规范的转译以外，也可以做做别的转译，比如JSX\u002FTS。但这个在我看来不属于babel的主业，而是人们发现babel的转译是万能的，既然在工具链中已经无法缺少了，顺手让它也帮帮忙也无可厚非。\n\n以上。均是个人理解，如有错漏，欢迎评论指正。\n",null,0,"2026-08-28 04:37:17","published","\u003Cp>本文来自知乎问题\u003Ca href=\"https:\u002F\u002Fwww.zhihu.com\u002Fquestion\u002F315934143\u002Fanswer\u002F634975427\">为什么会允许babel这种解析工具的存在？\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>希望提问者真的没有在调侃……因为在我看来，这有点像“何不食肉糜”的提问了。\u003C\u002Fp>\n\u003Cp>ES6又名ES2015，也就是在2015年定稿的，在定稿之前其实大家已经讨论了很久了。但是光讨论有什么用呢？没有任何一个环境是支持ES6运行的。所以就讨论讨论再讨论，然后大家一拍桌子，好，定稿？\u003C\u002Fp>\n\u003Cp>事实上在ES2015之前，ES5可能就是这么定下来的，ES4可能也是这么废弃的。\u003C\u002Fp>\n\u003Cp>这时候，就有个神奇的东西，叫6to5出现了，它的第一次提交出现在2012年9月。Initial import · babel\u002Fbabel@aedcd4e 它的作用就是把ES6的代码编译成ES5的代码，它的神奇之处就在于，虽然一个能支持ES6的环境都没有，但是我们仍然可以使用ES6来编写代码。这是一种前所未有的模式，甚至在其它语言中都没有出现过这种模式。（希望不是孤陋寡闻，至少py3 -&gt; py2是没有见到类似工具的。）\u003C\u002Fp>\n\u003Cp>于是，我们可以在规范还没有定稿的时候就先用用看，用着觉得不爽了再回去修改规范。这样是不是比拍桌子要科学得多？事实上现在的ES规范制定过程就是这么干的，定了stage 0到stage 4等几个级别，而且规定了需要在多少个环境中先验证，验证完之后才可以定稿发布。基本上可以毫不客气地说，这个东东就是由6to5开创的新局面。\u003C\u002Fp>\n\u003Cp>当然，在规范发展过程中，浏览器、Node.js等环境也在不断实现ES6规范的特性，6to5的作者自然也清楚，等环境都支持ES6了，可能就没我什么事了。（像题主这样，认为大家都支持就好，不需要编译了。）所以这个作者又开了个脑洞，首先将6to5做了个改名，以便让它的适应范围更广，要不然以后ES 7\u002F8\u002F9出来的时候玩得名不正言不顺的嘛。然后，将所有的转译过程全部插件化，你可以自由选择某个ES6\u002F7\u002F8特性是否要做转换。这样作为一个转译插件，它就可以更好、更长久地生存下去，也能持续为JS社区带来价值。不得不说，作者真是个天才。（据说写6to5的时候还是个高中生……）\u003C\u002Fp>\n\u003Cp>这个神奇的6to5后来改的名字，就叫babel。可以说，没有babel就没有JS社区今天在语言规范上的高度繁荣。也就没有提主提问的前提存在了。\u003C\u002Fp>\n\u003Cp>（当然，也要承认，在6to5同期也有其它的转译插件，例如来自Google的traceur，但babel一开始在转译后的代码可读性上就有优势，后期改名和插件化又是神来之笔，因此很快胜出。）\u003C\u002Fp>\n\u003Cp>再来说今天仍然使用babel的重要性。\u003C\u002Fp>\n\u003Cp>首先一个很重要的点，用户用什么鬼玩意你是无法决定的。虽然现在主流浏览器对ES6的支持都能到99%以上，但是如果用户用的safari 8呢？用的IE9呢？用的Android 4.0呢？这一点很多答主都已经解释得很清楚了，不再多说。\u003C\u002Fp>\n\u003Cp>第二个点其实在看完上面一大段后也容易理解了，babel != ES6，并不是只有ES6才可以用babel呀。事实上你用的ESM模块化规范import\u002Fexport，并不属于ES6规范，你用的async\u002Fawait也不属于ES6规范，你用的666的解构，也有一部分不属于ES6规范……但是非常幸运的是，babel并不苛求你知道它属不属于ES6，而是默默都帮你处理了。因此，后ES6时代，babel仍然可能长期存在。（这也再次印证作者眼光很毒！）\u003C\u002Fp>\n\u003Cp>第三个点，babel除了做ES规范的转译以外，也可以做做别的转译，比如JSX\u002FTS。但这个在我看来不属于babel的主业，而是人们发现babel的转译是万能的，既然在工具链中已经无法缺少了，顺手让它也帮帮忙也无可厚非。\u003C\u002Fp>\n\u003Cp>以上。均是个人理解，如有错漏，欢迎评论指正。\u003C\u002Fp>\n","\u003Cp>本文来自知乎问题\u003Ca href=\"https:\u002F\u002Fwww.zhihu.com\u002Fquestion\u002F315934143\u002Fanswer\u002F634975427\">为什么会允许babel这种解析工具的存在？\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>希望提问者真的没有在调侃……因为在我看来，这有点像“何不食肉糜”的提问了。\u003C\u002Fp>\n\u003Cp>ES6又名ES2015，也就是在2015年定稿的，在定稿之前其实大家已经讨论了很久了。但是光讨论有什么用呢？没有任何一个环境是支持ES6运行的。所以就讨论讨论再讨论，然后大家一拍桌子，好，定稿？\u003C\u002Fp>\n\u003Cp>事实上在ES2015之前，ES5可能就是这么定下来的，ES4可能也是这么废弃的。\u003C\u002Fp>\n\u003Cp>这时候，就有个神奇的东西，叫6to5出现了，它的第一次提交出现在2012年9月。Initial import · babel\u002Fbabel@aedcd4e 它的作用就是把ES6的代码编译成ES5的代码，它的神奇之处就在于，虽然一个能支持ES6的环境都没有，但是我们仍然可以使用ES6来编写代码。这是一种前所未有的模式，甚至在其它语言中都没有出现过这种模式。（希望不是孤陋寡闻，至少py3 -&gt; py2是没有见到类似工具的。）\u003C\u002Fp>\n\u003Cp>于是，我们可以在规范还没有定稿的时候就先用用看，用着觉得不爽了再回去修改规范。这样是不是比拍桌子要科学得多？事实上现在的ES规范制定过程就是这么干的，定了stage 0到stage 4等几个级别，而且规定了需要在多少个环境中先验证，验证完之后才可以定稿发布。基本上可以毫不客气地说，这个东东就是由6to5开创的新局面。\u003C\u002Fp>\n","",{"total":15,"totalRoots":15,"comments":22,"pv":15},[]]