热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

尤雨溪回应:Vue与TypeScript为什么相性特别差?

近日,有开发者在知乎上提出了一个问题:“TypeScript不适合在vue业务开发中使用吗?”,Vue的作者尤雨溪针对这一问题发表了自己的看法,也解释了Vue3.0选用TypeSc

近日,有开发者在知乎上提出了一个问题:“TypeScript 不适合在 vue 业务开发中使用吗?”,Vue的作者尤雨溪针对这一问题发表了自己的看法,也解释了Vue 3.0选用TypeScript的原因,全文如下。

注:本文已获得尤雨溪本人授权转载。

必须要承认的是,2.x 的 TS 支持显然跟 React 和 Angular 是有差距的,这也是为什么 3.0 要加强这一块。

关于目前 2.x 跟 TS 的整合,通常需要基于 vue-class-component 来用基于 class 的组件书写方式。虽然对于默认的对象书写方式有类型推导支持,但里面的实现绕了很多弯。问题的本质其实很简单:因为当初 API 的设计根本就没有考虑类型系统。

Vue 五年半以前刚开始写的时候,JS 根本没有类型系统,我自己当时也不用带类型的语言,所以 Vue 的组件本质上就是一个 “包含了描述组件选项的对象”。

这个设计算是一个典型的 intuition based design,它不是从语言本身的机制或是类型系统出发去设计的,而是单纯从人如何描述自己想要的东西出发的。这样的设计的好处是对于新手很容易理解,缺陷是跟类型系统之间确实存在一定的 “断层”。这个断层的意义到底有多大,对于不同类型的用户其实不太一样。首先,因为 API 还算简单直白,所以即使和传统的 OO 有一定的 mismatch,但大部分人适应起来还是很快。对于不使用类型系统,更关注组件业务逻辑的用户来说,这个断层其实是感受不到的。

其次,这里的断层其实是双向的:你可以说是 Vue 的 API 设计不 type friendly,反过来也可以说是 TS 的类型系统不够强大所以没法给 Vue 提供足够好的支持。一个例子就是 JSX 其实一开始也没有类型支持,完全是 TS 强行给加了一整套针对 JSX 的推导机制才给了 TSX 现在的开发体验。如果 TS 因为 JSX 不属于真正的 JS 规范因而不提供支持,是不是也可以说 React 的设计跟类型系统存在断层?

当然想要抹平这个断层,更直接的办法是对 API 进行重新设计。这话说起来很简单,但对于 Vue 来说,改 API 需要考虑很多东西:

  • 跟原有 API 的兼容性:能否同时支持新旧 API?旧的用户如何升级?像 Angular 那样直接改得面目全非当然比较简单,但说直接点就是不管旧版本用户的死活;

  • 如何设计出既能提供良好的类型推导,又不让为了类型而做的设计 leak 到非 TS 用户的使用体验中去?如何在 TS 和非 TS 的使用体验之间做到最好的一致性和平衡?Again,像 Angular 那样不管非 TS 的用户的死活当然也是比较简单,但我们不会这么做。

  • class 的原生支持不理想:如果太早用 class 作为默认的 API,那么意味着用户不预编译就无法在一部分浏览器中使用,这是我们一直极力避免的情况。Vue 一直很重视 “引入一个 script 就可以开始写” 这样的用例,因为这保证了新人上手的最低门槛,也让 Vue 可以很简单的整合到 legacy 应用当中作为 jQuery 的替代品。所以要改 API 有一个时机问题,太早了不合适。

  • 用 class 写组件所依赖的 class fields, decorators 等提案尚不稳定:基于 stage\u0026lt;4 的提案设计 API 是非常具有风险的,比如大家一开始都默认 class fields 的语义是 [[Set]],结果到 stage 3 改成了 [[Define]],这下 Polymer 急死了,因为它们有一个 API 设计是完全依赖了 class fields 的 [[Set]] 语义的。decorators 提案被彻底重新设计,并且在最近的 TC39 试图升 stage 3 被 V8 团队出于性能的考虑否决,可能又要大改;decorators 是否能放在 export 前面依然还在争论,为此 Angular 的老大 Igor 急的不行… 所以,如何避免设计出来的 API 在提案发生改动之后***也要改,陷自己于尴尬境地?Again,时机问题,等提案成熟,或是等有争议的点有结论后再动手(虽说我其实也是被邀请参与了这些东西的讨论的,但讨论规范真的是超级费时费神,还往往说服不了几个人…)。

额外说说模版和类型推导的关系。表面上看,隔了一层模版语法 + 编译,似乎确实存在 “断层”,但其实里面没你想的差那么远。Vue 的模版是编译成 virtual dom 渲染函数的,生成的 js 跟 React 的渲染函数一样可以类型推导,而模版跟生成的 js 之间是完整的逻辑映射,所以这里其实主要是需要做一些工具链上的衔接,把对生成的 js 分析出来的 intellisense 反馈到 IDE 里的模版上,技术上是完全可行的。

高票答案有另一个地方说 React 的 js 本位使得它做多端渲染简单,这话其实不对,做多端本质上是需要运行时一开始就做核心和平台分离的设计,这一点 Vue 2 一开始就做了(所以才会有 weex, NativeScript Vue 等等),实际上有模版这个更简单的编译源,做多端灵活性还更高一点,现在用 Vue 做小程序多端的方案一点都不少啊,mpvue, megalo, uni-app…

至于 Vue 本身使用什么类型系统做内部实现,其实是另一个问题了。用户用 TS 写 Vue 的体验关键还是在 API,用 TS 做内部实现其实只是减少了额外维护 d.ts 的成本。

至于当初为什么没用 TS,我之前的回答相信很多人都看过了,谁能想到 Flow 团队会这么烂尾呢。相比之下,TS 团队确实是在用心做事的。

总结一下:

  • 现有的 API 和类型系统的结合存在缺陷,属于历史遗留;改新的 API 有个时机问题,请耐心等待 Vue 3;

  • TSX 类型支持好是因为 TS 专门开了后门给做了支持;模版只要工具链到位一样可以做到;

  • Vue 2 一开始内部实现就有类型系统,但是没想到 Flow 烂尾了,而 TS 整个生态越做越好。

更多内容,请关注前端之巅。

尤雨溪回应:Vue与TypeScript为什么相性特别差?

会议推荐

2019年6月,GMTC全球大前端技术大会2019即将到来。小程序、Flutter、移动AI、工程化、性能优化…大前端的下一站在哪里?点击下图了解更多详情。

尤雨溪回应:Vue与TypeScript为什么相性特别差?


推荐阅读
  • 校园表白墙微信小程序,校园小情书、告白墙、论坛,大学表白墙搭建教程
    小程序的名字必须和你微信注册的名称一模一样在后台注册好小程序。mp.wx-union.cn后台域名https。mp.wx-union.cn ... [详细]
  • 这篇文章主要讲解了“如何应对Android面试”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何应对 ... [详细]
  • 小编给大家分享一下TypeScript2.7有什么改进,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收 ... [详细]
  • 2022年9月16日,以CODEFORBETTER_为主题,以2022Google开发者大会为契机举办的Hackathon大赛进行了线上颁奖仪式hac ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 起因由于我录制过一个小程序的课程,里面有消息模板的讲解。最近有几位同学反馈官方要取消消息模板,使用订阅消息。为了方便大家容易学 PythonFlask构建微信小程序订餐系统 课程。 ... [详细]
  • 问题描述:域名已经备案,我全部都有,也在后台配置了,但是手机预览,还是请求失败,PC端是可以请求 ... [详细]
  • 前端简史之纵横:Node东出
    引💡Ajax的出现,带来了jQuery时代,而jQuery时代也伴随着Node风暴淡淡退出了历史舞台。如果说Ajax给前端带来了从网页静 ... [详细]
  • 前言小伙伴们大家好。从今天开始我们将从 ... [详细]
  • TS-入门学习笔记TypeScript是JavaScript的一个超集,主要提供了类型系统和对ES6的支持。与js相比,最大的有点是类型系统的引入,由于js本身是弱类型语言,所以天 ... [详细]
  • 唱唱反调:风口上的技术不要盲目追
      对于前端领域的开发者来说,“学不动了”虽然更多是一种调侃,但也真实地反映出了他们面对频繁出新的前端技术时又爱又恨的心情。在经历了移动互联网的大爆发后,前端领域的边界不 ... [详细]
  • 刘连响:为什么看好小程序音视频在教育行业的应用?
    作者简介:刘连响,一起玩耍科技创始人。2013年起开始研究WebRTC,对音视频处理、直播、实时音视频相关技术非常感兴趣,具 ... [详细]
  • 本文介绍了自学Vue的第01天的内容,包括学习目标、学习资料的收集和学习方法的选择。作者解释了为什么要学习Vue以及选择Vue的原因,包括完善的中文文档、较低的学习曲线、使用人数众多等。作者还列举了自己选择的学习资料,包括全新vue2.5核心技术全方位讲解+实战精讲教程、全新vue2.5项目实战全家桶单页面仿京东电商等。最后,作者提出了学习方法,包括简单的入门课程和实战课程。 ... [详细]
  • 西安小程序开发,小程序制作,一个后台管理多端小程序功能性
    小程序已经发展4年多时间大全app下载汅api免费安卓。从最初简单demo到现在底层api接口。让我们的小程序和APP一样可以轻松的操作硬件信息。对于调取手机硬 ... [详细]
author-avatar
手机用户2502908277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有