《前端之路》之 Babel 下一代 JavaScript 語法編譯器
寫本章的內容的出發點主要是 為了對於之前關於 JS 版本的一個總結,在之前的開發中,我們始終對於 ECMAScript 的版本的更新不夠重視,以至於在後面的 開發過程中,我們始終會被各種新奇的語法打斷了我們的思考思路,所以對於基礎的追求,是任何時候都不能忘記的。不然會的框架再多,會玩兒的花樣再多,到頭來都只是API 。
另外 一個目的就是想做一個好玩的東西,就是 實時編譯所寫的高版本(ES2015+)的 JS 程式碼。轉化成現在大部分瀏覽器可以相容的 ES5 、 ES3 等。
下面就正式介紹下 Babel (v7.0.0 )
一、什麼是 Babel
Babel 是一個 JavaScript 編譯器,Babel 通過語法變換器支援最新版本的 JavaScript。
1-1 使用方法:
Babel 工具鏈中有很多工具可以讓你輕鬆使用 Babel,無論你是“終端使用者”還是構建中整合 Babel。本文是快速使用這些工具的指南,你可以在文件的“用法”部分中閱讀有關它們的更多資訊。
1-1-1 : CLI 用法
這裡介紹到的 cli 的用法其實對於大部分同學來說不是常規用法。 因為這種用法往往出現在 各種 npm 的包、cli 構建工具整合當中,所以這裡,我們只介紹下它的核心用法。
下載核心包 @babel/core
npm install --save-dev @babel/core
你可以直接在 JavaScript 中 require 它並像下面這樣使用它
const babel = require("@babel/core");
babel.transform("code", optionsObject);
作為終端使用者,你可能希望安裝其他工具作為 @babel/core 的介面,並能很好地整合在你的開發過程中。即便如此,你仍可能需要檢視其文件頁面以瞭解這些選項,其中大部分選項也可以通過其他工具進行設定。
1-1-2 :Plugins & Presets 用法
以外掛 和 預處理 的方式,是我們在開發過程中更為常見的方式。 通常我們在 Vue 專案開發中使用的是 Plugins 的方式 在 React 專案開發中使用的是 Presets 的方式 下面的文章中,我們分別來介紹 如何來使用。
1-1-3 :Polyfill
@babel/polyfill 模組包括 core-js 和自定義 regenerator runtime 來模擬完整的 ES2015+ 環境。 利用 Polyfill 更多的是來解決一個 瀏覽器的相容 高版本的 ES 問題。但是往往因為這個包比較的大,所以還是慎重使用。
二、 React、Vue 結合 Babel
如何在 React、Vue 專案中結合Webpack 使用 Babel
2-1 、React && Babel
上文中有介紹到 babel 配合 React 等使用方法。--- Presets。 預處理方案。
2-1-1: 如何使用
我們配置完 webpack 和 React ,並啟動 server。 這個時候我們看下我們 react 的程式碼
import React from "react";
import ReactDom from "react-dom";
const App = () => {
return (
<div>
<h2>hhhh</h2>
</div>
);
};
ReactDom.render(<App />, document.getElementById("apps"));
這是一個最簡單的 react 的 demo 程式碼展示:
結果我們發現,我們的終端 上顯示 ERROR:
ERROR in ./src/index.js 6:4
Module parse failed: Unexpected token (6:4)
You may need an appropriate loader to handle this file type.
| const App = () => {
| return (
> <div>
| <h2>hhhh</h2>
| </div>
@ multi (webpack)-dev-server/client?http://localhost:8081 (webpack)/hot/dev-server.js ./src main[2]
TIPS: 這個時候大多數人看到這個 error 的時候其實都是懵逼的,特別對於新手到講,然後一部分機智的小夥子發現 已經超過了自己的 知識範圍了,就去 谷歌、百度去尋求幫助
不出意外,搜尋引擎統一給出的答案就是 未配置 babel 的預處理,導致 webpack 無法讀懂這個程式碼是什麼意思。
這個時候,我們來試著配置下我們的 babel 的 presets. 但是如何配置呢? 上文中,我們只是簡單的介紹了下,但是實際配置的檔案應該是什麼樣子呢?
2-1-1-1 babel 配置的第一種配置方式:
根目錄建立
babel.config.js
檔案。
module.exports = function() {
const presets = [];
const plugins = [];
return {
presets,
plugins
};
};
babel.config.js 的官方文件在這裡 babel
2-1-1-2 babel 配置的第二種配置方式:
根目錄建立
.babelrc
檔案 ( JSON 格式)。
{
"presets": [],
"plugins": [],
"env": {}
}
2-1-1-3 兩種配置方式的方式都是大同小異 主要是配置的內容
下一個小節我們就詳細介紹下 babel的
plugins
和presets
解析
2-1-2: babel的plugins
和presets
解析
2-1-2-1:明確 ES201x 和 ESx 的關係
ES2015 =》 ES6 ES2016 =》 ES7 ES2017 =》 ES8
在 2015 年之前 ES3 是主流。
2-1-2-2:plugin
: babel的
外掛
,在6.x版本之後babel必需要
配合外掛來進行工作
{
"plugins": ["transform-es2015-arrow-functions"]
}
顧名思義, 這個外掛就是為了編譯 es6 的箭頭函式
2-1-2-3:preset
: babel
外掛集合的預設
,包含某一部分的外掛plugin
{
"presets": ["es2015"]
}
這裡著重解釋下
presets
中es2015
是什麼意思?
es2015 => babel-preset-es2015 (可以將 es6 的 JS 程式碼編譯為 es5) es2016 => babel-preset-es2016 (可以將 es7 的 JS 程式碼編譯為 es6) es2017 => babel-preset-es2017 (可以將 es8 的 JS 程式碼編譯為 es7) stage-x => babel-preset-stage-x (可以將處於某一階段的js語法編譯為正式版本的js程式碼)
這裡再介紹下 stage-x, 提案共分為五個階段:
- stage-0: 稻草人-只是一個大膽的想法
- stage-1: 提案-初步嘗試
- stage-2: 初稿-完成初步規範
- stage-3: 候選-完成規範和瀏覽器初步實現
- stage-4: 完成-將被新增到下一年釋出
2-1-2-4:preset env
當前 babel 推薦使用
babel-preset-env
替代 babel-preset-es2015 和 babel-preset-es2016 以及 babel-preset-es2017 ,env的支援範圍更廣
,包含es2015 es2016 es2017的所有語法編譯
,並且它可以根據專案執行平臺的支援情況自行選擇編譯版本
。
使用方法:
{
"presets": ["env", "stage-2"]
}
2-1-2-5: 外掛中每個訪問者都有排序問題
這意味著如果兩次轉譯都訪問相同的”程式”節點,則轉譯將按照 plugin 或 preset 的規則進行排序然後執行。
- Plugin 會執行在 Preset 之前。
- Plugin 會從第一個開始順序執行。ordering is first to last.
- Preset 的順序則剛好相反(從最後一個逆序執行)。
2-1-2-6: 總結:
上面專案的跑起來的時候依然還是還有bug,下面就需要我們來完善這一個問題,用上面學習到的內容
{
"presets": ["env", "stage-1", "react"],
"plugins": [
["transform-runtime", { "polyfill": false }],
"transform-decorators-legacy"
]
}
每一部分的 外掛也好,預處理檔案也好。都會影響著整個專案,很多時候均為 各個不同版本外掛之間的相容性問題,搞的非常頭痛,所以,看準外掛,仔細閱讀其文件是不可或缺的。
2-2 、Vue && Babel
Vue 的話,因為有 vue-cli 的存在,已經講
.babelrc
檔案已經給使用者配置好了
{
"presets": ["es2015", "stage-2"],
"plugins": ["transform-runtime"],
"comments": false
}
三、Babel 使用 總結
Babel 的使用,是我們對於 ES 的各種版本 的理解更好的幫助,在我們實際的專案使用中也提供了 更多了可能。 在結合 webpack 使用的時候,presets、plugins 的配置。tips: 配置中 各個版本之間的相容問題得異常注意。 好了,關於 babel 相關的 介紹和理解就到這裡,如果還有什麼疑惑?,歡迎來撩?
關於 webpack 入門的文章就介紹到這裡了,歡迎一起來論道~