Babel
的轉譯過程分爲三個階段: parsing
, transforming
, generating
。babel
只是轉譯新標準引入的語法,好比ES6的箭頭函數轉譯成ES5的函數;而新標準引入的原生對象,部分原生對象新增的原型方法,新增API等(如Proxy
, Set
等),這些babel
是不會轉譯的,須要用戶自行引用polyfill
來解決。瀏覽器
Babel
轉譯過程:
解析parsing
:將代碼字符串解析成抽象語法樹
變換transforming
:對抽象語法樹進行轉換操做
生成generating
:根據變換後的抽象語法樹再生成代碼字符串babel
插件應用於babel
的轉譯過程,尤爲是第二階段transforming
,若是這個階段不使用任何插件的話,babel
會原樣輸出代碼。咱們主要關注第二階段使用的插件,由於tranform
插件會自動使用對應的詞法插件,因此parsing
階段的插件不須要配置app
爲了減小配置轉譯過程當中使用的各種插件的麻煩,babel
官方作了一些預設的插件集。JS
標準爲例,babel
提供了以下的一些preset
:es2015
, es2016
, es2017
, env
es20xx
的preset
只轉譯該年份批准的標準,而env
則代指最新的標準,包括lastest
和es20xx
。
另外,stage-0
到stage-4
的標準成型以前的各個階段,實驗版的presets
函數
stage-0
: 稻草人,只是一個想法,多是babel插件stage-1
: 提案,初步嘗試stage-2
: 初稿,完成初步規範stage-3
: 候選,完成規範和初步的瀏覽器實現stage-4
: 完成,將被添加到下一年度發佈學習
用來處理ES6語法,將其編譯成瀏覽器能夠執行的js語法。ui
module.exports = { ... module: { rules: [{ test: /\.jsx$/ use: { loader: 'babel-loader', options: { presets: ['@babel/preset-env'],//presets設置的就是當前js版本 plugins: [require('@babel/plugin-transform-object-rest-spread')]//須要的插件 } } }] } };
options屬性來給loader傳遞選項插件
polyfill會把ES2015+環境總體引入代碼環境中,讓你的代碼能夠直接使用新標準所引入的新原生對象。rest
要確保在入口處導入polyfill
,由於polyfill
代碼須要在全部代碼前先被調用
module.exports = { entry: ['babel-polyfill', './app/js'] };
babel-plugin-transform-runtime
插件依賴babel-runtime
, babel-plugin-transform-runtime
插件是把js
代碼中使用的新原生對象和靜態方法轉換成對babel-runtime
包的引用。code
未完待續,繼續學習繼續補充哦~
參考文獻
【JavaScript】深刻理解Babel原理及其使用