- 主题:vue3搞出大新闻来了
这个rfc我从开头一直在跟。我是新api的坚定支持者。新api本质上和react hooks没关系,就是看起来有点像,本质上就是以前 data computed watch methods 等东西换了个写法,把原来内部的功能函数暴露出来了,提供一个函数式的写法,不再suffer from this magic等等从前没法typing的老大难问题。按我的想法,vue的api从历史第一天就应该这么设计,那个山寨兮兮的object-based option api真是不科学。
然后,rfc下面某些反对者说的“高高在上优越感”的发言,其实基本都不是core team member。member们都在装孙子,是几个外围的rfc常客在不客气地各种怼,其中包括我。。
【 在 eGust (十年) 的大作中提到: 】
: 这个 rfc 跟前两天已经长得很不一样了,估计没人愿意翻历史,所以再补充点儿信息:
: 开始的时候,明确说 vue 2.x 的语法将在 v3 中 deprecated,预计在 v4 中移除,一听要移除大家就慌了。当然也包括我,毕竟在我的努力下新项目用了 vue,刚俩月就听说隔个两三年就得重写,这个让人不太好交代……还好周末过去,基本打消了这个顾虑。
: yyx 在 pr、推特中似乎还有过一些不太客气的说法,所以论坛上连 petulant、childish 这种词都出来了,不止一人对 vue 核心团队成员在讨论中高高在上的态度表达了不满……
: ...................
--
FROM 171.217.143.*
我比较清楚具体的过程。
最开始根本没觉得这回是一套新的api,就是暴露了一些内部功能函数出来,允许在组件之外建立反应性data和computed这种东西。
另一条线上一直在讨论class api,为更好的typing服务。但是后来发现class api搞不定typing。
然后尤忽然发现结合内部暴露出来的新功能函数,换一个组件写法,加一个setup(),就可以完全完美解决typing问题,顺便解决了mixin等逻辑抽象工具的各种不足。
所以就赶紧写了一个新rfc,写了个新api初稿请大家提意见。
然后我们一堆从class api过来的被typing难题折磨得欲仙欲死得人看见这个新方案,都拍案叫绝。
然后核心团队就信心大增,感觉这个东西将来有可能可以代替就api,就把将来有可能deprecate 旧api这个想法也写进了rfc
然后过了两天,rfc就爆了
然后大家赶紧把要废api这个想法给废了,相关内容都从rfc里又删掉了。
最新的版本是承诺可预见得未来不会废除就api
【 在 eGust (十年) 的大作中提到: 】
: 刚才回的长文被审核了……
: 问题关键不在新 api,而是要废老 api。这么一搞就让人信心不足,你今天觉得 hooks 好可以废掉 v2,那明天出个别的完全有可能在 v4 里废掉 v3。一个项目隔个两三年就要重写一遍,这是谁都接受不了的。
: 如果当初只说我们有套新的 api 长得很像 hooks,那大家可能会跟 react 社区一样开心。
: ...................
--
FROM 171.217.142.*
react和vue的核心区别是reactivity的实现方式。
理论上vue里面的computed watch也都不是必要概念,完全可以和react一样留给用户自己实现。父子之间的event传递也可以转化为函数prop的传递。
所以其实任何一个UI框架的核心概念也就是props和state嘛。本质区别还是怎么检测变动。react hooks搞得那么magical,就和react的检测机制有关。vue把检测放在了proxy/gett/setter层面,比较精细,所以vue开始做类似hooks的api的时候感觉更自然,更直观好理解。
第二个核心区别就是template vs jsx,当然我自己以前也是在vue里面写jsx的,不过大部分vue用户还是习惯template。我并不觉得会有很多人因为这个新api而转react,因为jsx不是每个人都能接受得了的。。。
【 在 eGust (十年) 的大作中提到: 】
: vue 的卖点在哪是另外一个话题了,但这场风波的核心跟新 api 一点儿关系都没有
: 不过我同意,如果跟 react 搞成一个样子的话,vue 就没什么优势了。毕竟 react 除去 lifecycle 只有 state、props 两个核心概念,跑到 vue 就变成了 data、computed、methods、watch 再加上 event 一共五个半概念了
--
FROM 171.217.143.*
重要的项目一般都会锁依赖版本的吧。。。从2.6升到2.7都不敢,何况2升到3
不管最前沿发展到啥版本了,稳定性要求高的历史悠久项目肯定不敢追新,乖乖继续在旧版本依赖上做增量式开发。唯一的问题就是如果落后太多版本的话,社区里面现成可用的新插件轮子往往没法直接用,得改改。。
【 在 eGust (十年) 的大作中提到: 】
: 我很好奇你们项目的生命周期都多长?
: 按照现在 agile 的德性,两三年还在不停的加功能。难道你们的项目一年出头就已经没什么事情可以干,闲到可以重写了?
--
FROM 171.217.143.*
n难保不会出现什么神奇bug,踩过好几次坑。当然不是vue的。其他各种包,哪怕是bugfix版本都有可能引入新bug
【 在 a0123456789q (a0123456789q) 的大作中提到: 】
: 2.6到2.7不是non-breaking incremental changes吗?
--
FROM 171.217.143.*
去年围绕这个问题圈里几个大佬吵过一次架,感觉阿里内部大部分前端/node项目组都倾向于锁版本。腾讯里面竟然还有些组不仅锁版本而且真的自己修node_modules里的bug。。
这个事情感觉没啥完美的解决办法,根本上说,重要的商业项目过度依赖普遍不咋靠谱的js社区,这本质上就不是特别靠谱。。。
【 在 eGust (十年) 的大作中提到: 】
: 锁版本不能解决漏洞啊,隔几年官方已经不维护了,audit 一堆严重 vulnerabilities,难不成打算自己修么?
--
FROM 171.217.142.*
我觉得咱俩说的东西本质是一样的。
react为什么走functional单向数据流路线?不是因为它的props和state技术上无法被直接赋值修改,本质原因是因为它的reactivity机制是检测不到直接赋值的,所以必须走setState()之类的显式触发,整体重新生成vdom然后diff。
vue的data为什么不需要setData()?因为用了proxy/setter呗,所以也就没有必要非要使用单项数据流了。
说回现在这个新api,照样一点儿都不functional啊。不是说把object options改成了函数,就functional了。functional意味着无内部跨调用状态,无副作用,数据不可变,等等。vue的这套新函数api,包括react的hooks,都是在解决如何产生和管理副作用的问题,所以和“functional”毫无关系。
rfc里甚至明确说了,新的function-based api无法用于vue的functional component。
我觉得大家感受到的不适,主要是来自形式上从声明式的配置式api(旧对象api其实就是个配置文件一样的东西)变成了命令式一步步调用各种功能来初始化组件的api。这个很多人认为丑,不简洁,乱。
【 在 eGust (十年) 的大作中提到: 】
: 内部实现什么样,对使用者来说并不重要,暴露给用户的 api 才决定代码的组织形式。
: react 的形式是 functional 接口,数据的组织形式是单向的,整体概念上是一致的。
: vue 的组织形式可一点儿都不 functional,这点对不熟悉 fp 的用户是非常友好的。再加上 template 为主(我只在 storybook 里面用 jsx,因为实在不想专门写控件),导致不得不制造许多概念,才能满足代码复用的需求,比如 mixin、slot 什么的。
: ...................
--
FROM 171.217.142.*
【 在 eGust (十年) 的大作中提到: 】
: 这不就体现出 api 稳定性的重要性了么
: react 也不是不改 api,比如去年对 lifecycle 动刀子了。但人家 deprecated 不是说把整套 api 都给改了,几乎得重写全部代码。给你一两年的时间,慢慢把一小部分代码改掉,心理上还是比较容易接受的。
vue这次说的deprecated也是一样的啊,最初的方案就是新旧api并行一段时间,在vue 4的时候根据社区反馈决定是否正式弃用旧api。而vue大版本升级的周期是三年。完全就是和react一样的。
: 所以我一直说这次风波的核心问题并不在技术方面,而是营销策略上的问题
: ...................
--
FROM 171.217.142.*
是的你说的我都同意。reactivity方案的不同带来单向数据流,单向数据流又带来其他的好处(流程清晰,低心智负担)和坏处(啰嗦)。
【 在 eGust (十年) 的大作中提到: 】
: 我还是举一个例子吧,比如我们有这么一类 form 控件
: props: { target: Object, name: String, ... }
: computed: { value: { get() { return this.target[this.name] }, set ... } }
: ...................
--
FROM 171.217.142.*
有道理。
所以后来事情爆了以后就各种修改计划。
最开头是要计划将来废弃旧api
然后改成提供两个build,标准build不含旧api,兼容build含旧api
然后改成提供两个biuld,瘦版build不含旧api,标准build汗旧api
然后改成取消lean build,永远支持新旧api
然后改成新api有可能不进标准,而是通过插件提供。。。
整个过程还是挺喜感的。。
【 在 eGust (十年) 的大作中提到: 】
: 不一样啊,lifecyle 又不是每个控件都会用到,正常情况下只有很少一部分会用。而且也不是全都改了,只是废掉其中3个而已,实际使用中也基本只有一个能用上,需要修改的代码比例就更低了。而且也只是改写控件的一个函数,最终要改的代码量能有1%就不错了,但是 vue 的改
: react 改 api 的时候说,facebook 自己有50k+个控件。你想象一下如果全部手工重构的话,一天改100个,一年算250个工作日,要两年才能改完。按照1%估计,每个礼拜改10个一点儿都不耽误工作进度吧,一年也就改完了。
--
FROM 171.217.143.*