精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

解剖Babel - 向前端架構師邁出一小步

開發 前端
本文會從Babel的核心功能出發,一步步揭開Babel大家族的神秘面紗,向前端架構師邁出一小步。

[[383627]]

 當聊到Babel的作用,很多人第一反應是:用來實現API polyfill。

事實上,Babel作為前端工程化的基石,作用遠不止這些。

作為一個龐大的家族,Babel生態中有很多概念,比如:preset、plugin、runtime等。

這些概念使初學者對Babel望而生畏,對其理解也止步于webpack的babel-loader配置。

本文會從Babel的核心功能出發,一步步揭開Babel大家族的神秘面紗,向前端架構師邁出一小步。

Babel是什么

  • Babel 是一個 JavaScript 編譯器。

作為JS編譯器,Babel接收輸入的JS代碼,經過內部處理流程,最終輸出修改后的JS代碼。


在Babel內部,會執行如下步驟:

  1. 將Input Code解析為AST(抽象語法樹),這一步稱為parsing
  2. 編輯AST,這一步稱為transforming
  3. 將編輯后的AST輸出為Output Code,這一步稱為printing

Babel倉庫[1]的源代碼,可以發現:Babel是一個由幾十個項目組成的Monorepo。

其中babel-core提供了以上提到的三個步驟的能力。

在babel-core內部,更細致的講:

  • babel-parser實現第一步
  • babel-generator實現第三步

要了解第二步,我們需要簡單了解下AST。

AST的結構

進入AST explorer[2],選擇@babel/parser作為解析器,在左側輸入:

  1. const name = ['ka''song']; 

可以解析出如下結構的AST,他是JSON格式的樹狀結構:


在babel-core內部:

  • babel-traverse可以通過「深度優先」的方式遍歷AST樹
  • 對于遍歷到的每條路徑,babel-types提供用于修改AST節點的節點類型數據

所以,整個Babel底層編譯能力由如下部分構成:


當我們了解Babel的底層能力后,接下來看看基于這些能力,上層能實現什么功能?

Babel的上層能力

基于Babel對JS代碼的編譯處理能力,Babel最常見的上層能力為:

  • polyfill
  • DSL轉換(比如解析JSX)
  • 語法轉換(比如將高級語法解析為當前可用的實現)

由于篇幅有限,這里僅介紹polyfill與「語法轉換」相關功能。

polyfill

作為前端,最常見的Babel生態的庫想必是@babel/polyfill與@babel/preset-env。

使用@babel/polyfill或@babel/preset-env可以實現高級語法的降級實現以及API的polyfill。

從上文我們知道,Babel本身只是JS的編譯器,以上兩者的轉換功能是誰實現的呢?

答案是:core-js

core-js簡介

core-js是一套模塊化的JS標準庫,包括:

  • 一直到ES2021的polyfill
  • promise、symbols、iterators等一些特性的實現
  • ES提案中的特性實現
  • 跨平臺的WHATWG / W3C特性,比如URL

[[383630]]

core-js作者Denis Pushkarev

core-js倉庫[3]看到,core-js也是由多個庫組成的Monorepo,包括:

  • core-js-builder
  • core-js-bundle
  • core-js-compat
  • core-js-pure
  • core-js

我們介紹其中幾個庫:

core-js

core-js提供了polyfill的核心實現。

  1. import 'core-js/features/array/from';  
  2. import 'core-js/features/array/flat';  
  3. import 'core-js/features/set';         
  4. import 'core-js/features/promise';     
  5.  
  6. Array.from(new Set([1, 2, 3, 2, 1]));          // => [1, 2, 3] 
  7. [1, [2, 3], [4, [5]]].flat(2);                 // => [1, 2, 3, 4, 5] 
  8. Promise.resolve(32).then(x => console.log(x)); // => 32 

直接使用core-js會污染全局命名空間和對象原型。

比如上例中修改了Array的原型以支持數組實例的flat方法。

core-js-pure

core-js-pure提供了獨立的命名空間:

  1. import from from 'core-js-pure/features/array/from'
  2. import flat from 'core-js-pure/features/array/flat'
  3. import Set from 'core-js-pure/features/set'
  4. import Promise from 'core-js-pure/features/promise'
  5.  
  6. from(new Set([1, 2, 3, 2, 1]));                // => [1, 2, 3] 
  7. flat([1, [2, 3], [4, [5]]], 2);                // => [1, 2, 3, 4, 5] 
  8. Promise.resolve(32).then(x => console.log(x)); // => 32 

這樣使用不會污染全局命名空間與對象原型。

core-js-compat

core-js-compat根據Browserslist維護了不同宿主環境、不同版本下對應需要支持特性的集合。

Browserslist[4]提供了不同瀏覽器、node版本下ES特性的支持情況

[[383631]]

Browserslist

比如:

  1. "browserslist": [ 
  2.     "not IE 11"
  3.     "maintained node versions" 
  4.   ] 

代表:非IE11的版本以及所有Node.js基金會維護的版本。

@babel/polyfill與core-js關系

@babel/polyfill可以看作是:core-js加regenerator-runtime。

  • regenerator-runtime是generator以及async/await的運行時依賴

單獨使用@babel/polyfill會將core-js全量導入,造成項目打包體積過大。

  • Babel v7.4.0[5]開始,@babel/polyfill被廢棄了,可以直接引用core-js與regenerator-runtime替代

為了解決全量引入core-js造成打包體積過大的問題,我們需要配合使用@babel/preset-env。

preset的含義

在介紹@babel/preset-env前,我們先來了解preset的意義。

初始情況下,Babel沒有任何額外能力,其工作流程可以描述為:

  1. const babel = code => code; 

其通過plugin對外提供介入babel-core的能力,類似webpack的plugin對外提供介入webpack編譯流程的能力。

plugin分為幾類:

  • @babel/plugin-syntax-*語法相關插件,用于新的語法支持。比如babel-plugin-syntax-decorators[6]提供decorators的語法支持
  • @babel/plugin-proposal-*用于ES提案的特性支持,比如babel-plugin-proposal-optional-chaining是可選鏈操作符特性支持
  • @babel/plugin-transform-*用于轉換代碼,transform插件內部會使用對應syntax插件

多個plugin組合在一起形成的集合,被稱為preset。

@babel/preset-env

使用@babel/preset-env,可以「按需將core-js中的特性打包,這樣可以顯著減少最終打包的體積。

這里的「按需」,分為兩個粒度:

  • 宿主環境的粒度。根據不同宿主環境將該環境下所需的所有特性打包
  • 按使用情況的粒度。僅僅將使用了的特性打包

我們來依次看下。

宿主環境的粒度

當我們按如下參數在項目目錄下配置browserslist文件(或在@babel/preset-env的targets屬性內設置,或在package.json的browserslist屬性中設置):

  1. not IE 11 
  2. maintained node versions 

會將「非IE11」且「所有Node.js基金會維護的node版本」下需要的特性打入最終的包。

顯然這是利用了剛才介紹的core-js這個Monorepo下的core-js-compat的能力。

按使用情況的粒度

更理想的情況是只打包我們使用過的特性。

這時候可以設置@babel/preset-env的useBuiltIns屬性為usage。

比如:

a.js:

  1. var a = new Promise(); 

b.js:

  1. var b = new Map(); 

當宿主環境不支持promise與Map時,輸出的文件為:

a.js:

  1. import "core-js/modules/es.promise"
  2. var a = new Promise(); 

b.js:

  1. import "core-js/modules/es.map"
  2. var b = new Map(); 

當宿主環境支持這兩個特性時,輸出的文件為:

a.js:

  1. var a = new Promise(); 

b.js:

  1. var b = new Map(); 

進一步優化打包體積

打開babel playground[7],輸入:

  1. class App {} 

會發現編譯出的結果為:

  1. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 
  2.  
  3. var App = function App() { 
  4.   "use strict"
  5.  
  6.   _classCallCheck(this, App); 
  7. }; 

其中_classCallCheck為輔助方法。

如果多個文件都使用了class特性,那么每個文件打包對應的module中都將包含_classCallCheck。

為了減少打包體積,更好的方式是:需要使用「輔助方法」的module都從同一個地方引用,而不是自己維護一份。

@babel/runtime包含了Babel所有「輔助方法」以及regenerator-runtime。

單純引入@babel/runtime還不行,因為Babel不知道何時引用@babel/runtime中的「輔助方法」

所以,還需要引入@babel/plugin-transform-runtime。

這個插件會在編譯時將所有使用「輔助方法」的地方從「自己維護一份」改為從@babel/runtime中引入。

所以我們需要將@babel/plugin-transform-runtime置為devDependence,因為他在編譯時使用。

將@babel/runtime置為dependence,因為他在運行時使用。

總結

本文從底層向上介紹了前端日常業務開發會接觸的Babel大家族成員。他們包括:

底層

@babel/core(由@babel/parser、@babel/traverse、@babel/types、@babel/generator等組成)

他們提供了Babel編譯JS的能力。

注:這里@babel/core為庫名,前文中babel-core為其在倉庫中對應文件名

中層

@babel/plugin-*

Babel對外暴露的API,使開發者可以介入其編譯JS的能力

上層

@babel/preset-*

日常開發會使用的插件集合。

對于立志成為前端架構師的同學,Babel是前端工程化的基石,學懂、會用他是很有必要的。

能看到這里真不容易,給自己鼓鼓掌吧。

參考資料

[1]Babel倉庫:

https://github.com/babel/babel/tree/main/packages

[2]AST explorer:

https://astexplorer.net

/[3]core-js倉庫:

https://github.com/zloirock/core-js/tree/master/packages

[4]Browserslist:

https://github.com/browserslist/browserslist

[5]Babel v7.4.0:

https://babeljs.io/docs/en/babel-polyfill#docsNav

[6]babel-plugin-syntax-decorators:

https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-decorators

[7]babel playground:

https://babeljs.io/repl#?browsers=&build=&builtIns=false&spec=false&loose=false&code_lz=MYGwhgzhAECCAO9oG8C-Q&debug=false&forceAllTransforms=false&shippedProposals=false&circleciRepo=&evaluate=false&fileSize=false&timeTravel=false&sourceType=script&lineWrap=true&presets=env&prettier=false&targets=&version=7.13.7&externalPlugins=babel-plugin-transform-regenerator%406.26.0

 

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2021-03-16 14:29:05

postCSS前端架構師

2013-10-09 09:32:58

2024-10-24 23:40:34

2016-11-07 13:31:24

2017-09-22 11:18:19

2009-12-17 17:40:45

架構師

2017-03-30 16:41:07

互聯網

2020-06-28 14:15:52

前端架構師互聯網

2018-03-15 13:14:59

思科網絡技術智慧系統

2018-02-10 11:24:39

Python數據程序

2020-07-22 22:10:34

互聯網物聯網IOT

2012-10-22 10:01:45

TD-LTETD-LTE頻譜TDD頻譜

2012-09-06 13:12:41

架構師ArchSummit

2020-11-11 09:37:56

芯片

2012-06-17 12:58:04

架構師架構

2021-05-14 05:26:25

前端架構開發

2023-09-18 14:39:02

2011-11-28 14:59:47

華為

2017-03-07 15:54:13

華為

2020-08-24 08:50:12

架構師TL技術
點贊
收藏

51CTO技術棧公眾號

96av在线| 久久这里只有精品免费| 在线看欧美视频| 国产精品久久久一区麻豆最新章节| 91天堂在线观看| 日韩av综合在线| 日韩欧美不卡| 亚洲国产日韩一区| 一个色综合久久| 极品视频在线| 亚洲特黄一级片| 久久96国产精品久久99软件| 91美女精品网站| 国产欧美日本| 欧美另类交人妖| 自拍偷拍视频亚洲| 大奶在线精品| 欧美日韩国产美| 欧美综合在线播放| 黄色国产网站在线播放| 91麻豆国产自产在线观看| 国产欧美精品日韩精品| 亚洲免费在线观看av| 91精品天堂福利在线观看| 日韩毛片中文字幕| 青青草精品在线| 99久久精品一区二区成人| 亚洲国产成人91porn| 中文字幕欧美人与畜| 国产无套粉嫩白浆在线2022年| 国产精品一区在线观看你懂的| 国产精品91在线| 成人免费看片98欧美| 欧美一区二区三区免费看| 亚洲午夜av电影| 中国黄色片视频| 久久爱www.| 欧美日韩aaa| 丝袜制服一区二区三区| 中文字幕在线官网| 天天影视色香欲综合网老头| 国产专区在线视频| 久做在线视频免费观看| 国产蜜臀97一区二区三区| 女同一区二区| 手机福利在线| 99国产精品视频免费观看| 97久久精品午夜一区二区| 国产精品国产av| 久久国产精品99久久人人澡| 国产精品久久久久秋霞鲁丝| 尤物视频免费观看| 丝袜美腿亚洲一区二区图片| 欧美亚洲成人免费| 天天做天天爱夜夜爽| 国产欧美一级| 6080yy精品一区二区三区| 日韩精品一卡二卡| 亚洲视频二区| 日韩美女视频免费看| 无码人妻精品一区二区| 久久久久久穴| 国产精品678| 怡红院男人的天堂| 欧美aaa在线| 成人欧美一区二区三区黑人孕妇| 在线观看免费黄色小视频| 精一区二区三区| 5566av亚洲| 日韩专区第一页| 91蜜桃在线免费视频| 欧美一区二区三区在线播放| 都市激情一区| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲女同二女同志奶水| 91一区二区| 欧美激情高清视频| 国产精品免费精品一区| 日本aⅴ亚洲精品中文乱码| 国产欧美日韩中文字幕| 国内精品国产成人国产三级| 波多野结衣中文字幕一区二区三区 | 91女神在线观看| 91精品国产一区二区在线观看| 日韩一区二区中文字幕| 日韩片在线观看| 欧美熟乱15p| 欧美美女操人视频| 亚洲精品中文字幕乱码三区91| 久久成人综合网| 国产伦精品一区二区三区高清版| 免费在线黄色电影| 亚洲人成影院在线观看| 久久久一本二本三本| 狠狠久久综合| 亚洲精品国产拍免费91在线| 国产无遮挡在线观看| 国产精品theporn| 国产精品video| 亚洲毛片在线播放| 中文一区二区在线观看 | 久久九九精品| 国产日韩在线观看av| 日韩一区免费视频| 18成人在线视频| av观看免费在线| 看亚洲a级一级毛片| 亚洲色图校园春色| 精品处破女学生| 美女性感视频久久| 久久涩涩网站| 成人影音在线| 欧美一区二区三区不卡| 久久久久亚洲av成人无码电影| 欧美日韩视频| 成人高h视频在线| 欧美理论在线观看| 亚洲成人av电影在线| 91丝袜超薄交口足| 日韩在线理论| 国产精品草莓在线免费观看| 天天干视频在线观看| 亚洲激情成人在线| 欧美wwwwwww| 成人无号精品一区二区三区| 欧美在线视频网| 天堂中文网在线| 亚洲伊人伊色伊影伊综合网| www.com久久久| av中文一区| 国产成+人+综合+亚洲欧美丁香花| 亚洲精品视频91| 亚洲欧美aⅴ...| 亚洲av无日韩毛片久久| 久久国产精品亚洲人一区二区三区 | 日本一区福利在线| 久久久久久久久久久免费| 99热这里只有精品在线| 中文字幕一区二区视频| 污色网站在线观看| 日韩在线视屏| 国产欧美日韩丝袜精品一区| 91网在线播放| 欧美日韩一区二区在线观看视频| 国产免费无遮挡吸奶头视频| 久久久国产亚洲精品| 免费看污久久久| 韩国主播福利视频一区二区三区| 精品调教chinesegay| 精品欧美一区二区三区免费观看| 99久久婷婷国产精品综合| 99热亚洲精品| 香蕉久久夜色精品国产更新时间| 91极品视频在线| 色猫av在线| 在线欧美日韩精品| 欧美日韩国产一二三区| 精品一区二区三区视频| 狠狠噜天天噜日日噜| 999在线精品| 91成人在线视频| 国产区视频在线| 欧美日韩国产中文| 18岁成人毛片| av资源站一区| 国产淫片av片久久久久久| 欧美裸体在线版观看完整版| 国产欧美精品在线播放| av在线免费网址| 亚洲第一视频网站| 日韩色图在线观看| 中文av一区二区| 成人免费黄色小视频| a黄色在线观看| 91精品1区2区| 免费成人深夜蜜桃视频| 国产在线精品一区二区夜色| 黄色片免费在线观看视频| 国产精品主播在线观看| 日本久久久a级免费| 国产视频二区在线观看| 99自拍视频在线| 欧美h版在线观看| 欧美肥婆姓交大片| 婷婷亚洲一区二区三区| 欧美影院一区二区| 亚洲最大的黄色网址| 成人激情动漫在线观看| 日韩中文字幕二区| 亚洲精品a级片| 含羞草久久爱69一区| 国产在线美女| 色先锋资源久久综合5566| 亚洲精品国产一区二| 色美美综合视频| www青青草原| 久久久精品tv| 丰满人妻一区二区三区大胸 | 五月激情丁香网| 亚洲精品日日夜夜| 久久久久久亚洲中文字幕无码| 国产乱对白刺激视频不卡| 熟女性饥渴一区二区三区| 亚洲综合自拍| 日本在线观看不卡| 成人动态视频| 成人黄在线观看| 亚洲一区站长工具| 欧美激情国产精品| 午夜视频在线观看网站| 亚洲精品一区中文字幕乱码| 国产suv精品一区二区69| 欧美在线影院一区二区| 五月婷婷开心网| 一区二区三区丝袜| 俄罗斯毛片基地| 91色九色蝌蚪| 精品一区二区三区四区五区六区| 久久成人精品无人区| 女人扒开屁股爽桶30分钟| 欧美日韩国产色综合一二三四| 亚洲精品乱码久久久久久蜜桃91| 亚洲成aⅴ人片久久青草影院| 成人9ⅰ免费影视网站| 国产精品黄色片| 国产成人福利网站| 在线高清av| 91精品国产91久久久久久不卡| 在线视频中文字幕第一页| 这里只有精品丝袜| 久热av在线| 亚洲九九九在线观看| 污视频网站在线播放| 亚洲成人激情视频| 成人午夜免费福利| 欧美刺激脚交jootjob| 精品二区在线观看| 日韩欧美一级二级三级久久久| 国产免费无遮挡| 欧美美女视频在线观看| 亚洲视频一区二区三区四区| 欧美体内she精视频| 最近中文字幕在线观看视频| 日本韩国一区二区| 性高潮视频在线观看| 在线看日韩精品电影| 久久久国产免费| 欧美亚洲精品一区| 一级黄色片免费看| 88在线观看91蜜桃国自产| 一级爱爱免费视频| 欧美一级理论片| 成 人 黄 色 片 在线播放| 日韩欧美一卡二卡| 天天操天天干天天操| 日韩精品中文字幕在线| 国产乱子伦三级在线播放| 一本色道久久综合狠狠躁篇的优点| 国产福利第一视频在线播放| 在线播放国产一区二区三区| 中文字幕日本在线| 欧美成人h版在线观看| 欧美大片黄色| 国产91精品青草社区| 欧美一级大黄| 国产欧美精品一区二区三区-老狼| 国产精品亚洲一区二区在线观看| 国产高清自拍一区| 亚洲免费成人av在线| 亚洲欧美成人一区| 一本一本久久a久久综合精品| 黄色激情在线视频| 日韩黄色免费电影| 一级黄色片在线免费观看| 国产jizzjizz一区二区| 一级黄色片大全| 亚洲图片欧美激情| 国产乡下妇女做爰视频| 色94色欧美sute亚洲线路一久 | 精品国产伦一区二区三区观看方式| 熟妇高潮一区二区高潮| 中文字幕久精品免费视频| 1024在线播放| 日本最新高清不卡中文字幕| 日日夜夜亚洲| 久久国产精品一区二区三区四区 | 裸体大乳女做爰69| aa亚洲婷婷| 性欧美在线视频| 97精品视频在线观看自产线路二| 精品人妻一区二区三区蜜桃视频| 亚洲免费在线视频一区 二区| 中国一级免费毛片| 69堂成人精品免费视频| 五月天婷婷在线播放| 日韩一区二区欧美| 色老头在线一区二区三区| 成人在线国产精品| 午夜欧洲一区| 欧美日韩dvd| 日本视频在线一区| 国产熟女高潮一区二区三区 | 日韩欧美三级在线观看| 欧美三级电影在线看| 五月天婷婷视频| 久久6免费高清热精品| 欧美日韩在线精品一区二区三区激情综合| 97久久精品午夜一区二区| 成人羞羞动漫| 夫妻免费无码v看片| 国产在线看一区| 99在线视频免费| 日韩欧美国产高清91| 黑人操亚洲女人| 久久久国产一区| 99久久综合国产精品二区| 精品免费视频123区| 欧美特黄一区| 一级 黄 色 片一| 国产精品美女久久久久高潮| 91精品国产高清一区二区三密臀| 欧美videos中文字幕| 黄色片网站在线| 91精品久久久久| 日韩成人激情| 冲田杏梨av在线| 国产女主播视频一区二区| 中文字幕在线欧美| 精品视频在线导航| 午夜av不卡| 久久涩涩网站| 亚洲永久字幕| 蜜桃精品成人影片| 欧美日韩国产丝袜美女| 四虎精品成人免费网站| 欧美亚洲国产视频| 日本亚洲不卡| 欧美精品色婷婷五月综合| 久久伊99综合婷婷久久伊| 久久精品国产成人av| 精品亚洲男同gayvideo网站| 涩涩视频网站在线观看| 久久久久无码国产精品一区| 亚洲少妇一区| 国产中年熟女高潮大集合| 色婷婷av一区二区三区大白胸| 每日更新av在线播放| 日韩美女写真福利在线观看| 精品国产一级毛片| 一路向西2在线观看| 中文字幕一区二区三区乱码在线| 91精品国产综合久| 久久国产精品久久久| 日韩在线观看免费全| 国产熟女高潮一区二区三区| 亚洲一区二区三区中文字幕| 性一交一乱一精一晶| 久久99青青精品免费观看| 少妇精品在线| 国产成a人亚洲精v品在线观看| 国产福利一区二区三区| 91精品国产高潮对白| 精品夜色国产国偷在线| 91精品美女| 蜜臀av.com| 99视频有精品| 亚洲av无码不卡| www.亚洲男人天堂| 一区二区在线免费播放| 亚洲熟妇国产熟妇肥婆| 国产亚洲一区二区三区在线观看| 在线免费观看一级片| 欧美成人亚洲成人| 青青草久久爱| 欧美午夜aaaaaa免费视频| 亚洲久草在线视频| 五月婷婷激情在线| 国产精品日韩欧美综合| 欧美高清日韩| 成年人网站免费看| 69堂国产成人免费视频| 老色鬼在线视频| 中国一区二区三区| 99久久久国产精品| 中文字幕有码无码人妻av蜜桃| 久久成人精品一区二区三区| 欧美色图婷婷| 男女视频在线看| 香蕉成人伊视频在线观看| 成年网站在线| 国产一级特黄a大片99| 日本成人在线不卡视频| 精品无码免费视频| 少妇久久久久久| 色狠狠久久av综合| 国内av一区二区| 日韩欧美在线视频观看| 羞羞的视频在线看| 日韩亚洲欧美精品| 不卡视频一二三四|