babel
介紹Babel
是一個 JavaScript 編譯器
,能夠把ES6
的語法轉爲兼容瀏覽器的ES5
語法;Babel
能夠單獨使用,可是通常都是和webpack
結合一塊兒使用webpack
裏使用babel
最基本的幾個包:babel-loader
、 babel-core
、babel-preset-env
、babel-polyfill
@babel/core
@babel/core
包括了整個babel
的工做流(輸入字符串 -> @babel/parser parser -> AST -> transformer[s] -> AST -> @babel/generator -> 輸出字符串
),是babel
的核心包。babel
的編譯器。babel
的核心 api
都在這裏面,好比 transform
,主要都是處理轉碼的。它會把咱們的 js
代碼,抽象成 ast
,即 abstract syntax tree
的縮寫,是源代碼的抽象語法結構的樹狀表現形式。js
語法的樹狀結構。也就是說 es6
的新語法,跟老語法是不同的,那咱們怎麼去定義這個語法呢。因此必需要先轉成 ast
,去發現這個語法的 kind
,分別作對應的處理,才能轉化成 es5
.@babel/preset-env
Babel
插件通常儘量拆成小的力度,開發者能夠按需引進。好比對ES6
轉ES5
的功能,Babel
官方拆成了20+個插件。transform-es2015-arrow-functions
插件就能夠,而不是加載ES6
全家桶。ES5
,插件逐個引入的方式使人抓狂,不單費力,並且容易出錯。Babel Preset
。Babel Preset
視爲Babel Plugin
的集合。preset
真是神器啊,它能根據當前的運行環境,自動肯定你須要的 plugins
和 polyfills
。Plugin
與Preset
執行順序:能夠同時使用多個Plugin
和Preset
,此時,它們的執行順序很是重要。先執行完全部Plugin
,再執行Preset
。多個Plugin
,按照聲明次序順序執行。多個Preset
,按照聲明次序逆序執行。browserslist
browserslist
指定了項目的目標瀏覽器的範圍。這個值會被 @babel/preset-env
和 Autoprefixer
用來肯定須要轉譯的 JavaScript
特性和須要添加的 CSS
瀏覽器前綴。html
三種方式去配置:前端
.babelrc
或者babel.config.js
中去配置{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "4",
"chrome": "58",
"ie": "11"
}
}
]
]
}
複製代碼
package.json
裏面增長以下配置{
"browserslist": [
"last 1 version",
"> 1%",
"maintained node versions",
"not dead"
]
}
複製代碼
.browerslistrc
配置文件last 1 version
> 1%
maintained node versions
not dead
複製代碼
除了browserslist
,另外還要在webpack.config.js
中配置babel-loader
node
module: {
rules: [
{ ...其餘loader...},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
}
]
}
複製代碼
package.json
中也要配置相關的依賴webpack
"dependencies": {
"babel-polyfill": "^6.26.0",
},
"devDependencies": {
"babel-core": "^6.22.1",
"babel-loader": "^7.1.1",
"babel-preset-env": "^1.3.2",
},
複製代碼
要用@babel/polyfill
的話,還要在入口文件中引入 es6
@babel/polyfill
&runtime
&core-js
Babel
默認只轉換新的JavaScript
語法(syntax
),如箭頭函數等,而不轉換新的API
,好比Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise
等全局對象,以及一些定義在全局對象上的方法(好比Object.assign
)都不會轉碼;因此光是使用@babel/preset-env
是不夠的,咱們還須要polyfill
;@babel/polyfill
——讓目標瀏覽器支持全部特性,無論它是全局的,仍是原型的,或是其它。這樣,經過 @babel/polyfill
,不一樣瀏覽器在特性支持上就站到同一塊兒跑線。可是這樣作也有一個缺點,就是會污染全局變量,並且項目打包之後體積會增大不少,由於把整個依賴包也搭了進去。因此並不推薦在一些方法類庫中去使用。@babel/preset-env
下有一個選項useBuiltIns
,用於指導 @babel/preset-env
如何觸發 polyfills
.useBuiltIns
有三個可能的值 usage | entry | false
。usage:根據實際項目中真正使用到的有須要兼容的polyfill添加進去@babel/runtime
:@babel/runtime-corejs2
:Babel
中文文檔web
你真的會用 Babel 嗎?chrome
21 分鐘精通前端 Polyfill 方案segmentfault