Babel 學(xué)習(xí)筆記

在 Github 上 Fork 了別人的代碼缀皱,在 package.json 中看到了很多與 Babel 有關(guān)的包毙籽,很是不解他們之間的關(guān)系。本文為 Babel 學(xué)習(xí)過程中記錄的筆記,(建議直接去 Babel 官網(wǎng) 學(xué)習(xí))主要內(nèi)容如下:

  • 記錄 Babel 的基本使用方法愿险;
  • 幾個最初讓我比較混淆的包的含義以及用法笛丙。

一漾脂、事件驅(qū)動

在項目中使用 ES6 語法,并可以通過 Babel 將 ES6 代碼轉(zhuǎn)換為 ES5 的代碼胚鸯,然后真正運行的是 ES5 代碼的文件骨稿。

二、轉(zhuǎn)碼器與編譯器

C語言在計算機里運行姜钳,計算機只能識別二進制數(shù)據(jù)(0和1組成的一系列數(shù)據(jù)),在運行前需要先使用編譯器將代碼編譯成二進制數(shù)據(jù)坦冠,這個過程叫做編譯。

JS 在瀏覽器中運行哥桥,瀏覽器可以識別 ES5(JS 的某個版本) 語法的 JS辙浑,而 ES6 (JS 新出的一個版本,還沒有被所有瀏覽器提供支持)語法使用起來更加精簡拟糕,我們在寫代碼的時候通常使用 ES6 語法判呕,之后使用 Babel 轉(zhuǎn)碼器 將 ES6 代碼轉(zhuǎn)換為 ES5 代碼。由于轉(zhuǎn)碼前后都是 JS 這一語言已卸,只是進行版本上的寫法不同佛玄,這個過程就叫做轉(zhuǎn)碼。

三累澡、使用 Babel

  • 新建空白文件夾 babel-demo

    目錄結(jié)構(gòu)如下:

    - babel-demo 
        + package.json
        + index.js
    
  • 安裝依賴包

    $ npm install --save-dev babel-cli babel-preset-env
    
    • babel-cli Babel 的命令行工具依賴包梦抢;在 Babel 上一個版本,命令行工具還是使用 babel 這個包愧哟,不過在新版本中將 babel 這個包一分為二變成了 babel-cli 包和 babel-core 包奥吩。

    • babel-preset-env Babel 的預(yù)設(shè)包哼蛆。

      什么是預(yù)設(shè)包?可以理解為 ES6 中有的而 ES5 中沒有的語法霞赫,Babel 如何將 ES6 語法變成 ES5 語法腮介,依賴的就是這個預(yù)設(shè)包,預(yù)設(shè)包中有很多方法端衰,每條方法對應(yīng)著 ES6 中一個新的語法叠洗,該方法的作用就是將 ES6 語法轉(zhuǎn)換為 ES5 語法的轉(zhuǎn)換機制。如第一個方法 Arrow functions 作用是將 ES6 的箭頭函數(shù)轉(zhuǎn)換為 ES5 中普通的 function 函數(shù)旅东。

      preset-env
      preset-env
  • 配置文件

    babel-demo 目錄下創(chuàng)建 Babel 的配置文件 .babelrc 文件灭抑,在 Windows 中直接創(chuàng)建會報錯:“不能創(chuàng)建沒有文件名的文件”,可以輸入 .babelrc. (后面多個點)試試抵代,創(chuàng)建成功之后是沒有后面那個點的腾节。

    打開 .babelrc 文件(以記事本打開文件等),輸入內(nèi)容如下:

    {
        "presets": ["env"]
    }
    

    說明:
    前面已經(jīng)介紹了 預(yù)設(shè)包 的概念荤牍,因為這里依賴了 babel-preset-env 包案腺,前綴 babel-preset 可以省略不寫,在配置文件中直接寫 env康吵,這條配置的目的是將 Babel 與 babel-preset-env 聯(lián)系起來境析,在 Babel 進行轉(zhuǎn)碼的時候幌陕,知道從 babel-preset-env 包中找對應(yīng)的轉(zhuǎn)換機制碟嘴。

  • 打開 index.js 文件贮配,輸入以下內(nèi)容:

    [1, 2, 3].map(x => x * 2);
    

    說明:這里的 => 就是 ES6 中函數(shù)的新功能箭頭函數(shù)。

  • 使用 Babel 將 ES6 語法轉(zhuǎn)換為 ES5 語法

    打開 package.json 文件耍铜,修改 script 屬性如下:

    "scripts": {
        "build": "babel index.js --out-file index.es5.js"
    },
    

    這里 --out-file 是生成文件,將 --out-file 換成 -d 再試試會生成什么跌前。

    打開 DOS 黑窗口棕兼,切換到 bel-demo 目錄下,敲入命令進行轉(zhuǎn)換:

    $ npm run build
    
    > babel-demo@1.0.0 build D:\code\node\babel-demo
    > babel index.js --out-file index.es5.js
    

    可以看到抵乓,敲入 npm run build伴挚,實際上在命令行中運行的是 babel index.js --out-file index.es5.js ,也就是在 package.json 中配置的內(nèi)容灾炭,這樣寫的用處是每次轉(zhuǎn)換可以少敲幾個字母茎芋。

    打開 bel-demo 目錄,會發(fā)現(xiàn)新生成了一個 index.es5.js 文件蜈出,內(nèi)容如下田弥。可以看到箭頭函數(shù)被轉(zhuǎn)換為 ES5 中最常見的 function 函數(shù)了铡原。

    "use strict";
    
    [1, 2, 3].map(function (x) {
      return x * 2;
    });
    

四偷厦、比較容易混淆的包

1. babel-polyfill 介紹

安裝依賴包

$ npm install --save-dev babel-polyfill

具體是誰商叹,我也不知道,暫且稱為某人吧只泼。某人把 ES6 拆分為語法和 API 兩個概念剖笙,可能聽起來有點一樣。前面介紹的 babel-preset-env 包里記錄就是 ES6 的語法请唱,如箭頭函數(shù)弥咪、for..of、module 等十绑。而 API 又指什么呢酪夷?

babel-polyfill 里記錄的就是 ES6 的 API,具體表現(xiàn)如下:

polyfill
polyfill

由上圖可以看到孽惰,API 就是指 JS 語言數(shù)據(jù)結(jié)構(gòu)(如:Object晚岭、Array)所擁有的一些新的屬性或方法,是屬于語言層面的勋功。

比如:Array.from() 用于將其它類型的值轉(zhuǎn)換為數(shù)組坦报,這在 ES5 中不存在的方法,是 ES6 新增的方法狂鞋。Set 和 Map 是 ES6 新增的數(shù)據(jù)結(jié)構(gòu)片择,這些東東都是屬于語言層面的。

使用方法:在入口文件的頂端引入

// index.js
import 'babel-polyfill'
// 或者 
require('babel-polyfill');

2. babel-preset-react 介紹

安裝依賴包

$ npm install --save-dev babel-preset-react

ES5 中沒有 react 和 JSX 寫法而 ES6 中有骚揍,這個預(yù)設(shè)包就是 ES6 與 ES5 轉(zhuǎn)換 react 和 JSX 語法的機制包字管。

用法:在 .babelrc 中進行配置

{
    "presets": ["env", "react"]
}

3. babel-runtimebabel-plugin-transform-runtime 介紹

  • 安裝依賴包

    $ npm install --save-dev babel-plugin-transform-runtime
    $ npm install --save babel-runtime
    
    • babel-plugin-transform-runtime 插件包,需要在 .babelrc 中配置信不,作用是在轉(zhuǎn)碼時調(diào)用 babel-runtime 包中的公共方法嘲叔;
    • babel-runtime 工具包,包內(nèi)寫了很多 ES6 轉(zhuǎn)換為 ES5 可能會用到的公共方法抽活,本身不需要做任何配置硫戈,babel-plugin-transform-runtime 插件包在運行時會自動尋找該工具包。
  • 配置文件 .babelrc

    {
        "presets": ["env", "react"],
        "plugins": [
            "transform-runtime"
        ]
    }
    
  • 用處

    現(xiàn)在下硕,Babel 會把這樣的代碼:

    class Foo {
      method() {}
    }
    

    編譯成:

    // 這兩句代碼用到了 babel-runtime 中的方法
    import _classCallCheck from "babel-runtime/helpers/classCallCheck";
    import _createClass from "babel-runtime/helpers/createClass";
    
    let Foo = function () {
      function Foo() {
        _classCallCheck(this, Foo);
      }
    
      _createClass(Foo, [{
        key: "method",
        value: function method() {}
      }]);
    
      return Foo;
    }();
    

    如果不這么寫丁逝,每個文件中都會有 classCallCheckcreateClass 的具體實現(xiàn)代碼,這樣無疑會增加冗余代碼量梭姓。
    引入 babel-runtime 工具包霜幼,將 classCallCheckcreateClass 公共方法的代碼都寫在這個包里,這樣在用的時候直接引用即可誉尖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末罪既,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萝衩,老刑警劉巖回挽,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猩谊,居然都是意外死亡千劈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門牌捷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墙牌,“玉大人,你說我怎么就攤上這事暗甥∠脖酰” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵撤防,是天一觀的道長虽风。 經(jīng)常有香客問我,道長寄月,這世上最難降的妖魔是什么辜膝? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮漾肮,結(jié)果婚禮上厂抖,老公的妹妹穿的比我還像新娘。我一直安慰自己克懊,他們只是感情好忱辅,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谭溉,像睡著了一般墙懂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夜只,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天垒在,我揣著相機與錄音,去河邊找鬼扔亥。 笑死,一個胖子當(dāng)著我的面吹牛谈为,可吹牛的內(nèi)容都是我干的旅挤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼伞鲫,長吁一口氣:“原來是場噩夢啊……” “哼粘茄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤柒瓣,失蹤者是張志新(化名)和其女友劉穎儒搭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芙贫,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡搂鲫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了磺平。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魂仍。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拣挪,靈堂內(nèi)的尸體忽然破棺而出擦酌,到底是詐尸還是另有隱情,我是刑警寧澤菠劝,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布赊舶,位于F島的核電站,受9級特大地震影響赶诊,放射性物質(zhì)發(fā)生泄漏笼平。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一甫何、第九天 我趴在偏房一處隱蔽的房頂上張望出吹。 院中可真熱鬧,春花似錦辙喂、人聲如沸捶牢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秋麸。三九已至,卻和暖如春炬太,著一層夾襖步出監(jiān)牢的瞬間灸蟆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工亲族, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炒考,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓霎迫,卻偏偏與公主長得像斋枢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子知给,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容