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

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

本文由编程笔记#小编为大家整理,主要介绍了尤雨溪回应:Vue与TypeScript为什么相性特别差?相关的知识,希望对你有一定的参考价值。
本文由编程笔记#小编为大家整理,主要介绍了尤雨溪回应:Vue与TypeScript为什么相性特别差?相关的知识,希望对你有一定的参考价值。







作者|尤雨溪


编辑|覃云


近日,有开发者在知乎上提出了一个问题:“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<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 整个生态越做越好。




知乎原文

https://www.zhihu.com/question/310485097/answer/591869966




尤雨溪回应:Vue与TypeScript为什么相性特别差? AI 开发 最热的AI资讯都在这里~




推荐阅读
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
  • 本文介绍了自学Vue的第01天的内容,包括学习目标、学习资料的收集和学习方法的选择。作者解释了为什么要学习Vue以及选择Vue的原因,包括完善的中文文档、较低的学习曲线、使用人数众多等。作者还列举了自己选择的学习资料,包括全新vue2.5核心技术全方位讲解+实战精讲教程、全新vue2.5项目实战全家桶单页面仿京东电商等。最后,作者提出了学习方法,包括简单的入门课程和实战课程。 ... [详细]
  • Error in nextTick: quot;TypeError: Cannot set property #39;xxx#39; of undefinedquot;解决办法
    vue项目在控制台中报这个错误时,当看到nextTick词时想到vue的$nextTick()方法Vue在更新DOM时是异步执行的。只要侦听到数据变化, ... [详细]
  • 前言作为一个移动端初学者、爱好者,能使用前端技术开发原生游戏一直是一件渴望而不可及的事情,暂且不说游戏逻辑的复杂度,算法的健壮性ÿ ... [详细]
  • 小编给大家分享一下TypeScript2.7有什么改进,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收 ... [详细]
  • 最简便的 JavaScript 代码检查工具安装方式
    前两天发了一篇用mingw编译javascriptv8,讲述我为了在Windows下给javascript做lint检查,费劲去编译google的jav ... [详细]
  • TS-入门学习笔记TypeScript是JavaScript的一个超集,主要提供了类型系统和对ES6的支持。与js相比,最大的有点是类型系统的引入,由于js本身是弱类型语言,所以天 ... [详细]
  • 业务:Payments&Risk大数据/AI/数据可视化时间要求:至少实习6个月,每周5天,入职时间4-5月 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 技术周报·2021-05-07-小编推荐向现代Javascript转型原文标题:Publish,ship,andinstallmodernJavaScriptforfaste ... [详细]
  • idea激活服务器 3月最新注册码
    idea激活服务器3月最新注册码,https:www.yht7.comidea。详细ieda激活码不妨到云海天教程 ... [详细]
author-avatar
竹叶清2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有