babel-runtime和babel-polyfill的作用介紹和使用

Babel編譯轉(zhuǎn)碼的范圍

Babel默認(rèn)只轉(zhuǎn)換新的JavaScript語法沪铭,而不轉(zhuǎn)換新的API。 例如赔退,Iterator硕旗、Generator创译、Set软族、Maps互订、Proxy屹耐、Reflect瓢剿、Symbol桥氏、Promise 等全局對(duì)象字支,以及一些定義在全局對(duì)象上的方法(比如 Object.assign)都不會(huì)轉(zhuǎn)譯揖庄。 如果想使用這些新的對(duì)象和方法蹄梢,則需要為當(dāng)前環(huán)境提供一個(gè)polyfill

babel-polyfill

目前最常用的配合Babel一起使用的polyfill是babel-polyfill禁炒,它會(huì)”加載整個(gè)polyfill庫”幕袱,針對(duì)編譯的代碼中新的API進(jìn)行處理凹蜂,并且在代碼中插入一些幫助函數(shù)玛痊。

比如說:代碼中包含

const key = 'babel'
const obj = {
    [key]: 'polyfill',
}

使用babel-polyfill配合轉(zhuǎn)碼后,代碼會(huì)變成這樣

function _defineProperty(obj, key, value) {
    if (key in obj) {
        Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });
    } else {
        obj[key] = value;
    }
    return obj;
}
var key = 'babel';
var obj = _defineProperty({}, key, Object.assign({}, { key: 'polyfill' }));

babel-runtime

babel-polyfill解決了Babel不轉(zhuǎn)換新API的問題,但是直接在代碼中插入幫助函數(shù)蒿涎,會(huì)導(dǎo)致污染了全局環(huán)境劳秋,并且不同的代碼文件中包含重復(fù)的代碼玻淑,導(dǎo)致編譯后的代碼體積變大。 (比如:上述的幫助函數(shù)_defineProperty有可能在很多的代碼模塊文件中都會(huì)被插入)

Babel為了解決這個(gè)問題箫锤,提供了單獨(dú)的包babel-runtime用以提供編譯模塊的工具函數(shù)谚攒, 啟用插件babel-plugin-transform-runtime后五鲫,Babel就會(huì)使用babel-runtime下的工具函數(shù)位喂,上述的代碼就會(huì)變成這樣

var _defineProperty2 = __webpack_require__("./node_modules/babel-runtime/helpers/defineProperty.js");

var _defineProperty3 = _interopRequireDefault(_defineProperty2);

var _assign = __webpack_require__("./node_modules/babel-runtime/core-js/object/assign.js");

var _assign2 = _interopRequireDefault(_assign);

function _interopRequireDefault(obj) { 
    return obj && obj.__esModule ? obj : { default: obj }; 
}

var key = 'babel';
var obj = (0, _defineProperty3.default)(
            {}, key, (0, _assign2.default)({}, { key: 'polyfill' })
          );

可以看到上述轉(zhuǎn)換后的代碼中_defineProperty幫助函數(shù)是通過babel-runtime下的模塊引用的痛倚, 同時(shí)Object.assign也變成了模塊引用, 這樣可以避免自行引入polyfill時(shí)導(dǎo)致的污染全局命名空間的問題抒蚜。

配置

使用babel-polyfill需要額外安裝babel-polyfill依賴包嗡髓, 然后在webpack配置文件中的入口或者公共模塊中加入’babel-polyfill’即可浊伙,代碼如下:

entry: {
    common: [
        `babel-polyfill`,
        `whatwg-fetch`,
        `react`,
        `react-dom`,
        `redux`,
        `react-redux`,
        `js-cookie`,
    ],
},

使用babel-runtime需要額外安裝babel-runtime和babel-plugin-transform-runtime依賴包, 然后在.babelrc配置文件中啟用transform-runtime, 代碼如下:

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

比較

babel-polyfill與babel-runtime相比雖然有各種缺點(diǎn)哑子,但在某些情況下仍然不能被babel-runtime替代, 例如烦却,代碼:[1, 2, 3].includes(3),Object.assign({}, {key: 'value'})摩渺,Array摇幻,Object以及其他”實(shí)例”下es6的方法绰姻,babel-runtime是無法支持的, 因?yàn)閎abel-runtime只支持到static的方法帜矾。

結(jié)論

babel-runtime適合在組件珍剑,類庫項(xiàng)目中使用,而babel-polyfill適合在業(yè)務(wù)項(xiàng)目中使用。
參考:https://stackoverflow.com/questions/31781756/is-there-any-practical-difference-between-using-babel-runtime-and-the-babel-poly

vue-cli腳手架中使用

babel-polyfill

在main.js中引用babel-polyfill

import 'babel-polyfill'

bable-runtime

在.babelrc文件中使用

{
  "presets": [
    ["env", {
      "modules": false,
      "targets": {
        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
      }
    }],
    "stage-2"
  ],
  "plugins": ["transform-vue-jsx", "transform-runtime"],
  "env": {
    "test": {
      "presets": ["env", "stage-2"],
      "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"]
    }
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掠械,一起剝皮案震驚了整個(gè)濱河市猾蒂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌是晨,老刑警劉巖肚菠,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異罩缴,居然都是意外死亡蚊逢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門箫章,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桶至,你說我怎么就攤上這事野瘦。” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盐股。 經(jīng)常有香客問我,道長(zhǎng)霹肝,這世上最難降的妖魔是什么垮兑? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任衬浑,我火速辦了婚禮,結(jié)果婚禮上馋辈,老公的妹妹穿的比我還像新娘褥民。我一直安慰自己宇攻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溯街,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粘室。 梳的紋絲不亂的頭發(fā)上锦爵,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天叹螟,我揣著相機(jī)與錄音蚣常,去河邊找鬼豺裆。 笑死雳刺,一個(gè)胖子當(dāng)著我的面吹牛趁舀,可吹牛的內(nèi)容都是我干的境氢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼翘县,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼倒信!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起优妙,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤竞穷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鳞溉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鼠哥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年熟菲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朴恳。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抄罕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出于颖,到底是詐尸還是另有隱情呆贿,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站做入,受9級(jí)特大地震影響冒晰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竟块,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一壶运、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浪秘,春花似錦蒋情、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至夺衍,卻和暖如春狈谊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刷后。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工的畴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尝胆。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓丧裁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親含衔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子煎娇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348