Vue 新语法糖引争议,网友:魔改 JavaScript,这是想挑战标准?

2020 年 11 月 23 日

Vue 新语法糖引争议,网友:魔改 JavaScript,这是想挑战标准?

近日,Vue 作者尤雨溪在社区意见征求稿(RFC)上提交了一份 Ref 语法糖的提案,引起了开发者们的争议。


起因是一个新语法糖


尤雨溪在该 Ref 语法糖的提案中加入了一个新的功能:在单个文件组件(SFC)中引入了新的 script 标签写法,写法为 <script setup> 。这种写法会自动将所有顶级变量声明公开给模板(template)使用。同时在 <script setup> 中引入了一个基于编译器的语法糖,用于消除 ref 的 value 属性,该语法糖在编译期间自动将语法糖转为正常代码。


在 RFC 中,用一段 HTML 代码进行了举例。编译前,代码为:


<script setup>// declaring a variable that compiles to a refref: count = 1
function inc() { // the variable can be used like a plain value count++}
// access the raw ref object by prefixing with $console.log($count.value)</script>
<template> <button @click="inc">{{ count }}</button></template>
复制代码


编译后,代码为:


<script setup>import { ref } from 'vue'
export default { setup() { const count = ref(1)
function inc() { count.value++ }
console.log(count.value)
return { count, inc } }}</script>
<template> <button @click="inc">{{ count }}</button></template>
复制代码


引发争议


该语法糖提案发布后,很多开发者在下方留言表示反对。引起开发者们反对的主要原因在于几个方面:对 JavaScript 的魔改太严重;为什么用标签语法而不是直接发明新语法;感觉心智负担变重了等等。部分反对者认为 Vue 此举是想挑战标准,对这种反标准的行为持反对态度。



一位小哥有理有据地对该提案表示了反对:当代码中有两个 ref: 时,就不是合法的 JS 了,所以尤雨溪的提案不合适。



而作者尤雨溪对 GitHub 上的每条质疑都进行了回应。他表示,自己知道这一提案可能会引发争议,但提交该语法糖的动机是希望:


  • 通过自动暴露顶级变量来减少代码的冗余度;

  • 通过 ref: 语法 让 ref 更高效。


此外,尤雨溪还在知乎上对三个主要的问题进行了回应:


看上去不像 JavaScript


ref: count = 1 使用的是标签语法,在 syntax 层面是合法的 JavaScript,而且在非严格模式下是可以正常执行的,甚至语义也是声明了一个名为 count 的全局变量。同时这也是合法的 TypeScript 语法,不会和类型声明混淆(类型声明必然需要 let 和 const)

当然这里确实只是语法层面的合法,实际上等于是给 ref: 这个标签赋予了一个不同的语义。标签语法本身是一个极少被使用的功能,实际使用也都是用于标记循环声明(用在 for/while 前面),像例子中 ref: count = 1 这样的用法,其原始语义是毫无用处的,这也是为什么我们认为牺牲这个原始语义来获得响应式的变量声明是一个值得的交换。


为什么用标签语法而不是直接发明新语法


使用标签语法确实是受到了 Svelte 的启发。根本原因在于和 JS 保持 syntax 层面的完全兼容能够尽可能保证现有的 JS 工具生态对接。标签语法能够正确地被 Babel,TS parser/transformer(如 esbuild/swc),Prettier,ESLint 以及任何 IDE 的 JavaScript 语法高亮所直接支持,只有在涉及语义的情况下,如类型推导和 ESLint 变量相关规则才需要针对性的兼容。如果用一个全新的非标准语法,就意味着需要在 parser 层面对上述所有工具进行修改,基本不可行。类型推导的问题 RFC 里也有专门讨论,有兴趣的可以看原文,这里不赘述。


感觉心智负担变重了


虽然底层是编译到 ref() 的语法糖,但其实对于新人来说根本不需要知道 ref() 的存在就可以使用,因为在不需要获取底层 ref 对象的场景下,**通过 ref: 声明的变量心智模型和用 let 声明的变量的心智模型完全一致。**你就把 ref: 当成一个响应式的 let 就行了。这个模型已经足够实现大部分入门级别的功能,只有到进阶之后开始学习逻辑抽取复用时,才需要知道 ref() 的概念。

对于已经学习了 Composition API 的用户来说会觉得 “又多了一个概念”,同时由于 RFC 事无巨细地讨论了编译的规则,会产生一种 “心智负担增加了” 的错觉。其实我很久以前用 CoffeeScript,Babel,或是刚开始用 TS 的时候,也有这样的感觉,因为我喜欢用之前先看看这东西编译出来是个什么样子。结果就是看过了这个之后用着上层语法,脑子里忍不住去把它转换成底层语法。但这本质上是我们的大脑在习惯了底层思维方式之后的一种惯性。这种惯性在使用新语法一段时间之后很快就消失了,我们的大脑适应能力还是很强的。如果你开始就不 care 编译出来是个什么结果,就更不会有这个问题(你用 nullish coalescing 或者 decorator 的时候会去想着 babel/TS 编译出来是个什么结果么?)


此外,还总结与回答了一些其他的疑问,具体回答可以移步知乎


尤雨溪表示在该 RFC 提案发布之前自己就知道会引起很多争议,大部分的反应都在意料之中。他也能理解很多开发者的第一反应都是“不能接受”,不过当初 TypeScript,Hooks,Composition API,甚至是 React/JSX 刚发布的时候也有很多开发者表示不能接受。同时,尤雨溪说:“这只是一个提案!”提案不一定会落地,对问题的回应也并非说服大家该提案一定是“真香”,主要还是为了邀请广大开发者们一起进行探讨与设计。


对于新技术而言,开始的时候大多开发者都会觉得无法接受,但一个技术的优劣一定是需要通过实践来检验的。感兴趣的朋友可以去看看 RFC 原文


对此你有什么看法呢?欢迎在下方评论区留下你的看法。

2020 年 11 月 23 日 15:453784

评论 2 条评论

发布
用户头像
jsx最初也是颇受争议,现在大家都觉得香,未来进标准估计也是可能的(w3c标准)
2020 年 11 月 23 日 15:50
回复
标准也不是死的,本身就是对经验的规范总结.循规蹈矩也太死板了
2020 年 11 月 23 日 15:51
回复
没有更多评论了
发现更多内容

大作业-同城快递

林毋梦

C++隐式推导-auto关键词

良知犹存

c++

架构师训练营大作业

方堃

Skywalking Php注册不上问题排查

心平气和

php Skywalking 全链路追踪

思维导图

架构师训练营大作业

Bruce Xiong

轻松的可贵

谷鱼

回忆 转折

架构师训练营第 1 期第一次作业

强风

架构师 0 期第十三周命题作业

何伟敏

第一周总结

睁眼看世界

极客大学架构师训练营

使用枚举的正确姿势

Java旅途

Java 单例 枚举

大作业二

嘻哈

LeetCode题解:66. 加一,BigInt,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

Golang领域模型-聚合根

奔奔奔跑

golang 架构 微服务 领域驱动设计 DDD

互联网架构师能力图谱

dony.zhang

架构师 架构师技能

架构师训练营-week01-作业

大刘

极客大学架构师训练营

架构师训练营大作业二(架构思维导图)

吴建中

系统架构师训练营大作业(一)-同城物流快递业务系统架构设计

吴建中

拖动旋转的 3D 骰子效果

Clloz

CSS transform rotate3d

在进行廋身之前,对你来说是想要找到问题的真相?或是解决当下的问题?

叶小鍵

心理学 基思·斯坦诺维奇

oeasy 教您玩转 linux 之 010301 电子宠物 pet

o

LeetCode题解:84. 柱状图中最大的矩形,使用栈,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

第一周作业

alpha

极客大学架构师训练营

架构师训练营-大作业

连增申

食堂就餐系统 UML 图

睁眼看世界

极客大学架构师训练营 食堂就餐系统

有了数据湖探索服务,企业决策“新”中有数

华为云开发者社区

Serverless 数据湖 数据分析 云原生 华为云

“锟斤拷”的前世今生

Java旅途

Unicode 编码 ASCII 锟斤拷

架構師訓練營第1期-第01周總結

Panda

期末作业-达通快递

森林

技术解析丨C++元编程之Parser Combinator

华为云开发者社区

c++ 字符串 Parser Combinator Parser 元编程

架构师 0 期大作业(二)

何伟敏

Vue 新语法糖引争议,网友:魔改 JavaScript,这是想挑战标准?-InfoQ