現(xiàn)在很多人都在用webpack做打包蒿偎。react+webpack或者vue+webpack都很火称龙,但是不凡會遇到很多坑嫡秕,這里我也遇到了孽糖,特別是在十萬個cnm的IE上枯冈,我是哭了好久喲。
一办悟、babel-polyfill 解決缺失API問題
即對一些ES6 API缺失的模擬尘奏。比如常見的Object.assign,Promise對象病蛉,fetch等等炫加,這些可以通過統(tǒng)一引用“babel-polyfill”來解決,如果感覺“babel-polyfill”太重铺然,也可以針對所需要的API自行引用對應(yīng)的polyfill俗孝。polyfill的應(yīng)用可以有兩種方式:
- npm包的方式,在編譯入口文件通過require(“babel-polyfill”)引入執(zhí)行魄健。
- 也可以在頁面上赋铝,業(yè)務(wù)js前引入babel的script標(biāo)簽。
以及console對象的兼容問題就比較簡單沽瘦,也都可以通過對應(yīng)polyfill解決革骨,就不多做解釋农尖。
二、最麻煩的Object.defineProperty
在IE8中有自己實現(xiàn)的Object.defineProperty,它的行為和標(biāo)準(zhǔn)不同良哲,且只能接受DOM對象盛卡,如果傳入普通javascript對象會拋異常。
babel會把 export(非import) 編譯成 Object.defineProperty的方式筑凫。相信添加這個問題的時候滑沧,babel確實存在這樣的轉(zhuǎn)換,具體的issues也有人提過 babel-export巍实,而提供的解決方案—-引入es5-shim和es5-sham在這種情況下是也確實是可行的滓技。不過目前的babel版本已經(jīng)不會有這種轉(zhuǎn)換(卻還存另一個轉(zhuǎn)換的坑),但是es5-shim和es5-sham的引用是必要的蔫浆,因為它是解決通用性的es3環(huán)境下es5 API的缺失問題殖属,就像babel-polyfill一樣,Object.defineProperty是其中的一個API瓦盛。
以上是現(xiàn)有常規(guī)的兼容方案,很多人使用也沒有存在太多問題外潜。
- ie8不支持設(shè)置訪問器屬性原环,即便是引了es5-shim;
- Babel 會把export xxx from ‘xx’ 語法轉(zhuǎn)碼為訪問器屬性設(shè)置的exports對象。
- 而react-router-react的index.js 偏偏用了export xxx from ‘xx’這樣的語法处窥。
解決辦法
- 最直接的解決辦法就是Babel修復(fù)這種轉(zhuǎn)碼方式嘱吗,目前已經(jīng)有人提過issue,但是尚未解決
- 其次,不要用export xx from ‘xx’的方式滔驾,如果在第三方包中有谒麦,你就找到他的源碼,放到你自己的libs下邊哆致,改源碼吧绕德。