ReactJS 应用兼容ios9对标ie11解决方案

 更新时间:2023年1月10日 15:10  点击:984 作者:菜菜真的不知道

背景

最近遇到了一个比较棘手的问题,客户要求我们的react应用ios9上运行,我们的应用在ios9上是白屏显示,所以需要做一些兼容。

遇到问题

遇到问题之后有一个更大的问题就是手上没有ios9的机器,毕竟这个太他娘的古老了,我就去搜了一下ios9的出现时间,根据百度可知苹果IOS9将于2015年9月16日正式向用户推送,但是同时可以知道ie11于2013年10月17日随Windows 8.1发行,所以(我猜的)只要能够兼容ie11,那么兼容ios9应该就问题不大了,而且目前已知的解决兼容ie的方案比较多,没找到啥兼容ios的方案,就先从ie入手。

解决方案

已知react兼容ie可以使用babel,实际上项目里面已经用了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的报错显示是

image.png

安装@babel/preset-env

在语法正确的情况下遇到语法错误/缺少标识符的报错很大概率可能是es6+语法没有被编译成es5的语法,查看打包后的文件存在大量的const/let/解构等没有被编译。

SCRIPT1002: 语法错误

SCRIPT1010: 缺少标识符

image.png

  • 安装 @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应该就可以了,但是项目里面使用了装饰器和类,所以还是报错:

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());

image.png按照提示安装 @babel/plugin-proposal-decorators@babel/plugin-proposal-class-properties。(ps:使用yarn安装,因为项目使用的是node sass,所以node版本是14.16,对应的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

其实到上面一步已经差不多了,如果还报Promise undefined,可以单独引入Promise挂载到windeow上。

结语

虽然就是几个配置的问题但是真的搞了好长时间,大概弄了有两天这样,配置项真的太痛了,希望下次不要再去配了。

以上就是ReactJS 应用兼容ios9对标ie11解决方案的详细内容,更多关于ReactJS兼容ios9对标ie11的资料请关注猪先飞其它相关文章!

原文出处:https://juejin.cn/post/7185710915856105527

[!--infotagslink--]

相关文章

  • MySQL性能监控软件Nagios的安装及配置教程

    这篇文章主要介绍了MySQL性能监控软件Nagios的安装及配置教程,这里以CentOS操作系统为环境进行演示,需要的朋友可以参考下...2015-12-14
  • iOS APP h5快捷程序 .mobileconfig的生成

    1.从APP Store 下载Apple Configurator 2从一个管理点管理所有iOS设备应用程序,文档和配置文件。想要确保您的所有家庭成员在其每台iOS设备上都有类似的应用和文档,管理日益增...2021-12-23
  • iOS设置UIButton文字显示位置和字体大小、颜色的方法

    这篇文章给大家分享了iOS如何设置UIButton的文字显示位置和字体的大小、颜色,文中给出了示例代码,相信对大家的学习和理解很有帮助,有需要的朋友们下面来一起看看吧。...2020-06-30
  • iOS如何将图片裁剪成圆形

    这篇文章主要为大家详细介绍了iOS如何将图片裁剪成圆形,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-30
  • iOS给border设置渐变色的方法实例

    这篇文章主要给大家介绍了关于iOS给border设置渐变色的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-09
  • iOS新版微信底部返回横条问题的解决

    这篇文章主要介绍了iOS新版微信底部返回横条问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • vue+axios全局添加请求头和参数操作

    这篇文章主要介绍了vue+axios全局添加请求头和参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-24
  • iOS蓝牙设备名称缓存问题的解决方法

    这篇文章主要给大家介绍了关于iOS蓝牙设备名称缓存问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • iOS新版微信底部工具栏遮挡问题完美解决

    这篇文章主要介绍了iOS新版微信底部工具栏遮挡问题完美解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • iOS新增绘制圆的方法实例代码

    这篇文章主要给大家介绍了关于iOS新增绘制圆的方法,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-30
  • iOS UIBezierPath实现饼状图

    这篇文章主要为大家详细介绍了iOS UIBezierPath实现饼状图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-20
  • 封装 axios+promise通用请求函数操作

    这篇文章主要介绍了封装 axios+promise通用请求函数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
  • IOS获取各种文件目录路径的方法

    ios获取文件路径的方法,iphone沙箱模型的四个文件夹,通过documents,tmp,app,Library得到模拟器路径的简单方式,下面小编整理相关资料,把IOS获取各种文件目录路径的方式总结如下,需要的朋友可以参考下...2020-06-30
  • Vue中 axios delete请求参数操作

    这篇文章主要介绍了Vue中 axios delete请求参数操作,具有很好的参考价值,希望对大家有所 帮助。一起跟随小编过来看看吧...2020-08-26
  • iOS UICollectionView实现卡片效果

    这篇文章主要为大家详细介绍了iOS UICollectionView实现卡片效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-30
  • iOS实现电子签名

    这篇文章主要为大家详细介绍了iOS实现电子签名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-12-08
  • Vue使用axios引起的后台session不同操作

    这篇文章主要介绍了Vue使用axios引起的后台session不同操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-14
  • iOS实现循环滚动公告栏

    这篇文章主要为大家详细介绍了iOS实现循环滚动公告栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-20
  • iOS APP实现微信H5支付示例总结

    这篇文章主要介绍了iOS APP实现微信H5支付示例总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-30
  • iOS WKWebview 白屏检测实现的示例

    这篇文章主要介绍了iOS WKWebview 白屏检测实现的示例,帮助大家更好的进行ios开发,感兴趣的朋友可以了解下...2020-10-20