不積跬步--react 適配IE 10瀏覽器實(shí)踐

這篇文章主要是記錄react 在適配IE10的過程中碰到的問題以及解決方法,這樣以后有方便查找。
其實(shí)支持react在ie10上面運(yùn)行,需要我們把我們使用的ES6代碼轉(zhuǎn)為ie10瀏覽器支持的ES5,我們可以通過下面這個網(wǎng)址來查看各大瀏覽器對ES6的支持程度。
環(huán)境背景:react-dva-roadhog

kangax.github.io/compat-table/es6/

這個是ECMAScript 6 入門中提供的。

下面正式開始吧:

使用 CommonJS

強(qiáng)烈推薦使用 CommonJS 風(fēng)格來引入需要的模塊。

首先安裝這些模塊:

npm install --save es5-shim console-polyfill

然后把以下代碼插入到入口文件的最前面:

require('es5-shim');
require('es5-shim/es5-sham');
require('console-polyfill');

參考一個真實(shí)的例子:React IE8 Hello World Example。

錯誤 Expected identifier

原因:代碼中國或者第三方模塊中使用了保留字,比如default。

解決方案:使用 es3ify 或者 es3ify-loader

示例:Fetch IE8;

錯誤 Exception thrown and not caught

原因:babelexport * from 'xxx' 編譯成了 Object.defineProperty,而 IE8 中不支持 accessor property

解決方案:把 require('es5-shim') require('es5-shim/es5-sham') 插入到入口文件的最上方,并且在代碼中不要使用export * from 'xxx'

示例:Hello World

錯誤 Object expected

原因:可能你使用了 fetch

解決方案:用 es6-promisefetch-ie8 polyfill

示例:Fetch IE8;

錯誤 'Promise' is undefined

原因:Promise 需要 polyfill

解決方案:用 es6-promise polyfill

示例:Fetch IE8;

錯誤 Object doesn't support this property or method

原因:可能你使用了 Object.assign

解決方案:用 core-js polyfill

示例:Object Assign

錯誤 'JSON' is undefined

原因:需要使用 IE8 Standards Mode

解決方案:

添加 <!DOCTYPE html> 和 <meta http-equiv="X-UA-Compatible" content="IE=EDGE"/>

示例:Hello World

上面這一套組合拳下來,入口文件前面插入的代碼變成了下面:

"use strict";
require('es5-shim');
require('es5-shim/es5-sham');
require('console-polyfill');
require('es6-promise');
require('core-js');
import '@babel/polyfill';
import 'url-polyfill';

錯誤:Error: index.a0a9eebd.js from UglifyJs

原因:在我們打包文件時里面有es6的代碼,從而造成壓縮失敗。

解決方案:可以參考我的另一篇文章:不積跬步--Error index.a0a9eebd.js from UglifyJs 的解決過程

錯誤:調(diào)用接口數(shù)據(jù)沒有返回,傳輸了中文

原因:這個一般表現(xiàn)為在chrome瀏覽器上頁面可以正常顯示,而在ie10上面卻不行,可以檢查一下接口傳輸?shù)臄?shù)據(jù)是否傳輸了中文。如果傳輸了中文,那么就需要進(jìn)行轉(zhuǎn)碼。

解決方案:可以通過encodeURIComponent()或者encodeURI()來進(jìn)行轉(zhuǎn)碼。

示例:沒有,自己百度。

錯誤:為適配ie10瀏覽器,不可以這樣寫

錯誤的寫法:

class Person extends React.Component {
    state = {
       name:this.props.name
    };
}

或者

constructor(props) {
    super(props);
    // SCRIPT5007: 無法獲取屬性 "b" 的值,對象為 null 或未定義
    this.a = this.props.b;
}    

原因:在構(gòu)造函數(shù)里不能使用 this.props.xx

解決方案:改為正統(tǒng)寫法,不用this.props.xxx,使用繼承的props

class Person extends React.Component {
    constructor(props){
        super(props)
        this.state = {
               name:props.name
        };
    }
}

錯誤:無法獲取屬性 xxx 的值,對象為 null 或未定義

原因:這種情況一般是組件繼承后,無法繼承到在構(gòu)造函數(shù)里定義的屬性或方法,同樣類屬性或方法也同樣無法繼承。

解決方案:使用babel-preset-es2015-ie
安裝:

npm install --save-dev babel-preset-es2015-ie

然后在.babelrc文件中添加:

{
  "presets": ["es2015-ie"]
}

參考:React+Webpack+Antd+Babel 兼容低版本瀏覽器

IE 瀏覽器滾動條無法滑動或者按鈕無法點(diǎn)擊或者其他的事件無法響應(yīng),都可以參考這一條

原因:IE10或者更低版本在解析html的時候,用的是盒模型,如果發(fā)現(xiàn)無法點(diǎn)擊或者無法滑動的時候,通過查看元素來確認(rèn)是否有遮罩,從而造成點(diǎn)擊事件無法傳遞到下面。

解決方案:在遮罩的下一層布局添加如下css:

position:relative;
z-Index:99

把遮罩下一層的div整體抬起來,抬到遮罩的上層,這樣就可以傳遞事件了。

在我們的代碼里是LabExam.less

.LabExam{
  :global{
    .ant-row-flex-space-between{
      min-height: 362px;
    }
    .ant-table {
      position: relative;
      z-index: 99;
    }
  }
}

由于公司要求需要適配IE10瀏覽器,所以以后肯定會碰到更多的問題,會及時更新在這里。

參考文章:
react 項目的一個ie8兼容性問題
React+Webpack+Antd+Babel 兼容低版本瀏覽器
使用dva和ant-design組件在IE中的兼容問題記錄
Make your React app work in IE8
使用 ES6 的瀏覽器兼容性問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 有時候會想,究竟哪個才是真正的她??釒?,性感,呆萌,知性,可愛,成熟,嫵媚……我找不到更多的詞語去形容她。唯一確...
    左伊兒閱讀 321評論 0 2
  • 小酒須配花生米,詩歌還得音樂襯~因簡書無法插入背景音樂,故煩請諸位腦補(bǔ)Thinking of you(By Hil...
    華迅閱讀 1,204評論 0 0
  • 對于吃貨來說,最痛苦的事情之一,就是因緣際遇吃到了某種特別好吃的東西,轉(zhuǎn)頭就不記得吃的是啥了。時過境遷想再體驗(yàn)一下...
    我們會有貓的閱讀 3,015評論 20 74
  • 做一個努力的人好處在于,人人見了你都會想幫你。但如果你自己不先做出一點(diǎn)努力的樣子,人家想拉你一把,都不知你的手在哪...
    思_3a2d閱讀 248評論 0 0

友情鏈接更多精彩內(nèi)容