AntV G6 项目如何兼容 IE

AntV G6 项目如何兼容 IE

Flying
2021-08-05 / 0 评论 / 163 阅读 / 正在检测是否收录...

阿里的 AntV G6 是很强大很好用,但要兼容 IE 会遇到各种 。虽然官网给出了 解决方案 ,但因为原因千奇百怪,即使完全照官方的方案操作一遍,仍然有问题。本文如果能帮到同学少踩坑,那就不枉我花二个小时来总结了。本文仅以 Vue Vue CLI 工程为例讲解。

vue-g6-editor

曾经用官方推荐的 基于 G6 和 Vue 的可视化编辑器 做了一个场景编辑器,测试不能兼容 IE,报如下错误:

g6-editor-error.png

点击错误行进去排查,发现 @antv/g/src/core/event-emitter.js 中有个方法里面有 const 关键字,如下图:

const-error.png

Vue CLI v3 以上版本使用 core-js 基本上解决了大部分的 IE 兼容问题,但不少第三方库(node_modules 中)将 es6 语句转换成 es5 时做得不彻底,无形中会引入新的 IE 兼容问题。一般的 webpack Vue CLI 工程为了编译得快,默认情况下 babel-loader 会忽略所有 node_modules 中的文件。如果想要通过 Babel 显式转译一个依赖,可以在 transpileDependencies 选项中列出来,然后在使用工程中再转换。明白了这个道理就比较好解决问题了。

transpileDependencies: ["@antv/g", "@antv/g6"]
注意:3.2.10 以下版本的 @antv/g 跑这个示例都必须设置 @antv/g 依赖项。3.2.10~3.8.5 版本的可以不用额外加依赖项,但要相应修改示例代码中的一些依赖包路径才能跑起来

X-Flowchart-Vue

该项目 的示例有些 Viso 的味道,画流程图爽歪歪,文档很 Nice,不足的是包太大了。测试了一下该示例不能兼容 IE。

因为该工程根本没有设置 transpileDependencies,如下设置就可以了:

transpileDependencies: ["@oxoyo/xfc"]
注意:示例工程依赖,@oxoyo/xfc,后者依赖 @antv/g6,通常在 transpileDependencies 添加的是直接依赖。

普通工程

普通的 Vue CLI + @antv/g6 工程有没有兼容 IE 问题呢?经我测试,@antv/g6 4.0.4 以上版本不能兼容 IE,会报如下错误:

proxy-error.png

My God,新版竟然用了 Proxy 。一步步排查发现在 @antv/layout/es/layout/layout.js

// FIXME
// FOR G6
export const Layouts = new Proxy({}, {
  get: (target, propKey) => {
    return getLayoutByName(propKey);
  },
  set: (target, propKey, value) => {
    registerLayout(propKey, value);
    return true;
  }
});

阿里的前端同学也不容易,对不对?。没办法,既然用了 Proxy,就等于放弃 IE 了。所以如果一定要支持 IE, @antv/g6 的版本最好是 3.1.0~4.0.4。由于 3.1.0 以下版本改动太大,不推荐使用。

总结

结合工作实践,总结一下解决兼容 IE 的办法:

  1. 低版本 Vue CLI 工程,检查有没有配置 babel-plugin-transform-runtime/babel-polyfill
  2. 高版本 Vue CLI 工程,检查有没有配置 core-js
  3. 高版本 Vue CLI 工程,想一想要不要配置 transpileDependencies,本文中的 @antv/g6,还有经常用到的vue-echartsvue-baidu-map,都需要设置相应 transpileDependencies
  4. 最后考虑要不要降级依赖的第三方库。高版本的 @antv/g6swiper都不能兼容 IE,降级后可以兼容。

有同学可能会说,微软都放弃 IE 转向 Edge 了吗?花那么多精力搞 IE 兼容干什么呢?说实话,我也盼望 IE 早点退出历史舞台。但事实上,客户说一定要支持 IE,老板产品说一定要支持 IE,有什么办法呢?

2

评论 (0)

取消