webpack多頁(yè)應(yīng)用架構(gòu)系列(八):教練我要寫(xiě)ES6芥颈!webpack怎么整合Babel惠勒?

本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意爬坑,請(qǐng)勿轉(zhuǎn)載纠屋。
原文地址:https://segmentfault.com/a/1190000006992218
如果您對(duì)本系列文章感興趣,歡迎關(guān)注訂閱這里:https://segmentfault.com/blog/array_huang

前言

一直以來(lái)盾计,我對(duì)ES6都不甚感興趣售担,一是因?yàn)樵谏a(chǎn)環(huán)境中使用ES5已是處處碰壁,其次則是只當(dāng)這ES6是語(yǔ)法糖不曾重視署辉。只是最近學(xué)習(xí)react生態(tài)族铆,用起babel來(lái)轉(zhuǎn)換jsx之余,也不免碰到諸多用上ES6的教程哭尝、案例哥攘,因此便稍作學(xué)習(xí)。這一學(xué)習(xí)材鹦,便覺(jué)得這語(yǔ)法糖實(shí)在是甜逝淹,忍不住嘗鮮,于是記錄部分自覺(jué)對(duì)自己有用的方法在此桶唐。

這是我數(shù)月前的一篇文章《ES6部分方法點(diǎn)評(píng)(一)》中的一段栅葡,如今再看我自己的代碼,觸目皆是ES6的語(yǔ)法尤泽。在當(dāng)前的瀏覽器市場(chǎng)下欣簇,想在生產(chǎn)環(huán)境用上ES6,Babel是必不可少的坯约。

由于我本身只用了ES6的語(yǔ)法而未使用ES6的其它特性熊咽,因此本文只介紹如何利用webpack整合Babel來(lái)編譯ES6的語(yǔ)法,而實(shí)際上若要使用ES6的其它屬性甚至是ES7(ES2016)鬼店,其實(shí)只需要引入Babel其它的preset/plugin即可网棍,在用法上并無(wú)多大變化。

用到哪些npm包妇智?

首先要說(shuō)到的是babel-loader滥玷,這是webpack整合Babel的關(guān)鍵,我們需要配置好babel-loader來(lái)加載那些使用了ES6語(yǔ)法的js文件巍棱;換句話(huà)說(shuō)惑畴,那些本來(lái)就是ES5語(yǔ)法的文件,其實(shí)是不需要用babel-loader來(lái)加載的航徙,用了也只會(huì)浪費(fèi)我們編譯的時(shí)間如贷。

然后就是babel相關(guān)的npm包,其中包括:

  • babel-core,babel的核心杠袱,沒(méi)啥好說(shuō)的尚猿。
  • babel-preset-es2015-loose,babel的preset(相當(dāng)于是一整套plugin)楣富。babel是有許多preset的凿掂,看自己需要來(lái)選用,比如說(shuō)我只管ES6(ES2016)語(yǔ)法的就可以用babel-preset-es2015babel-preset-es2015-loose纹蝴。這倆preset其實(shí)用法一樣庄萎,差別就在于:

許多Babel的插件有兩種模式:

盡可能符合ECMAScript6語(yǔ)義的normal模式和提供更簡(jiǎn)單ES5代碼的loose模式。

優(yōu)點(diǎn):生成的代碼可能更快塘安,對(duì)老的引擎有更好的兼容性糠涛,代碼通常更簡(jiǎn)潔,更加的“ES5化”兼犯。

缺點(diǎn):你是在冒險(xiǎn)——隨后從轉(zhuǎn)譯的ES6到原生的ES6時(shí)你會(huì)遇到問(wèn)題忍捡。

我自己的考慮是,肯定要更好的兼容性和更好的性能啦這還用想的嗎切黔?(敲黑板)

  • babel-plugin-transform-runtimebabel-runtime锉罐,這屬于優(yōu)化項(xiàng),不用也沒(méi)啥問(wèn)題绕娘,下文會(huì)細(xì)說(shuō)。

如何配置babel-loader

babel-loader的配置并不復(fù)雜栽连,與其它loader并無(wú)二致:

    {
      test: /\.js$/,
      exclude: /node_modules|vendor|bootstrap/,
      loader: 'babel-loader?presets[]=es2015-loose&cacheDirectory&plugins[]=transform-runtime',
    },

下面來(lái)詳細(xì)解釋此配置:

  • test: /\.js$/表明我只用babel-loader來(lái)加載js文件险领,如果你只是小部分js文件應(yīng)用了ES6,那么也可以給這些文件換個(gè).es6的后綴名并把此處改為test: /\.es6$/秒紧。
  • exclude: /node_modules|vendor|bootstrap/绢陌,上文已經(jīng)說(shuō)到了,不需要用babel來(lái)加載的文件還是剔除掉熔恢,否則會(huì)大量增加編譯的時(shí)間脐湾,一般我們只用babel編譯我們自己寫(xiě)的應(yīng)用代碼。
  • loader: 'babel-loader?presets[]=es2015-loose&cacheDirectory&plugins[]=transform-runtime'叙淌,這一行是指定使用babel-loader并傳入所需參數(shù)秤掌,這些參數(shù)其實(shí)也是可以通過(guò)babel配置文件.babelrc,不過(guò)我還是推薦在這里以參數(shù)的方式傳入鹰霍。下面來(lái)介紹這些參數(shù):

preset參數(shù):babel-preset-es2015-loose

上文已經(jīng)解釋過(guò)preset是什么以及為啥要使用babel-preset-es2015-loose了闻鉴,這里不再累述。

cacheDirectory參數(shù)

cacheDirectory參數(shù)默認(rèn)為false茂洒,若你設(shè)置為一個(gè)文件目錄路徑(表示把cache存到哪)孟岛,或是保留為空(表示操作系統(tǒng)默認(rèn)的緩存目錄),則相當(dāng)于開(kāi)啟cache。這里的cache指的是babel在編譯過(guò)程中某些可以緩存的步驟渠羞,具體是什么我也不太清楚斤贰,反正是只要開(kāi)啟了cache就可以加快webpack整體編譯速度。我測(cè)試了一下次询,未開(kāi)啟cache的時(shí)候我的腳手架項(xiàng)目(Array-Huang/webpack-seed)需要15秒半來(lái)編譯荧恍;而開(kāi)啟cache后的第一次編譯時(shí)間并沒(méi)有減少,第二次編譯則變?yōu)?4秒了渗蟹,足足減少了1秒半了棒棒噠块饺。

plugins參數(shù)

雖說(shuō)一個(gè)preset已經(jīng)包括N個(gè)plugin了,但總有一些漏網(wǎng)之魚(yú)是要專(zhuān)門(mén)加載的雌芽。這里我只用到了transform-runtime授艰,這個(gè)plugin的效果是:不用這plugin的話(huà),babel會(huì)為每一個(gè)轉(zhuǎn)換后的文件(在webpack這就是每一個(gè)chunk了)都添加一些輔助的方法(僅在需要的情況下)世落;而如果用了這個(gè)plugin淮腾,babel會(huì)把這些輔助的方法都集中到一個(gè)文件里統(tǒng)一加載統(tǒng)一管理,算是一個(gè)減少冗余屉佳,增強(qiáng)性能的優(yōu)化項(xiàng)吧谷朝,用不用也看自己需要了;如果不用的話(huà)武花,前面也不需要安裝babel-plugin-transform-runtimebabel-runtime了圆凰。

示例代碼

諸位看本系列文章,搭配我在Github上的腳手架項(xiàng)目食用更佳哦(笑):Array-Huang/webpack-seed(https://github.com/Array-Huang/webpack-seed)体箕。

附系列文章目錄(同步更新)

本文首發(fā)于Array_Huang的技術(shù)博客——實(shí)用至上,非經(jīng)作者同意冲泥,請(qǐng)勿轉(zhuǎn)載驹碍。
原文地址:https://segmentfault.com/a/1190000006992218
如果您對(duì)本系列文章感興趣壁涎,歡迎關(guān)注訂閱這里:https://segmentfault.com/blog/array_huang

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市志秃,隨后出現(xiàn)的幾起案子怔球,更是在濱河造成了極大的恐慌,老刑警劉巖浮还,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竟坛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡钧舌,警方通過(guò)查閱死者的電腦和手機(jī)担汤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)洼冻,“玉大人崭歧,你說(shuō)我怎么就攤上這事∽怖危” “怎么了率碾?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屋彪。 經(jīng)常有香客問(wèn)我所宰,道長(zhǎng),這世上最難降的妖魔是什么畜挥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任仔粥,我火速辦了婚禮,結(jié)果婚禮上蟹但,老公的妹妹穿的比我還像新娘件炉。我一直安慰自己,他們只是感情好矮湘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著口糕,像睡著了一般缅阳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上景描,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天十办,我揣著相機(jī)與錄音,去河邊找鬼超棺。 笑死向族,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棠绘。 我是一名探鬼主播件相,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼再扭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了夜矗?” 一聲冷哼從身側(cè)響起泛范,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎紊撕,沒(méi)想到半個(gè)月后罢荡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡对扶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年区赵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浪南。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笼才,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逞泄,到底是詐尸還是另有隱情患整,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布喷众,位于F島的核電站各谚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏到千。R本人自食惡果不足惜昌渤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憔四。 院中可真熱鬧膀息,春花似錦、人聲如沸了赵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柿汛。三九已至冗酿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間络断,已是汗流浹背裁替。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留貌笨,地道東北人弱判。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锥惋,于是被迫代替她去往敵國(guó)和親昌腰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子开伏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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