React 与 Vue 框架的设计思路大 PK

大家好,我是若川。今天分享一篇框架设计思路的好文。


关于我

大家好我是花果山的大圣,今天很荣幸,有机会跟大家分享一下很多年轻人感兴趣的话题《 Vue 和 React 设计思想 PK》,个人水平有限,如果有理解不到位的请倾盆,大家看完后并且再去 Vue 和 React 源码里探索一番,一定会有所收获, 如果没时间的话,还可以跟我一起早起学习

  1. Github

  2. B站

  3. 掘金

框架总览

前端框架繁多,在学习的时候也会陷入困惑,我们应该抓住最主流的内容 Vue/React,深入底层,尝试揣摩框架作者的设计思路,开阔自己的视野,大家也不要把自己限制在框架之中,认为工作中用到 Vue,就觉得 React 学起来没用,有些时候我们学习竞品的框架,是为了更好的认识自己在用的框架,废话不多说,由于 Vue 本身是个中庸的框架,再揪出设计思路理念比较极致的 Angular 和 Svelte,我们先从视图层最火的四大框架看一下

下载量

对比维度

我们从多个维度去对比前端的框架,就能看清楚现在各个框架的现状,我们学习每个框架的设计范式,并且尝试打破局限,就像猪八戒一样,出了高老庄,一路好风光

框架发展

字符串模板

想看清现在视图层的现状,要简单的看下之前框架的发展路线,JQuery 时代的渲染层,大部分都是基于字符串的模板,典型的框架就是 Underscore,baiduTemplate。大致的原理就是把 template 解析成一个函数,缺点也很明显,就是每次数据变化,模板内部要全部重新渲染

然后刚才我说的四个框架占领了现在的 Web 领域,核心的目标都是一样的,为了做出性能更好的 Web 应用,为此各路大神八仙过海,各显神通有这么几个宏观的维度

原生 VS 抽象

原生的就是 JavaScript 本身,比如 JQuery 基本没有太多的抽象,一个 $ 打天下,React 抽象程度稍微复杂一些,需要理解 Component, State, Hooks, JSX 等概念就可以上手了,抽象比较多的就是 Angular,上手就需要了解十几个概念,学习曲线很陡峭, Vue 就处在 React 和 Angular 中间,了解完 data,methods,单文件组建后就可以上手了

运行时 VS 预编译

另外一个维度就是运行时和预编译这个维度,所谓运行时,在浏览器内存里进行的任务,React 的 Runtime 比较重一些,数据发生变化后,并没有直接去操作 dom,而是生成一个新的虚拟 dom,并且通过 diff 算法得出最小的操作行为,全部都是在运行时来做的

这个维度的另外一个极端,也就是重编译的框架,在上线之前经过通过工程化的方式做了预处理,典型代表就是Svelte,基本上是一个 Compiler Framework,写的是模板和数据,经过处理后,基本解析成了原生的 dom 操作,Svelte 的性能也是最接近原生 js 的

Vue 依然处于比较中庸的地位,在运行时和预编译取了一个很好地权衡,保留了虚拟 dom,通过响应式控制虚拟 dom 的颗粒度,在预编译里又做了足够多的性能优化,做到了按需更新,这个一会再细聊

框架设计的维度

Vue 和 React

然后我们揪出来 Vue 和 React,有一些更细化维度

可变数据 VS 不可变数据

Vue1 就是把响应式数据玩出了花,通过拦截操作,修改一个数据的同时收集依赖,然后数据修改的时候去通知更新 dom,体验很是舒爽,我们修改了一个 JavaScript 的对象,视图层就修改好了, 这是 Vue 的黑魔法,React 的虚拟 Dom 创建之日期,就是通过计算新老数据的 diff,去决定操作那些 dom,所以每次修改数据,需要生成一份新的数据,说不上优劣之分,只不过路线不同

这大概就是 Vue 和 React 修改数据的代码对比

权衡

随着应用越来越复杂,React15 架构中,dom diff 的时间超过 16.6ms,就可能会让页面卡顿,Vue1 中的监听器过多,也会让性能雪崩,为了解决这个问题,Vue 选择了权衡,以组件作为颗粒度,组件层面用响应式通知,组件内部通过 dom diff 计算 ,既控制了应用内部 Watcher 的数量,也控制了 dom diff 的量级。看到这段实现的时候,不仅高呼,真是妙啊

  registerComponentHook(componentId, 'lifecycle', 'attach', () => {callHook(vm, 'beforeMount')const updateComponent = () => {vm._update(vm._vnode, false)}new Watcher(vm, updateComponent, noop, null, true)vm._isMounted = truecallHook(vm, 'mounted')})

预编译和运行时

相关概念刚才已经科普了,在 Vue 和 React 中的体现,主要体现在 JSX 和 template 的区别上,React 是完全的 JSX,可以 JSX 在里面写 JavaScipt,所以特点就是足够的动态,与之对应的就是 Vue 的 template,template 的特点是语法受限,可以执行的语法技术 v-if v-for 等指定的语法,虽然不够动态,但是由于语法是可便利的,所以可以再预编译层面做更多的预判,让 Vue 在运行时有更好的性能

顺便放两张尤大的 ppt 的图,Vue3 通过在预编译阶阶段做静态标记的优化,做到了按需更新

  1. 纯静态的元素标记,直接越过 diff 阶段  比如 <p>hello</p>

  2. 静态的属性也会标记,在 diff 的时候越过这个属性的判断

  3. 事件函数传递的时候回加上缓存

  4. v-ifv-for 内部通过 block+ 数组的方式维护动态元素

时间切片

Vue3 通过静态标记 + 响应式 + 虚拟 dom 的方式,控制了 diff 的颗粒度,让 diff 的时间不会超过 16ms,但是 React 自上而下的 diff 过程,项目大了之后,一旦 diff 的时间超过 16.6ms,就会造成卡顿,对此 React 交出的解决方案就是时间切片

简单的来说就是把 diff 的任务按照元素拆开,利用浏览器的空闲时间去算 diff,React 把各种优化的策略都留给了开发者,Vue 则是帮开发者做了很多优化的工作

设计思想演进

组合优于集成

这个思想设计模式里面就有定论,也是现在 hooks 和 composition 大行其道的原因,代码写出来也会更加易于维护,这个图可以很好地体现出可维护性上的变化

跨端

刚才我们讲了 Svelte 可以做到直接编译成 JavaScript,性能接近原生,这么优秀的思想,为什么 Vue 还要保留虚拟 dom 这个额外的 runtime 损耗呢,我觉得比较重要的一个答案就是跨端

虚拟 dom 除了可以用来计算最小的 diff 之外,另外一个重要的功能就是可以用 JavaScript 的对象来去描述一个 dom,这就是一个普通的对象,在跨端领域意义重大,视图层返回的是一个对象,渲染层可以调用不同平台的渲染 api 去绘制即可

复习

如上所述,请认真学习框架,并不只是为了面试,而是框架里的优秀思想和设计模式,汇集了顶尖开发者团队最优秀的思想, 多学习别人优秀的代码,开阔自己的视野, 闭门造车你会发现,很多自己的顿悟只是别人的基础

推荐书

最后推荐一本对我涨薪帮助最大的书《算法》第四版

算法和数据结构一直都是前端工程师进阶的拦路虎之一,这块内容比较成体系,JavaScript 相关的算法书过于简单,只能入门,不能帮你学会算法, 教材《算法导论》从数学的角度去推导算法,又太难,所以我推荐这本《算法》第四版,内容详实有插画,帮助系统的构架算法知识体系,书里用的是 Java,学习的时候正好用 JavaScript 实现一遍书里的例子,学完绝对是一个新的段位

当然,我最大的爱好除了王者,就是看书了,其实有很多书可以推荐,比如

  1. JavaScript 进阶的红黄绿三套书

  2. 怎么和 HR 谈钱的《谈判是什么》和《优势谈判》

  3. 和产品经理吹牛逼必备坛子 《浪潮之巅》《硅谷之谜》

  4. 《软技能2》

  5. 。。。。

以后有机会再给大家推荐,感谢大家的支持 ,我是大圣, 下期再见


常驻推荐阅读

若川知乎高赞:有哪些必看的 JS库?
我在阿里招前端,我该怎么帮你?(现在还可以加模拟面试群)
如何拿下阿里巴巴 P6 的前端 Offer
如何准备阿里P6/P7前端面试--项目经历准备篇
大厂面试官常问的亮点,该如何做出?
如何从初级到专家(P4-P7)打破成长瓶颈和有效突破
若川知乎问答:2年前端经验,做的项目没什么技术含量,怎么办?

常驻末尾

你好,我是若川,江西人~(点击蓝字了解我)历时一年只写了一个学习源码整体架构系列 有哪些必看的JS库:jQuery、underscore、lodash、sentry、vuex、axios、koa、redux

  1. 关注若川视野,回复"pdf" 领取优质前端书籍pdf,回复"1",可加群长期交流学习

  2. 我的博客地址:https://lxchuan12.gitee.io 欢迎收藏

  3. 觉得文章不错,可以 分享、点赞、在看 呀^_^另外欢迎留言交流~

小提醒:若川视野公众号面试、源码等文章合集在菜单栏中间【源码精选】按钮,欢迎点击阅读,也可以星标我的公众号,便于查找

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php foreach id是否存在数组_请纠正这 5 个 PHP 编码小陋习

在做过大量的代码审查后&#xff0c;我经常看到一些重复的错误&#xff0c;以下是纠正这些错误的方法。在循环之前测试数组是否为空$items [];// ...if (count($items) > 0) {foreach ($items as $item) {// process on $item ...}}foreach以及数组函数 (array_*) 可以处理…

1161转进制(C语言)

一&#xff1a;题目 二&#xff1a;思路分析 1.首先该题目让我们使用递归求十进制转其他进制 2.其次&#xff0c;我们要知道十进制转换为其他进制怎么转换&#xff0c;以例题所给的数据为例 由此图可以看出&#xff0c;十进制转换为其他进制&#xff0c;是辗转相除法&#xf…

PHP异常处理

转载链接&#xff1a;http://www.blogdaren.com/post-2030.html 版权声明&#xff1a;除非注明&#xff0c;本文由( manon )原创&#xff0c;转载请保留文章出处 本文链接&#xff1a;PHP register_shutdown_function函数详解 脚本时常死掉,而且并不总是那么好看. 我们可不想…

应对无协议脱欧 葡萄牙机场将为英籍旅客设快速通道

中新网1月18日电 据台湾《联合报》援引英媒报道&#xff0c;英国首相特蕾莎•梅的脱欧协议遭下院否决后&#xff0c;英国无协议脱欧的可能性变大。葡萄牙总理科斯塔17日表示&#xff0c;里斯本当局正对机场开设特殊通道进行规划&#xff0c;使英国旅客无论英国最后如何脱欧&…

javascript 日期控件

http://www.my97.net/dp/index.asp转载于:https://www.cnblogs.com/Ken-Cai/archive/2010/04/08/1707080.html

6轮字节前端校招面试经验分享

大家好&#xff0c;我是若川。最近金三银四&#xff0c;今天分享一篇字节前端校招面试经验的轻松好文&#xff0c;相信看完会有所收获。也欢迎点击下方卡片关注或者星标我的公众号若川视野因为我错过了2020年的秋招&#xff08;ps: 那时候连数据结构与算法都还没学完&#xff0…

redis存opc_Redis集群的三种模式

一、主从模式通过持久化功能&#xff0c;Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据&#xff0c;因为持久化会把内存中数据保存到硬盘上&#xff0c;重启会从硬盘上加载数据。但是由于数据是存储在一台服务器上的&#xff0c;如果这台服务器出现硬盘故障等…

斥资近1亿港元,小米二次回购

1月21日消息&#xff0c;小米集团发布公告称&#xff0c;公司于1月18日回购了984.96万股B类普通股股票&#xff0c;占已发行股份0.041%&#xff0c;平均价为每股B类股10.1527港元&#xff0c;总计斥资近1亿港元。 这也是继1月17日首次回购后&#xff0c;小米集团连续两日出手进…

MySQL日期数据类型、时间类型使用总结

转载链接&#xff1a;http://www.jb51.net/article/23966.htm MySQL 日期类型&#xff1a;日期格式、所占存储空间、日期范围 比较。 日期类型 存储空间 日期格式 日期范围 ------------ --------- --------------------- -------------------------------…

ios macos_设计师可以从iOS 14和macOS Big Sur中学到什么?

ios macos重点 (Top highlight)With the introduction of iOS 14 and macOS Big Sur, we are the witness of the next big thing in UI Design. Changes are not so revolutionary like in iOS 7 years before, but they undoubtedly present the trend UI Designers will fol…

Web开发性能优化总结 转载

1. 使用存储过程&#xff0c; &#xff08;如果在程序里用exec 存储过程 参数&#xff0c;这样执行似乎并没有快多少&#xff09; 在数据库里是预编译的&#xff0c;也不需要在字符串传输上花费大量时间。 防sql注入攻击。 2. 尽量优化数据库语句&#xff0c;使逻辑尽量…

金三银四的腾讯、阿里、​字节等大厂前端社招面经

大家好&#xff0c;我是若川。最近金三银四&#xff0c;今天分享一篇腾讯、阿里、字节等大厂的前端社招面试经验的好文&#xff0c;相信看完会有所收获。也欢迎点击下方卡片关注或者星标我的公众号若川视野作者面了将近一个月&#xff0c;目前还没挂过&#xff0c;但由于各种因…

JS中创建函数的几种方式

使用 "函数声明" 创建函数 语法&#xff1a;* function 函数名([形参1,形参2...形参N]){* 语句...* } */function fun2(){console.log("这是我的第二个函数~~~");alert("哈哈哈哈哈");document.write("~~~~…

ssm提交post_我用spring mvc做,用post方式提交,后台获取不到参数值,用get方式就可以,什么问题...

展开全部因为form表单e68a843231313335323631343130323136353331333365646330的enctype编码方式不同导致的&#xff1b;enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。默认地&#xff0c;表单数据会编码为 "application/x-www-form-urlencoded"。就…

网页设计简约_简约网页设计的主要功能

网页设计简约重点 (Top highlight)Minimalism is synonymous with simplicity. Not quite. As the name suggests, minimalism is definitely not about opulent design. But the assumption that minimalism is design-less and plain is also wrong. Minimalism is simple ye…

MySQL_数据库数据类型(data type)介绍

转载链接&#xff1a;http://www.360sdn.com/mysql/2013/0511/78.html MySQL_数据库数据类型(data type)介绍 mysql数据库的数据类型(data type)分以下几种:数值类型,字符串类型 一、数值类型 MySQL 的数值类型可以大致划分为两个类别&#xff0c;一个是整数&#xff0c;另一…

Expo 2010 Japan Pavilion

^_^转载于:https://www.cnblogs.com/mmmhhhlll/archive/2010/04/16/1713680.html

深度对比学习Vue和React两大框架

作为国内应用最广的两个框架&#xff0c;Vue 和 React 是前端必须掌握的内容&#xff0c;也是面试的重点。但大多数读者都只擅长其中一个框架&#xff0c;当面试涉及到另一个框架的内容时&#xff0c;就答不好了。比如虚拟dom&#xff0c;两个框架中都有应用&#xff0c;面试官…

PHP Token(令牌)设计

转载链接&#xff1a;http://www.jb51.net/article/13756.htm PHP Token(令牌)设计 设计目标: 避免重复提交数据. 检查来路,是否是外部提交 匹配要执行的动作(如果有多个逻辑在同一个页面实现,比如新增,删除,修改放到一个PHP文件里操作) 这里所说的token是在页面显示的时候,写到…

java rwd_面向任务的设计-不仅限于Mobile First和RWD

java rwdWe already know that majority of solutions should start with a design for smartphones, we know that all websites should be responsive. Now, it’s time to think about holistic solutions with specific tasks adapted to all kind of devices.我们已经知道…