ReactJS?應(yīng)用兼容ios9對標(biāo)ie11解決方案
背景
最近遇到了一個比較棘手的問題,客戶要求我們的react應(yīng)用在ios9上運行,我們的應(yīng)用在ios9上是白屏顯示,所以需要做一些兼容。
遇到問題
遇到問題之后有一個更大的問題就是手上沒有ios9的機器,畢竟這個太他娘的古老了,我就去搜了一下ios9的出現(xiàn)時間,根據(jù)百度可知蘋果IOS9將于2015年9月16日正式向用戶推送,但是同時可以知道ie11于2013年10月17日隨Windows 8.1發(fā)行,所以(我猜的)只要能夠兼容ie11,那么兼容ios9應(yīng)該就問題不大了,而且目前已知的解決兼容ie的方案比較多,沒找到啥兼容ios的方案,就先從ie入手。
解決方案
已知react兼容ie可以使用babel,實際上項目里面已經(jīng)用了babel,只不過沒有兼容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的報錯顯示是
安裝@babel/preset-env
在語法正確的情況下遇到語法錯誤/缺少標(biāo)識符的報錯很大概率可能是es6+語法沒有被編譯成es5的語法,查看打包后的文件存在大量的const/let/解構(gòu)等沒有被編譯。
SCRIPT1002: 語法錯誤
SCRIPT1010: 缺少標(biāo)識符
- 安裝 @babel/preset-env 和 babel-polyfill
yarn add @babel/preset-env babel-polyfill --save-dev
- 配置babel(我的babel是寫在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
其實配置完@babel/preset-env應(yīng)該就可以了,但是項目里面使用了裝飾器和類,所以還是報錯:
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安裝,因為項目使用的是node sass,所以node版本是14.16,對應(yīng)的npm是6,安不上這兩個插件。)
- 安裝
@babel/plugin-proposal-decorators和@babel/plugin-proposal-class-properties
yarn add @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties --save-dev
- 按照報錯提示新增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
其實到上面一步已經(jīng)差不多了,如果還報Promise undefined,可以單獨引入Promise掛載到windeow上。
結(jié)語
雖然就是幾個配置的問題但是真的搞了好長時間,大概弄了有兩天這樣,配置項真的太痛了,希望下次不要再去配了。
以上就是ReactJS 應(yīng)用兼容ios9對標(biāo)ie11解決方案的詳細(xì)內(nèi)容,更多關(guān)于ReactJS兼容ios9對標(biāo)ie11的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React使用高德地圖的實現(xiàn)示例(react-amap)
這篇文章主要介紹了React使用高德地圖的實現(xiàn)示例(react-amap),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
React中useCallback useMemo到底該怎么用
在React函數(shù)組件中,當(dāng)組件中的props發(fā)生變化時,默認(rèn)情況下整個組件都會重新渲染。換句話說,如果組件中的任何值更新,整個組件將重新渲染,包括沒有更改values/props的函數(shù)/組件。在react中,我們可以通過memo,useMemo以及useCallback來防止子組件的rerender2023-02-02
React性能優(yōu)化系列之減少props改變的實現(xiàn)方法
這篇文章主要介紹了React性能優(yōu)化系列之減少props改變的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
React項目中fetch實現(xiàn)跨域接收傳遞session的解決方案
這篇文章主要介紹了React項目中fetch實現(xiàn)跨域接收傳遞session的解決方案,本次項目使用了react框架,同時使用fetch取代ajax作為獲取接口數(shù)據(jù)的交互方法,下面就對這次問題的解決做個總結(jié),需要的朋友可以參考下2022-04-04
在Create React App中啟用Sass和Less的方法示例
這篇文章主要介紹了在Create React App中啟用Sass和Less的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01

