• 开始时间:2021-04-02
  • 目标主要版本:3.x
  • 引用 issue:N/A
  • 实现的 PR:N/A

摘要

  • 放弃对 Vue3 的 IE11 支持计划。
  • 专注于将兼容的功能后移到 Vue 2.7 中。

基本范例

N/A

动机

追溯到 2018 年底,从 Vue3 的开始,我们就被问到了对 IE11 的支持。很多用户问 Vue3 是否会支持 IE11,我们最初的计划是先发布 Vue3,让它稳定下来,后期再加入对 IE11 的支持。在漫长的开发过程中,我们也为 IE11 的兼容性做了一些侧面的研究和实验,但由于涉及的复杂性和手头其他工作的数量,已经被取消了下一步的优先权。

当我们在 2021 年的今天再次审视这个问题时,浏览器和 JavaScript 的格局已经发生了相当大的变化。更多开发者现在正在使用现代语言的功能,更重要的是,微软本身已经开始通过对 Edge 的投资积极推动用户远离 IE它也在自己的主要项目中放弃对 IE11 的支持,如 Microsoft365。就在几天前,WordPress 也做出了放弃 IE11 的决定。IE11 的全球使用率已经降到 1% 一下。当我们在谈论面向公众的网站和应用程序时,IE11 显然在快速下降。

我们相信这是一个重新思考 IE11 对 Vue3 支持的机会。

在 Vue3 中支持 IE11 的成本

行为不一致

Vue2 的响应式系统时基于 ES5 的 getter/setter。Vue3 利用 ES2015(ES6) 的 Proxy 来实现更高性能和更完整的响应式系统,这在 IE11 中是不能被 polyfill 的。这是主要的障碍,因为这意味着 Vue3 要支持 IE11,它基本上需要发布两个不同版本 —— 一个使用基于 Proxy 的响应式系统,一个使用类似 Vue2 的基于 ES5 的 getter/setter。

Vue3 的基于 Proxy 的响应式系统提供了几乎完整的语言特性覆盖。它能够拦截 ES5 中不可能或不切实际的操作,例如,属性添加/删除、数组索引和 length 的突变,以及运算符 in 检查。为 Vue3 的 Proxy 版本编写的相同代码在 IE11 版本中无法使用。这不仅给我们带来了技术上的复杂性,也给开发者带来了持续的心理负担。

我们最初的计划是在 IE11 版本的开发构建中同时提供 Proxy 和 ES5 的响应式实现。当它在一个支持 Proxy 的开发环境中运行时,它将检测并警告非 IE11 兼容的使用。这在理论上时可行的,但会产生巨大的复杂性,因为它需要将两种实现混合在一起,并且可能造成开发和生产之间的行为差异。

长期维护负担

支持 IE11 也意味着我们必须考虑在整个代码库中使用的语言特性,并为我们的分发文件制定适当的 polyfill/transpilation 策略。每一个不能在 IE11 中 polyfill 的新功能都会产生另一个行为注意事项。一旦 Vue3 承诺支持 IE11,它将无法摆脱它,直到下一个主要版本。

库作者的复杂性

如果它能完全包含在 Vue 本身,其复杂性还是可以接受的。然而,在与社区成员讨论后,我们意识到两种响应式实现的共存,不可避免的也会泄漏给库的作者。

通过在 Vue3 中支持 IE11,库的作者基本上也需要做这个决定。库的作者将不得不考虑他们是用什么版本的 Vue3 运行的(在可能还支持 Vue2 的基础上)—— 如果他们决定支持 IE11,他们必须在编写他们的库时牢记 ES 响应式的注意事项。

有助于 IE11 活得更久

没有人喜欢支持 IE11。它是一个停留在过去的垂死的浏览器。网络生态系统越是向前发展,我们在试图支持它时需要弥补的差距就越大。讽刺的是,通过在 Vue3 中支持 IE11,我们给了它更多坚持下去的理由。考虑到我们的用户群,放弃对 IE11 的支持可能会让它更快地被淘汰。

对于那些绝对要支持 IE11 的人

我们很清楚,对于 IE11 的真正需求来自那些无法升级的人:金融机构、教育部门以及那些依赖 IE11 的屏幕阅读器。如果你正在建立一个针对这些部门的应用程序,你可能没有选择。

我们的建议是,如果你需要 IE11 支持,请使用 Vue2。与其为 Vue3 和未来版本的 Vue 招致大量的技术债,我们认为在 2.7 版本中把精力转到向 Vue2 回传兼容的功能上会更有意义,并确保两个主要版本的开发经验更加接近。

一些可以回传到 2.7 的功能:

  • [@vue/composition-api](https://github.com/vuejs/composition-api) 插件合并到 Vue2。这将使得 Composition API 的库能够直接适用于 Vue2 和 Vue3。
  • 在单文件组件中的 [<script setup>](https://github.com/vuejs/rfcs/pull/227) 语法。
  • emits 选项。
  • 改进 TypeScript 的类型。
  • 在 Vite 中正式支持 Vue2(目前通过非官方插件)。

注意:上述清单是暂定的/非详尽的,将在一个单独的 RFC 中讨论/确定。