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

目录
  • 背景
  • 遇到问题
  • 解决方案
    • 初始配置
    • 安装@babel/preset-env
    • 安装 @babel/plugin-proposal-decorators 和 @babel/plugin-proposal-class-properties
    • 安装promise
  • 结语

背景

最近遇到了一个比较棘手的问题,客户要求我们的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的报错显示是

安装@babel/preset-env

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

SCRIPT1002: 语法错误

SCRIPT1010: 缺少标识符

  • 安装 @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());

按照提示安装 @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的资料请关注我们其它相关文章!

(0)

相关推荐

  • 解决React报错React.Children.only expected to receive single React element child

    目录 总览 React片段 DOM元素 总览 当我们把多个子元素传递给一个只期望有一个React子元素的组件时,会产生"React.Children.only expected to receive single React element child"错误.为了解决该错误,将所有元素包装在一个React片段或一个封闭div中. 这里有个示例来展示错误是如何发生的. // App.js import React from 'react'; function Button(props)

  • react后台系统最佳实践示例详解

    目录 一.中后台系统的技术栈选型 1. 要做什么 2. 要求 3. 技术栈怎么选 二.hooks时代状态管理库的选型 context redux recoil zustand MobX 三.hooks的使用问题与解决方案 总结 一.中后台系统的技术栈选型 本文主要讲三块内容:中后台系统的技术栈选型.hooks时代状态管理库的选型以及hooks的使用问题与解决方案. 1. 要做什么 我们的目标是搭建一个适用于公司内部中后台系统的前端项目最佳实践. 2. 要求 由于业务需求比较多,一名开发人员需要负

  • React错误的习惯用法分析详解

    目录 过多的声明state 问题 解决方法 不必要的state 问题 解决方法 过多的useEffect 问题 解决方法 请求竞争问题 问题 解决方法 使用三元表达式代替&& 使用 && 常见的错误 解决方法 传递特殊属性ref 问题 解决方法 过多的声明state 在我们React的日常开发中一些常用的写法,看似运行的很好,实际可能并不优雅.学习React并不是如何如何使用它,而是如何写出优雅,干净的代码.下面举一些例子,总结了一些React开发中不好的写法及相应更好的写

  • React Hooks使用startTransition与useTransition教程示例

    目录 引言 需求分析 startTransition使用 useTransition 总结 引言 今天带来的是react18版本推出的全新hooks:useTransition,它的使用范围主要是用于性能优化,今天我们一探究竟吧. 需求分析 假设现在有如下需求:当用户在输入框查询数据时,需要实时根据用户输入数据进行搜索提示项的展示.与以往不同的是,提示列表的个数是十分庞大的,每次都在10000条以上. 设计过程 import {useState} from "react"; impor

  • react-router-domV6嵌套路由实现详解

    目录 V6新特性 <Route>的属性变更component/render->element <Link/>使用变动 <Redirect/> 替换为 <Navigate/> <Switch/> 重命名为 <Routes/> 用useNavigate代替useHistory 依赖包大小从20kb减少到8kb,整体体积减少 新钩子useRoutes代替react-router-config 新标签:<Outlet/> V

  • IE6兼容透明背景图片及解决方案

    首先给大家展示效果图: JS代码:  <!--[if IE 6]> <script src="~/Scripts/UI/DD_belatedPNG.js"></script> <script> $(function () { //1.通过公共类 DD_belatedPNG.fix(".pngFix,.pngFix:hover"); //2.直接用选择器:类名,ID,标签 DD_belatedPNG.fix("

  • Vue兼容ie9的问题全面解决方案

    前言 背景情况 vue - 2.5.11 vue-cli 使用模板 webpack-simple http请求:axios Vue 官方对于 ie 浏览器版本兼容情况的描述是 ie9+,即是 ie9 及更高的版本.经过测试,Vue 的核心框架 vuejs 本身,以及生态的官方核心插件(VueRouter.Vuex等)均可以在 ie9 上正常使用. Vue 的作者尤雨溪对于Vue 的学习建议 中有提及为了将项目更好的生态化/工程化,要尽可能学习及使用新的 ECMAScript 规范.目前 ES6/

  • 浏览器兼容console对象的简要解决方案分享

    浏览器报找不到console对象,那我们就手动构造一个接口完全一致的console对象 置于window中.这里采用了空方法和空对象.如此一来即使在很old的浏览器中,含有console.xxxxx的代码依然不会报错,完美运行. 下面附上修复兼容代码,要置于置于第一句console.xxxx调用之前,否则没有意义. 复制代码 代码如下: (function (){ //创建空console对象,避免JS报错 if(!window.console)      window.console = {}

  • 单击复制文字兼容各浏览器的完美解决方案

    单击复制文字的js.找了很久,由于之前没有接触过,完全不知道兼容ie及标准dom浏览器,不仅仅要通过js,而且需要flash的帮忙.clipboard.swf这个在网上都有下载. ie允许访问剪贴板.window.clipboardData可以访问 但是标准dom.看了一些文章说的都是用flash设置隐藏.但是flash10是不支持. 但是,还有个方法是可行的,固记录一下,以下方法支持标准dom. 复制代码 代码如下: (function () { window['Util'] = { CACH

  • DWR内存兼容及无法调用问题解决方案

    在上次遇到DWR内存泄漏问题后根据网上的内容对JS文件进行修改,修改后发现还有一些兼容的问题,同时还出现不能调用的一些情况. 而且根据统计DWR就算内存泄漏,也不是特别严重,除非你一个浏览器跑几天不关闭,而且实时刷新! 经过再次查询,得知IE浏览器有自己的一个垃圾回收的函数:CollectGarbage(); CollectGarbage,是IE的一个特有属性,用于释放内存的使用方法嘛应该是,将该变量或引用对象,设置为null或delete 然后在进行释放动作在做CollectGarbage前,

  • react项目升级报错,babel报错,.babelrc配置兼容等问题及解决

    目录 react项目升级报错,babel报错,.babelrc配置兼容问题 遇到问题 最终解决方案 react运行报错TypeError 现记录一下思路 react项目升级报错,babel报错,.babelrc配置兼容问题 由于开发环境和项目版本的兼容问题,尝试升级了react-scripts后,一大堆问题接踵而至,翻遍了百度和csdn,往往解决了旧的又出现新的,或者开发没问题而打包时报错,现罗列一下遇到的主要问题和最终解决方案,以供参考. 遇到问题 digital envelope routi

  • 劲舞团出现问题的解决方法总结

    01.双击图片后打不开选区菜单----------多半在周末等人多的时候出现,是劲舞团服务器的负载问题.解决方案:耐心等待人少. 02.选好区之后点不了开始按钮,取消后说没有更新.---------------人多就会这样,是劲舞团和当地ISP的DNS服务器的问题.解决方案:架设本地DNS服务器. 03.游戏时屏幕闪烁的厉害.是劲舞团的程序问题和微软Dx与NT系统兼容的Bug问题.解决方案:使用刷新率锁定程序. 04.游戏中无任何提示的退出.---------------------多半在周末等

  • asp.net 不用组件的URL重写(适用于较大型项目)

    先在网站根目录下建立一个config文件夹,再在此文件架下建立一个urls.config文件,这里记录url的配置信息代码如下: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <urls> <rewrite name="default" path="/default-{0}-{1}.aspx" pattern = "/default-

  • js下获取div中的数据的原理分析

    关于从中学到的知识: document.getelementbyid("ddhdh").innerHTML 可以获取到div中的全部数据,包括标签...但是只是在IE和OPERA中使用 document.getelementbyid("ddhdh").innerTEXT 可以获取到div中的文本数据,不会获取到标签...但是只是在IE和OPERA中使用 document.getElementById("text").textContent 用于在

  • 浅谈Python程序与C++程序的联合使用

    作为Python程序员,应该能够正视Python的优点与缺点.众所周之,Python的运行速度是很慢的,特别是大数据量的运算时,Python会慢得让人难以忍受.对于这种情况,"专业"的解决方案是用上numpy或者opencl.不过有时候为了一点小功能用上这种重型的解决方案很不划算,或者有时候想要实现的操作在numpy里面没有,需要我们自己用C语言来编写.总之,我们使用Python与C++的混合编程能够加快程序热点的运算速度. 首先要提醒大家注意的是,在考虑联合编程之前一定要找到程序运行

随机推荐