ReactJS?應(yīng)用兼容ios9對(duì)標(biāo)ie11解決方案
背景
最近遇到了一個(gè)比較棘手的問(wèn)題,客戶要求我們的react應(yīng)用
在ios9
上運(yùn)行,我們的應(yīng)用在ios9上是白屏顯示,所以需要做一些兼容。
遇到問(wèn)題
遇到問(wèn)題之后有一個(gè)更大的問(wèn)題就是手上沒(méi)有ios9
的機(jī)器,畢竟這個(gè)太他娘的古老了,我就去搜了一下ios9
的出現(xiàn)時(shí)間,根據(jù)百度可知蘋(píng)果IOS9將于2015年9月16日正式向用戶推送,但是同時(shí)可以知道ie11于2013年10月17日隨Windows 8.1發(fā)行,所以(我猜的)只要能夠兼容ie11
,那么兼容ios9
應(yīng)該就問(wèn)題不大了,而且目前已知的解決兼容ie的方案比較多,沒(méi)找到啥兼容ios的方案,就先從ie入手。
解決方案
已知react兼容ie可以使用babel
,實(shí)際上項(xiàng)目里面已經(jīng)用了babel,只不過(guò)沒(méi)有兼容ie11
。
初始配置
{ // react 版本 "react": "^16.13.1", "react-dev-utils": "^10.2.1", "react-dom": "^16.13.1", "react-redux": "^7.2.0", "react-rnd": "^10.2.2", "react-router-dom": "^5.2.0", "redux": "^4.0.5", // babel 版本 "@babel/core": "7.9.0", "babel-eslint": "10.1.0", "babel-jest": "^24.9.0", "babel-loader": "8.1.0", "babel-plugin-import": "^1.13.5", "babel-plugin-named-asset-import": "^0.3.6", "babel-preset-react-app": "^9.1.2", // browserslist "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] }, // babel config "babel": { "presets": [ "react-app" ], "plugins": [ [ "import", { "libraryName": "antd-mobile", "style": "css" } ] ] } }
ie的報(bào)錯(cuò)顯示是
安裝@babel/preset-env
在語(yǔ)法正確的情況下遇到語(yǔ)法錯(cuò)誤/缺少標(biāo)識(shí)符的報(bào)錯(cuò)很大概率可能是es6+
語(yǔ)法沒(méi)有被編譯成es5
的語(yǔ)法,查看打包后的文件存在大量的const/let/解構(gòu)等沒(méi)有被編譯。
SCRIPT1002: 語(yǔ)法錯(cuò)誤
SCRIPT1010: 缺少標(biāo)識(shí)符
- 安裝 @babel/preset-env 和 babel-polyfill
yarn add @babel/preset-env babel-polyfill --save-dev
- 配置babel(我的babel是寫(xiě)在packjson里面的)
// index.tsx 頂部引入 import 'babel-polyfill';
// presets 添加 @babel/preset-env ,target 配置 "ie > 9" "babel": { "presets": [ "react-app", [ "@babel/preset-env", { "targets": { "ie": 9 } } ] ], "plugins": [ [ "import", { "libraryName": "antd-mobile", "style": "css" } ] ] }
- 配置 browserslist,修改到ie>=9
"browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all", "ie >= 9" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version", "ie >= 9" ] },
安裝 @babel/plugin-proposal-decorators 和 @babel/plugin-proposal-class-properties
其實(shí)配置完@babel/preset-env
應(yīng)該就可以了,但是項(xiàng)目里面使用了裝飾器和類(lèi),所以還是報(bào)錯(cuò):
SyntaxError: xxx.ts: Decorators are not enabled. If you are using ["@babel/plugin-proposal-decorators", { "version": "legacy" }], make sure it comes *before* "@babel/plugin-proposal-class-properties" and enable loose mode, like so: ["@babel/plugin-proposal-decorators", { "version": "legacy" }] ["@babel/plugin-proposal-class-properties", { "loose": true }] 27 | } 28 | > 29 | @StoreConfig({ name: "auth", resettable: true }) | ^ 30 | export class AuthStore extends Store<Auth> { 31 | constructor() { 32 | super(createInitialState());
按照提示安裝
@babel/plugin-proposal-decorators
和 @babel/plugin-proposal-class-properties
。(ps:使用yarn安裝,因?yàn)轫?xiàng)目使用的是node sass
,所以node版本是14.16,對(duì)應(yīng)的npm是6,安不上這兩個(gè)插件。)
- 安裝
@babel/plugin-proposal-decorators
和@babel/plugin-proposal-class-properties
yarn add @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties --save-dev
- 按照?qǐng)?bào)錯(cuò)提示新增babel配置
"babel": { "presets": [ "react-app", [ "@babel/preset-env", { "targets": { "ie": 9 } } ] ], "plugins": [ [ "@babel/plugin-proposal-decorators", { "legacy": true } ], [ "@babel/plugin-proposal-class-properties", { "loose": true } ], [ "import", { "libraryName": "antd-mobile", "style": "css" } ] ] }
安裝promise
其實(shí)到上面一步已經(jīng)差不多了,如果還報(bào)Promise undefined,可以單獨(dú)引入Promise掛載到windeow上。
結(jié)語(yǔ)
雖然就是幾個(gè)配置的問(wèn)題但是真的搞了好長(zhǎng)時(shí)間,大概弄了有兩天這樣,配置項(xiàng)真的太痛了,希望下次不要再去配了。
以上就是ReactJS 應(yīng)用兼容ios9對(duì)標(biāo)ie11解決方案的詳細(xì)內(nèi)容,更多關(guān)于ReactJS兼容ios9對(duì)標(biāo)ie11的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React使用高德地圖的實(shí)現(xiàn)示例(react-amap)
這篇文章主要介紹了React使用高德地圖的實(shí)現(xiàn)示例(react-amap),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04React BootStrap用戶體驗(yàn)框架快速上手
這篇文章主要介紹了React BootStrap用戶體驗(yàn)框架快速上手的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-03-03react實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng)信息
這篇文章主要為大家詳細(xì)介紹了react實(shí)現(xiàn)無(wú)限循環(huán)滾動(dòng)信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10React中useCallback useMemo到底該怎么用
在React函數(shù)組件中,當(dāng)組件中的props發(fā)生變化時(shí),默認(rèn)情況下整個(gè)組件都會(huì)重新渲染。換句話說(shuō),如果組件中的任何值更新,整個(gè)組件將重新渲染,包括沒(méi)有更改values/props的函數(shù)/組件。在react中,我們可以通過(guò)memo,useMemo以及useCallback來(lái)防止子組件的rerender2023-02-02React性能優(yōu)化系列之減少props改變的實(shí)現(xiàn)方法
這篇文章主要介紹了React性能優(yōu)化系列之減少props改變的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01React項(xiàng)目中fetch實(shí)現(xiàn)跨域接收傳遞session的解決方案
這篇文章主要介紹了React項(xiàng)目中fetch實(shí)現(xiàn)跨域接收傳遞session的解決方案,本次項(xiàng)目使用了react框架,同時(shí)使用fetch取代ajax作為獲取接口數(shù)據(jù)的交互方法,下面就對(duì)這次問(wèn)題的解決做個(gè)總結(jié),需要的朋友可以參考下2022-04-04在Create React App中啟用Sass和Less的方法示例
這篇文章主要介紹了在Create React App中啟用Sass和Less的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01