为什么所有前端框架都要和React做比较

198 阅读4分钟

React很明显是现在最流行的前端UI库,但是还有许多前端UI库或者框架都要比React要好,他们不约而同的都很喜欢与React做比较,似乎只要比React更快更省内存就比它厉害,然而事实上真的是如此吗?

闪电的速度-虚拟DOM

现在很多UI框架都强调自己的更新速度要比React更快,有的甚至扬言通过放弃使用VDOM从而获得更快的更新速度。

没错,使用VDOM在性能和速度上的确是有所损耗,如果只是一些简单的DOM操作的话,使用VDOM明显有点画蛇添足的嫌疑。然而要知道的是,之所以React能够一直笑傲前端圈,VDOM功不可没,遥想当年当我第一次看到angualr与react结合写的一个Demo后,简直要惊呆了。在没有使用React的情况下,Angualr更新一个日历组件需要耗时5秒左右,而使用了React之后,时间仅仅只用了0.2秒便更新完成,其中的奥秘就是VDOM的使用。

VDOM的目标场景是大量DOM的更新操作,至少也要100个DOM数量起步才能看到它的效果,而如果数量不多的话,依靠BOMAPI其实就能达到性能优化操作了。比如documentFragment就可以实现后台更新DOM然后一次性更换节点数据,作用其实和VDOM差不多。

但是VDOM的出现让React实现了脱离运行环境的束缚,因为是内存中管理节点数据,因此React实际上可以被移植到任何运行时上运行,不仅仅是浏览器,甚至连单片机都能跑React,就这一点来说,其他的UI框架就不能比拟了。

不得不妥协的Hooks

然后说一下React 18中的大变化--hooks,这个特性看起来好像是一次大革新,其实是对函数式编程的无奈妥协。

React自己有一套完整且独立的状态更新机制,虽然已经被大家批判的体无完肤,因为要从头开始的比较导致性能的浪费,没有静态化机制导致无效的比较操作等等。没错正是这套机制导致了React的数据比较是比较繁琐的,本来使用class方式编写的时候可以使用特定的属性实现生命周期的事件调取操作,但是变成函数式之后,特别是箭头函数声明的时候,就没有办法通过调取对象属性的方式来实现生命周期的管理。

为了解决这个问题,React团队就想出来用hook来解决,在批处理的过程中,对钩子函数进行调用,效果其实和class声明差不多的,如此一来就解决了声明周期管理的问题。

而其他的UI框架看到这个hook以为是什么新玩意,就加入到了自己的工具链中,其实这套处理机制只对React有用,因为它是自己管理了一套完整且独立的状态更新系统,完全不依赖任何运行时环境。

独立且完整的UI框架

React正是通过VDOM和完全独立的状态更新管理实现了独立于运行时环境的UI框架,它不仅仅能用于Web环境开发,也能用于Native环境使用,甚至在单片机中都能独立运行使用。而其他的UI框架多多少少都要依赖于所运行的环境,比如VUE3就非常依赖Porxy的使用,如果运行时环境不支持的话就没有办法实现响应式处理,类似的其他框架实际上也非常的依赖运行时环境。

React通过牺牲一点性能实现了任何运行环境的独立运行,就这点其他的UI框架就无法与其相比了,而这些框架总是把运行时的优点说成是自己的优势,从而把React置于落后的地位,这样的比较方式是不是有些不公平呢?