11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

尤雨溪向 React 推荐自己研发的 Vite,网友:用第三方工具没有任何意义

  • 2022-06-30
  • 本文字数:4178 字

    阅读完需:约 14 分钟

尤雨溪向 React 推荐自己研发的 Vite,网友:用第三方工具没有任何意义

近期, React 团队正在更新 React 文档。期间,Vue.js 作者尤雨溪发布推特称,新的 React 文档应该向初学者推荐 Vite 而不是 CRA——或者如果需要使用 ESLint 或测试,至少也该推荐一个基于 Vite 的自定义模板(也应该使用 Vitest 而不是 Jest)。

 

Vite 是一个通用的构建工具,旨在为 VanillaJS、Vue、React 和 Svelte 等现代 Web 项目提供更快、更精简的开发体验,它不依赖于任何特定的框架。值得注意的是,Vite 由 Vue 开发团队开发,尤雨溪也是 Vite 的核心开发者。


尤雨溪发布这样的内容引起了开发者的讨论。

 

有开发者留言称:React 围绕自身创建了自己的工具(jest、CRA、测试库)。许多项目仍在使用它们。推荐第三方工具没有任何意义(不管是否为了初学者),无论其他看起来多好,都要维护自己的工具。

 

尤雨溪回应称:React 团队没有创建 Jest/testing -library,也没有维护它们。CRA 在某种程度上是第一方的,但一旦放弃它,他们可以为用户提供更好的 DX 并减少自己的维护负担。

 

面对开发者对 Vite 的质疑,尤雨溪表示,“我不认为 Vite 的级别太低,它提供了几乎 CRA 提供的所有配置。”尤雨溪还补充道,“我当然有偏见,但我很想知道是否有任何的正当理由来坚持使用 CRA。”

 

两大主流框架之争

 

作为 Web 前端的两大主流框架,React 和 Vue 之间竞争尤为激烈,双方“战争”持续多年,分别拥有自己的坚定支持者。

 

React 起源于 Meta(前 Facebook)的内部项目,当时公司对市场上所有 JavaScript MVC 框架都不满意,便决定自行开发。2011 年,Facebook 首次将 React 部署在 News Feed 上,随后在 2012 年部署到了 Instagram 上。2013 年 5 月,Facebook 宣布将项目开源。

 

目前,React 是很多大公司的首选,像 Atlassian (Jira, Trello)、Codecademy、Dropbox、Netflix、Airbnb、Twitter、Reddit 和阿里都使用的是 React。React 虽然一直被视为框架,但同样适合构建 Web 应用程序的整个视图。

 

而 Vue 最早是在 2014 年 2 月发布。尤雨溪表示,Vue 提取了 Angular 中自己喜欢的部分,然后构建出了这款相当轻量的框架。最早的版本发布在 Hacker News、Echo JS 与 Reddit 的 /r/javascript 版块,一天之内就登上了这三个网站的首页。现在,Vue 也是 Github 上最受欢迎的开源项目之一。

 

根据尤雨溪的说法,Vue 的主要用户是中小型企业、自由职业开发者和小型 agency。现在使用 Vue 的企业包括 Behance、Dribbble、Adobe、GitLab、Namecheap、Grammarly、任天堂、Zoom、Louis Vuitton、Google Careers 等。

 

这不是尤雨溪第一次公开评价 React。

 

今年 5 月,React 核心团队成员 Dan Abramov 在推特上发布了 React 新文档,有网友赞扬该文档在结构、美观和性能等方面都达到了非常高的标准。但尤雨溪表示,在对 Vue 新文档和 React Beta 文档分别做了测试后认为,Vue 新文档在性能方面更有优势。

 

对此,Dan Abramov 表示,文档还处于 Beta 版本,正式版上线前会优化性能。然而有网友发现,Dan Abramov 在 5 月 26 日晚上熬夜对 React 新文档的性能做了优化。React 与 Vue 的竞争可见一斑。

 

到底用哪个?

 

业内对“React 和 Vue 到底谁更厉害”、“React 和 Vue 选谁”的讨论从未停止。开发者 Oleg Goncharenko 从 React 与 Vue.js 如何创建组件、各组件之间如何相互通信,以及组件如何影响浏览器 DOM 三个方面做了分析。

 

React 与 Vue.js 中的组件构建原则

 

组件的作用是在网络浏览器上呈现数据,包括向用户展示的 UI 部分(HTML)与逻辑部分(JS)。这里的逻辑,负责描述浏览器中所传递数据的功能和方法。

 

React 使用 JavaScript Syntax Extension (JSX),这种语法语言有助于编写出与浏览器内本地方法相对应的函数。Safari、Chrome 和 Firefox 都基于 JS 引擎,所以可以直接与由 React 编写的逻辑函数对话。但由于 JS 代码中还包含大量 HTML 标记,网络浏览器无法直接识别。因此,React 需要使用 Babel Transpiler 将代码转换为纯 JS。

 

JSX 允许在 JS 当中返回 HTML 或者在 HTML 中执行。而 JS 变量则可以用 HTML 标记进行分配,具体如下所示:

 

const message = <h1>React is cool!</h1>

 

动态变量可以被放在 JSX 中的括号语法( { ... } )内。


根据 Stackshare 的统计数据,React 最受欢迎的特性一是组件(747 票),二是便捷性(484 票)。但 JSX 获得的支持则非常有限,仅得到 31 票。


JSX 最大的问题在于它不要求特定的代码结构,所以组件逻辑和 UI 都存放在单一文件内,很可能导致代码混乱。

 

这种将组件存放进单一文件的思路跟 Angular 正好相反,后者要求将 HTML、JS 和 CSS 分别保存在不同的文件内。除非 Airbnb 和 Netflix 加入 React 社区,并使用 React 构建自己的 MVP(最小可行产品),否则这种单文件组件实现形式肯定无法成为主流。

 

与 React 一样,Vue.js 也推荐将 UI 和逻辑保存在同一文件中。Vue.js 中的组件代码则被包含在特定的 HTML 模板之内。模板的存在为组件代码勾勒出了清晰的轮廓。程序员可以借此观察方法、属性和渲染函数。

 

另外,Vue.js 有自己的特定语法 ,使用双括号{{ }}作为数据占位符。HTML 属性则是 VUe.js 中的指令,包含前缀 v-。同时,Vue.js 还支持用 JSX 进行编码,这也扩展了框架自身的编程能力。

 

总的来说,React 要求开发者拥有扎实的 JS 技能,而 Vue.js 对新手开发者更加友好。与 React 类似,Vue.js 也支持使用 JSX 编写,但其组件是用 HTML 模板编写而成。

 

组件如何影响浏览器 DOM?

 

当用户打开网页时,网络浏览器会将其解析为树状结构,并自上而下进行读取,这种树状结构文件被称为文档对象模型(DOM)。如果用户在页面上执行了某些操作,浏览器就需要重新创建页面并读取 DOM。这就会带来更多负载,并占用掉浏览器资源。

 

React 避免了传统 DOM 渲染,转而利用浏览器内的数据渲染能力。React 设计了一种把内容渲染到虚拟 DOM 的方法。运作原理如下:

 

  1. 在网络浏览器加载网页之前,React 会制作一份 DOM 副本,并把所有对象都放进一个新组件内。

  2. 当用户打开网页时,React 访问的不是实际 DOM,而是渲染 DOM 的副本——也就是虚拟 DOM。

  3. 当用户浏览页面的同时,React 也在计算其中所有变更。如果用户点击了某个按钮或执行了其他操作,React 就会创建一份新的 DOM 快照,再将其与之前的版本进行比较。

  4. 如果再有其他节点元素发生了变化,React 就会更新页面以渲染实际 DOM。


而 Vue.js 没用 React 的虚拟 DOM 思想,处理方式也有所区别。尤雨溪对此曾评价道:在大多数情况下,这种方式确实资源成本低廉、速度更快。但是,如果需要重新创建大量 JS 对象,那操作成本仍然很高。虚拟 DOM 最大的问题是,无论模板中的动态内容是多还是少,总是需要遍历整个树才能弄清到底发生了哪些变化。

 

因此,Vue.js 现在只跟踪 DOM 树中每个对象之内的依赖项。Vue 3.0.11 中的虚拟 DOM 只跟踪动态元素,也就是包含<p v-if="ok">的部分。

 

遍历 DOM 树内节点确实非常耗时,因此 Vue 做出了技术调整。但自从 16.0 版本开始,React 团队已经完全重写了工具包核心,改进了渲染算法,也即现在的 React Fiber。

 

React 将函数分为影响浏览器 DOM 的函数,以及与 props、state 更新相关的函数。组件更新被归入“functions”类别,而生命周期方法和 DOM 变更则被归入“side-effects”。这样程序员就可以优先考虑渲染工作。为了让动画能够平滑过渡,生命周期操作等更为耗时的工作可以先行延后,同时也可以将高优先级任务安排到同一队列内,之后再拆分成多个更小的任务或者增量。

 

由于工作单元,即 fiber nodes 的存在,上述解决方案也就有了实现的可能。每个 fiber 对应渲染流程中的特定步骤。它提出数据的线性表示,而非树状结构。这样尤雨溪提出的时间损失问题也就迎刃而解了。

 

React 因 Fiber 得到改进,也吸引到更多初创公司。当初使用 Vue.js 的阿里如今也选择了 React。此处,总结下 React 和 Vue.js 在虚拟 DOM 处理方法上的不同:

 

  • Vue.js 中的模板机制可将组件表示为迷你 DOM。Vue.js 并非跟踪每个对象,而是遍历模板中的动态部分,因此能够充分优化虚拟 DOM 操作,并充分利用 Vue.js 项目中的客户端渲染。

  • React 利用 Fiber 技术,可以跳过或推迟较为耗时的任务以提升程序性能。如此一来,开发人员就能在动画过渡期间控制渲染过程、调整性能水平。

 

组件数据绑定

 

在数字绑定方面,大家往往持不同观点。有些人说 React 只支持单向数据流,Vue.js 只提供 Angular 那样的双向绑定,其实并不是这样。React 和 Vue.js 都支持单向和双向数据流,而且也都优先推荐使用单向数据流。

 

React 支持回调函数,因此子组件可以将 props 传递给相应的父组件。例如当用户在子组件的输入字段内键入文本,这些变更也将被反映至父组件并执行内容更新。React 社区还提供 react-hook 库,专门用于实现双向数据绑定。

 

Vue 3.0.11 版本的说明文档也解释了其单向数据绑定的优势:所有 props 在子属性与父属性之间形成一个单向向下绑定。当父属性更新时,就会下流至子属性,但子属性更新不会上流至父属性。这样可以防止子组件意外改变父组件状态,避免提高应用程序数据流的理解难度。

 

此外,每当父组件更新时,子组件内的所有 props 都会被刷新为最新值。因此开发者不应尝试改变子组件内的 prop。在检测到这类操作时,Vue 会在控制台内发出警告。

 

总结

 

总的来说,React 的优势在于客户端渲染极快、对数据流的良好控制、具有轻量级架构,可扩展性与可伸缩性好,并拥有大型社区支持。但是,React 在缺少 Redux、routing 等库和服务的情况下无法运行、无结构代码极易陷入混乱。同时学习曲线较为陡峭,要求开发人员对 JS 拥有深入了解,并具有单页应用程序(SPA)设计经验。另外,更多的选项也对应着一定的实施成本。

 

因此,以下类型的企业可能更适合使用 React:

 

  • 需要在市场上快速开发功能并验证项目的早期初创企业。

  • 寻求外包开发的企业。与 Vue.js 相比,React 专业开发人员的劳动力供应更为充足。

  • 基于产品且需要跨平台应用开发的企业(强烈推荐基于 React 技术的 React Native)。

 

Vue.js 将 React 与 Angular 的优势属性结合为一,最大的亮点就是完美的用户体验。此外,它还提供虚拟 DOM 功能和经过优化的代码结构。Vue.js 对开发者友好,有精细的用户文档。但 Vue.js 较难获得经验丰富的开发人才,社区规模相比之下不如 React。

 

因此,以下类型的企业可能更适合使用 Vue.js:

 

  • 以 Web 类产品为核心的企业。

  • 希望在开发过程中实施单一流程的企业。

  • 缺乏在构建过程中使用框架的经验,或希望充分利用原有 JS 开发人才的企业。

 

参考链接:

 

https://brocoders.com/blog/react-vs-vue-comparison-2021/

2022-06-30 15:175574

评论 1 条评论

发布
用户头像
vue的主要用户是中国的小公司 原因只是因为上手简单 有中文文档
2022-07-05 09:34
回复
没有更多了
发现更多内容

【网易云信】网易云信 toB 质量保障体系实践

网易智企

质量保障 PaaS平台

无脚本自动化测试

FunTester

鱼传科技:函数计算,只要用上就会觉得香

阿里巴巴云原生

阿里云 云原生 函数计算

Apache Doris Join 实现与调优实践|未来源码

MobTech袤博科技

Vue基础学习(三)

Studying_swz

Vue 11月月更

【kafka思考】最小成本的扩缩容副本设计方案

石臻臻的杂货铺

kafka 11月月更

“工程化”对于大型数据平台而言,意味着什么?新一届StartDT Hackathon来了

奇点云

数据平台 奇点云

化繁为简|AIRIOT智慧水务信息化建设解决方案

AIRIOT

物联网 智慧水务

RocketMQ 在同程旅行的落地实践

Apache RocketMQ

消息队列 Apache RocketMQ

快速实现无人车远程控制开发——实践类

阿里云AIoT

阿里云 物联网 远程控制

是谁的请求导致我的系统一直抛异常?

阿里巴巴云原生

阿里云 微服务 云原生

华为全联接2022 openEuler 累计装机量达 245 万套,市场份额 22%,助力企业高效进行操作系统迁移

Geek_2d6073

butterfly美化日记(一)

程序员余白

Hexo butterfly 博客配置 11月月更

文档管理系统平台:实现文档管理现代化

Baklib

让开发者成为决定性力量,华为开发者英雄汇圆满落幕

华为云开发者联盟

云计算 华为云 企业号十月 PK 榜

Prometheus Native Histograms 实现原理及应用

Grafana 爱好者

云原生 可观测性 Prometheus 11月月更

Karmada大规模测试报告发布:突破100倍集群规模

华为云开发者联盟

云计算 云原生 华为云 企业号十月 PK 榜

Hexo+Github搭建个人博客教程(二)

程序员余白

Hexo 博客搭建 11月月更

MSE 结合 Dragonwell,让 Java Agent 更好用

阿里巴巴云原生

阿里云 微服务 云原生

云原生时代数据库技术趋势与场景选型

OceanBase 数据库

腾讯蓝鲸 API 网关如何借助 APISIX 实现产品升级与业务完善

Apache APISIX 中文社区

云原生 API网关 APISIX 客户案例

手动在CentOS7.4环境下,安装MySQL5.7.X版本的方法。

@下一站

MySQL 程序猿 11月月更

管控内部威胁,数据如何安全使用?

极盾科技

数据安全

月日均AUM提升40倍!看这家银行如何做好网金客群分层经营?

索信达控股

科技 客户分群 网金客群

如何解决产品知识培训问题?

Baklib

HMS Core的AI之力与开发者的英雄本色

脑极体

为什么要做数据分析

穿过生命散发芬芳

数据分析 11月月更

网易云信 toB 质量保障体系实践

网易云信

质量保障 PaaS平台

什么是入侵检测系统?有哪些分类?

wljslmz

网络安全 11月月更 入侵检测 IDS

利刃出鞘 | 从五大核心技术来看Bonree ONE 2.0的全球竞争力

博睿数据

可观测性 核心技术 智能运维 博睿数据 ONE平台

体验不尽,进化不止,看视频云技术六大创新

阿里云视频云

阿里云 视频云 云栖大会 2022云栖大会

尤雨溪向 React 推荐自己研发的 Vite,网友:用第三方工具没有任何意义_前端_褚杏娟_InfoQ精选文章