项目在IE上跑起来遇到的问题

3,082 阅读2分钟

1、Promise is undefined && Symbol is undefined

原因:IE不支持ES6的语法。
解决办法:

  1. yarn add @babel/preset-env --save-dev && yarn add core-js
  2. babel配置:
 presets: [
    [
      '@babel/preset-env',
      {
        useBuiltIns: 'entry', //尝试使用usage,会报错,猜测原因是:“usage”选项下,第三方插件需要的依赖没有安装。
        debug: true, //terminal 打印每个文件需要的polyfill
        corejs: {version: 3, proposals: true}
      }
    ]
  ]
  1. 入口文件 import "core-js" (src/index.js)

2、MobX 5+ requires Proxy and Symbol objects.

If your environment doesn't support Symbol or Proxy objects, please downgrade to MobX 4. For React Native Android, consider upgrading JSCore.
原因:IE11不支持Proxy.
解决办法:将mobx降级为4:yarn upgrade mobx@4

3、Header is undefined

原因:IE11不支持new Header方法
解决办法:

  1. yarn add isomorphic-fetch
  2. import 'isomorphic-fetch'

4、Object doesn't support property or method 'scrollTo'

解决办法:改为'scrollTop = 0'

5、Failed prop type: Invalid prop xx of type object supplied to xx, expected array

原因:mobx降成4带来的影响。官方文档中提到:在 ES5 中没有继承数组的可靠方法,因此 observable 数组继承自对象。 这意味着一般的库没有办法识别出 observable 数组就是普通数组(像 lodash,或 Array.concat 这样的内置操作符)。

Array.isArray(observable([1,2,3])) //false

解决办法:

  1. observable.toJS()
  2. observable.slice()

6、SCRIPT1002: Syntax error

原因:IE不支持箭头函数
babel忽略了node_module,需要手动加入。定位到错误文件是ansi-styles,可以按需加入。

解决办法:

module: {
  rules: [{
      exclude: /node_modules\/(?!(ansi-styles)\/).*/  //exp1(?!exp2) 查找后面不是exp2的exp1
  }]
}

7、Missing class properties transform.

原因: babel配置中缺少相应的plugins
解决办法:

    1. yarn add babel-plugin-transform-class-properties --save-dev
    1. babel.config.js中添加插件
"plugins":["transform-class-properties"]

8、点击下载 / 导出按钮无效

原因:

    const anchor = document.createElement('a');
    anchor.href = fileURL;
    anchor.download = fileName;
    document.body.appendChild(anchor);
    anchor.click(); // IE <a>标签不支持下载属性

解决办法: 对IE做特殊处理

  if (window.navigator.msSaveBlob) { // For IE
      window.navigator.msSaveOrOpenBlob(blob, `${fileName}.json`);
    }

参考:zhuanlan.zhihu.com/p/51941539

9、通过file.type来判断Json文件类型无效

原因:json格式的文件在IE中,file.type返回" "
解决办法:通过file.name来识别文件类型

const arr = file.name.split('.');
const fileType = arr[arr.length - 1]; 

10、get请求使用缓存导致数据不更新

原因:IE发起 GET 请求,当参数一样时,浏览器会直接使用缓存数据。 解决办法: 参数中添加一个当前时间戳来使得参数不一致。

//以axios请求拦截器为例
const axiosInstance = axios.create({
  // 当创建实例的时候配置默认配置
  headers: {
    'Content-Type': 'application/json'
  }
});

// 添加请求拦截器
axiosInstance.interceptors.request.use((config) => {
  if (config.method === 'get') {
    if (!config.params) { //没有参数时
      config.params = {};
    }
    config.params.timestemp = new Date().getTime();
  }
    return config;
});

11、使用execCommond复制内容时页面右侧出现空白区域

原因:暂未知(欢迎补充)
解决办法:

  copyText = (name) => {
    const value = `My name is: ${name}`;
    if (window.clipboardData) { // Internet Explorer
      window.clipboardData.setData('Text', value);
    } else {
      const oInput = document.createElement('input');
      oInput.value = value;
      document.body.appendChild(oInput);
      oInput.select();
      document.execCommand('Copy');
      oInput.className = 'oInput';
      oInput.style.display = 'none';
    }
  };

12、flex:1 盒子没有撑开,导致兄弟节点位置错误

解析:flex-basis 用于设置子项的占用空间。如果设置了值,则子项占用的空间为设置的值;如果没设置或者为 auto,那子项的空间为width/height 的值。
原因:

// IE中的flex:1
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0px; 

解决办法:

1、flex:1 1 auto;
2、flex-grow:1;