Babel 的本意是 「通天塔」。 西方神話故事裏,之前的人語言相同,決定創建有個能直達上天的塔,神後面害怕人們語言相通就打亂它,讓他們不能明白對方的意思,並把他們分散到各地。node
爲了解決上古時代瀏覽器對新語法不支持、不兼容狀況下。發明了 Babel ,可以將 ES6 代碼 轉爲 ES5 代碼, 從而在現有環境執行。react
咱們將 Babel 想象成 一隻多功能的筆,而咱們的配置項,就是咱們賦予筆的功能,例如:像水彩筆、像鉛筆、像圓珠筆,每種筆在它的使用環境下使用。git
//這些是babel 的核心
yarn add --save-dev @babel/core @babel/cli @babel/preset-env
yarn add --save @babel/polyfill
複製代碼
babel.config.js
const presets = [
[
"@babel/env",
{
targets: {
edge: "17",
firefox: "60",
chrome: "67",
safari: "11.1",
},
useBuiltIns: "usage",
},
],
];
module.exports = { presets };
複製代碼
執行方法github
./node_modules/.bin/babel src --out-dir lib 或者 npx babel
複製代碼
babel 在進行解析時以下chrome
input string -> @babel/parser parser -> AST -> transformer[s] -> AST -> @babel/generator -> output string
用大白話講一下就是以炒菜爲例子, 咱們須要將菜放到鍋裏面亂燉。
babel/core, 就是炒菜的這個過程。
babel/cli 是鍋,咱們能夠在上面炒任何菜(咱們的代碼),
咱們在炒的過程,但願全自動炒菜(添油加醋等),
bable/plugin 就是提供的工具,當咱們直接照着菜單自動炒的時候,
就是 babel/preset-env。
有時候這個鍋可能要用電,用煤氣,咱們就用 babel/proyfill 作個接口兼容。
讓他能夠用電、用煤氣。
後來發現這個接電就能用,這時候 babel/runtime 就能解決,遇到要接電的才轉。
ok,再說都餓了。
咱們再來梳理下:
@babel/core 轉換ast
@babel/cli 打包工具
@babel/plugin 插件機制,手動增長
@babel/preset-env 配置環境
@babel/polyfill 提供某些api,包含所需整個運行環境。
@babel/runtime 按需載入所需api。
複製代碼
你可以單獨引一個 js 語法特性插件作處理,例如箭頭函數。應用場景在例如一個新的提案出來的時候,嚐嚐鮮,正常有裝咱們的 Babel 全家桶足以應付了。typescript
npm install --save-dev @babel/plugin-transform-arrow-functionsnpm
npx babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions.json
const fn = () => 1;
// converted to
var fn = function fn() {
return 1;
};
複製代碼
preset 是預設的意思,像插件同樣,你也能夠設置本身的預設,以共享須要的任何插件組合,api
npm install --save-dev @babel/preset-env
npx src --out-dir lib --presets=@babel/env
複製代碼
這個預設將支持 ES6, ES7 的全部插件。 並且預設也能夠作配置, 咱們能夠經過配置文件瀏覽器
const presets = [
[
"@babel/env",
{
targets: {
edge: "17",
firefox: "60",
chrome: "67",
safari: "11.1",
},
},
],
];
module.exports = { presets };
複製代碼
tansform-runtime
轉換器它的做用是避免編譯輸出中的重複。運行時將編譯到您的構建中。 還有另外一個做用是爲代碼建立沙盒環境,若是直接導入 core-js 或者 babel/prolyfill。
npm install --save-dev @babel/plugin-transform-runtime npm install --save @babel/runtime
變換器將這些內置函數爲core-js, 而不須要使用polyfill
{
"plugins": [
[
"@babel/plugin-transform-runtime",
{
"absoluteRuntime": false,
"corejs": false,
"helpers": true,
"regenerator": true,
"useESModules": false
}
]
]
}
複製代碼
env 預設僅加載咱們的目標瀏覽器中不可用的功能轉換插件。 @babel/prolyfill模塊包括core.js和自定義 regenerator,模擬完成的 es2015 環境。 也就是說你可使用內置函數,靜態方法等。
npm install --save @babel/polyfill
Babel 是處於構建期, 轉譯出來的結果在默認下並不包括 ES6 對運行時的擴展,例如 builtins , 內建類型上的原型擴展 Array、Object、String ,Regenerator 等。
api 指的是咱們能夠經過函數從新覆蓋的語法,例如 Promise,includes等。
syntax, 指的是let, const, class等, 沒法重寫。
因此須要 plyfill 來處理。
polyfill 與 transform-runtime 的區別。
babel-runtime 庫 是由Babel提供的polyfill庫, 它自己就是由core-js 與 regenerator-runtime 庫組成。
咱們能夠經過 babel-plugin-transform-runtime 進行引用
configuration配置方法 能夠有如下狀況:
yarn add @babel/preset-es2015 @babel/preset-react - -save-dev
yarn add @babel/preset-react-hmre - -save -dev
.babelrc
{
"presets":[
"es2015",
"react",
"@babel/preset-env"],
"env":{
"development":{
"presets":["react-hmre"]
}
}
//
}
複製代碼
yarn add @babel/plugin-tansform-typescript yarn add @babel/preset-typescript
{
"presets": ["@babel/preset-typescript"]
}
配置清單
複製代碼
歡迎關注微信公衆號!,進行更好的交流。
複製代碼
如下是一些參考資料:
[@babel/core](https://babeljs.io/docs/en/babel-core)
[babel options api](https://babeljs.io/docs/en/options)
[babel.config.js](https://github.com/babel/babel/blob/master/babel.config.js)
[babel/core.js](https://github.com/zloirock/core-js)
[babel regenerator-runtimer](https://github.com/facebook/regenerator/blob/master/packages/regenerator-runtime/runtime.js)
複製代碼