如何用babel

由于新版本的ECMASscript的強(qiáng)大特性谆棱,使我們寫js代碼更加得心應(yīng)手寡喝,例如:calss阶祭,let绷杜,for...of,promise等等濒募,但可惜的是這些js新特新只被最新版本的瀏覽器支持鞭盟,那么指定范圍的低版本的瀏覽器的支持就需要一個(gè)專門的工具,babel就是這樣的一塊前端工具瑰剃。

但是babel系列的插件現(xiàn)在越來越多懊缺,對于初次接觸使用它的人來說需要花費(fèi)不少的時(shí)間,尤其是討厭英文的人培他。

babel-6已經(jīng)放棄了原來的babel包鹃两,取而代之的是各種轉(zhuǎn)換插件,剛開始舀凛,我也很納悶俊扳,為什么要分這么多插件包呢,原先的一個(gè)不好嗎猛遍?隨著使用我么發(fā)現(xiàn)馋记,這些插件的職責(zé)分明,避免了‘一刀切’的問題懊烤,不管你需不需要都給你編譯梯醒。

babel-loader

這個(gè)包是由babel團(tuán)隊(duì)開發(fā)的loader,用來告訴webpack我想要對我的js代碼進(jìn)行兼容性編譯腌紧。

babel-loader 只是起到一個(gè)通知者的角色茸习,通知babel你需要干活了,在webpack的module中使用代碼如下:

module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /(node_modules)/, // 不對node_modules目錄下的文件進(jìn)行編譯壁肋,可以提升webpack打包速度号胚,其他loader也有這個(gè)配置
      use: {
        loader: 'babel-loader',
        // loader: 'babel-loader?cacheDirectory', // 使用緩存目錄它可以進(jìn)一步提升webpack的編譯速度
        options: { // 這個(gè)配置項(xiàng)我們一般單獨(dú)拿出來籽慢,創(chuàng)建一個(gè)‘.babelrc’文件來單獨(dú)存放配置項(xiàng)
          presets: ['@babel/preset-env'],// babel預(yù)設(shè)
          plugin: ['@babel/plugin-proposal-object-rest-spread'] // 所需要使用的插件
        }
      }
    }
  ]
}

babel-core

如果說 babel-loader 是告訴webpack我要對js文件進(jìn)行代碼兼容性編譯猫胁,那么箱亿,webpack接下來就是要找babel,而bable的入口就是 babel-core 弃秆,只有通過它届惋,webpack才能使用各種babel的api(前提是你安裝了相關(guān)的api)。

babel-preset-es* 和 babel-preset-stage-*

babel-preset-es2015 菠赚,babel-preset-es2016 脑豹,babel-preset-es2017等等傻傻的分也分不清楚。

這些預(yù)設(shè)將支持ES6新語法的兼容性編譯锈至。

將代碼轉(zhuǎn)化為 ES3

babel-preset-es3

將代碼轉(zhuǎn)化為 ES5

'babel-preset-es2015' 晨缴,
'babel-preset-stage-0' 译秦,
'babel-preset-stage-1' 峡捡,
'babel-preset-stage-2' ,
'babel-preset-stage-3' 筑悴,

將代碼轉(zhuǎn)化為 ES6

'babel-preset-es2016' 將ES2016轉(zhuǎn)化成ES6们拙,
'babel-preset-es2017' 將ES2017轉(zhuǎn)化成ES6,

預(yù)設(shè)只能將ES6語法編譯為你指定的ES版本語法阁吝,例如:箭頭函數(shù)砚婆,但是像 Array.from 這樣的API呢他無能為力。那么突勇,怎么辦呢装盯,我們下面來介紹幾種解決方案。

處理ES6 API

babel-polyfill

babel預(yù)設(shè)可以編譯幾乎所有的JavaScript新語法甲馋,但是對于API卻不能解決埂奈,解決這個(gè)問題babel用的是 babel-polyfill (它有core-js和regenerator兩部分構(gòu)成)。

執(zhí)行安裝命令:

npm install --save-dev babel-polyfill

babel-polyfill 有三種引入方法定躏。

1.那個(gè)模塊需要就在那個(gè)模塊引入账磺,

require('babel-polyfill');

2.全局引入方法1,在項(xiàng)目的入口文件引入痊远,如果項(xiàng)目有多個(gè)入口垮抗,則在每個(gè)需要的入口分別加入。

require('babel-polyfill');

3.全局引入方法2碧聪,可以在項(xiàng)目的 webpack.config.js 的入口配置項(xiàng)中引入冒版。

entry: {
    app: ['babel-polyfill', './main.js']
},

這是第一種解決方案用來將ES6代碼編譯為es5。但是這種方案逞姿,增加了一些不必要的代碼壤玫,webpack打包后的文件比較大豁护,使用它還有一個(gè)問題就是容易造成全局污染。欲间。

而剛剛好babel提供了babel-runtime楚里。babel-plyfill我們以前經(jīng)常用,而babel-runtime猎贴,則是現(xiàn)在常用的班缎。

babel-runtime

babel-runtime不會污染全局對象。如:當(dāng)前的運(yùn)行環(huán)境如果不支持Symbol她渴,可以訪問 babel-runtime/core-js/symbol 這里重新定義了symbol达址,此外還有Promise,Set 和 Map 等趁耗。

babel-runtime 官方建議用在生產(chǎn)環(huán)境沉唠,而開發(fā)環(huán)境使用 babel-plugin-transform-runtime

babel-plugin-transform-runtime

引用自:https://github.com/babel/babel-loader

babel uses very small helpers for common functions such as _extend. By default this will be added to every file that requires it.

You can instead require the babel runtime as a separate module to avoid the duplication.

這段話的意思是說:

babel會使用一些非常小的輔助(helper)函數(shù)作為通用函數(shù),例如:_extend 苛败。默認(rèn)情況下满葛,這類函數(shù)將被添加到每個(gè)需要它的文件中。這時(shí)你可以使用babel runtime作為單獨(dú)的模塊來避免重復(fù)罢屈。

module: {
  rules: [
    {
      test: /\.js$/,
      exclude: /(node_modules)/, // 不對node_modules目錄下的文件進(jìn)行編譯嘀韧,可以提升webpack打包速度,其他loader也有這個(gè)配置
      use: {
        loader: 'babel-loader',
        // loader: 'babel-loader?cacheDirectory', // 使用緩存目錄它可以進(jìn)一步提升webpack的編譯速度
        options: { // 這個(gè)配置項(xiàng)我們一般單獨(dú)拿出來缠捌,創(chuàng)建一個(gè)‘.babelrc’文件來單獨(dú)存放配置項(xiàng)
          presets: ['@babel/preset-env']锄贷,// babel預(yù)設(shè)
          plugin: ['@babel/transform-runtime']
        }
      }
    }
  ]
}

babel-plugin-transform-runtime 包含一個(gè)內(nèi)置的polyfill(它包含一個(gè)自定義的regenerator運(yùn)行時(shí)和core.js),所以曼月,在webpack中使用 ProvidePluginshimming 方法定義 Promise 將不起作用谊却。

env preset

babel-preset-env 允許你指定一個(gè)代碼執(zhí)行環(huán)境,并且只編譯該環(huán)境缺少的特性哑芹。

而非 babel-pre-env 預(yù)設(shè)存在的問題在于它們往往做得太多炎辨。例如,大多數(shù)現(xiàn)代瀏覽器都支持ES6生成器绩衷。如果您使用 babel-preset-es2015 這些預(yù)設(shè)蹦魔,ES6生成器函數(shù)將始終被轉(zhuǎn)換為復(fù)雜的ES5代碼。

.babelrc 配置文件如下:

"presets": [
    [
      "env",
      {
        "targets": {
          "browsers": ["last 2 versions", "ie >= 7"]
        }
      }
    ]
  ]

支持最近兩個(gè)版本的瀏覽器和IE7以上的瀏覽器咳燕。

其它babel插件

babel-plugin-tranform-classes // 解決ES6類(class)的兼容性

使用實(shí)踐

babel-core勿决,babel-preset-es2015babel-polyfill招盲,

首先低缩,.babelrc 代碼如下:

{
    "presets": ["es2015"]
}

然后,修改 webpack.config.js 代碼如下:

entry: {
    app: ['babel-polyfill', './main.js']
},

babel-polyfill 還有其他的引入方式

babel-corebabel-preset-es2015咆繁,babel-transform-runtime

僅需要修改 .babelrc 代碼如下:

{
    "presets": ["es2015"],
    "plugins": ["transform-runtime"]
}

babel-core讳推,babel-preset-es2015babel-transform-runtime, babel-preset-stage-*,

使用 babel-preset-stage-* 玩般,我們就是想使用一些更新的js特性银觅,以 babel-preset-stage-2 為例:

僅需要修改 .babelrc 代碼如下:

{
    "presets": ["es2015", "es-stage-2"],
    "plugins": ["transform-runtime"]
}

babel-corebabel-preset-es2015坏为,babel-transform-runtime, babel-preset-env

給我們的項(xiàng)目指定支持的瀏覽器和運(yùn)行環(huán)境究驴。

僅需要修改 .babelrc 代碼如下:

{
    "presets": ["es2015"],
    "plugins": ["transform-runtime"].
    "env": {
        "targets": {
            "browsers": ["last 2 versions", "safari >= 7"], // 瀏覽器
            "node": "6.10" // node 
        }
    }
}

你可能發(fā)現(xiàn)這里沒有介紹 babel-cli, babel-register 和babel插件,解釋一下匀伏,這里主要是為了webpack的使用進(jìn)行的介紹洒忧,如果有很多人需要的話可以在做介紹。

下一篇babel的文章我會介紹够颠,如何在webpack中使用 babel-eslint 熙侍。

參考源代碼

參考資料:

babel-preset-env: a preset that configures Babel for you
babel-preset-env from npmjs.com
babel中文參考手冊

其它關(guān)于webpack的系列文章webpack-learning

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市履磨,隨后出現(xiàn)的幾起案子蛉抓,更是在濱河造成了極大的恐慌,老刑警劉巖蹬耘,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芝雪,死亡現(xiàn)場離奇詭異减余,居然都是意外死亡综苔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門位岔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來如筛,“玉大人,你說我怎么就攤上這事抒抬⊙钆伲” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵擦剑,是天一觀的道長妖胀。 經(jīng)常有香客問我,道長惠勒,這世上最難降的妖魔是什么赚抡? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮纠屋,結(jié)果婚禮上涂臣,老公的妹妹穿的比我還像新娘。我一直安慰自己售担,他們只是感情好赁遗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布署辉。 她就那樣靜靜地躺著,像睡著了一般岩四。 火紅的嫁衣襯著肌膚如雪哭尝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天剖煌,我揣著相機(jī)與錄音刚夺,去河邊找鬼。 笑死末捣,一個(gè)胖子當(dāng)著我的面吹牛侠姑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箩做,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼莽红,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了邦邦?” 一聲冷哼從身側(cè)響起安吁,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燃辖,沒想到半個(gè)月后鬼店,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黔龟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年妇智,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氏身。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巍棱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛋欣,到底是詐尸還是另有隱情航徙,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布陷虎,位于F島的核電站到踏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏尚猿。R本人自食惡果不足惜窝稿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谊路。 院中可真熱鬧讹躯,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秉馏,卻和暖如春耙旦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背萝究。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工免都, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帆竹。 一個(gè)月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓绕娘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親栽连。 傳聞我的和親對象是個(gè)殘疾皇子险领,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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