当前位置: 首页 > 科技观察

VuevsReact:Javascript框架之战

时间:2023-03-12 22:26:14 科技观察

正如我们之前提到的,WordPress核心团队正在争论应该将哪一个添加到当前架构中。目前看来React和Vue.js暂时脱颖而出,很多社区成员都在权衡这两个框架的优劣。那么哪个框架会胜出,哪个框架会成为过去的prototype.js呢?让我们来看看。我写过两个几乎一模一样的web应用,一个基于Vue,一个基于React,方便大家阅读本文时查找相关代码。Reactsampleapp(https://github.com/ptasker/pasta-pete-react)Vuesampleapp(https://github.com/ptasker/pasta-pete-vue)简介除非你一直关注最近在开发前端,不然你一定听说过Facebook创建的JavaScriptUI框架React。它支持大多数Facebook网站,包括Instagram。React不同于当时流行的jQuery、Backbone.js、Angular1等框架。它的诞生改变了JavaScript的世界。其中一个最大的变化是React推广了VirtualDOM(我们稍后会探讨)并创建了一种新的语法——JSX,它允许开发人员在JavaScript中编写HTML(译者注:HTMLinJavaScript)。WAT?Vue致力于解决与React相同的问题,但它提供了另一套解决方案。Vue使用模板系统而不是JSX,可以更轻松地升级现有应用程序。这是因为模板使用普通的HTML。通过Vue集成现有系统相对容易,不需要整体重构。同时Vue声称它更容易学习,我最近刚接触Vue并且可以证明这一点。关于Vue需要说的是,Vue主要由单个开发人员维护,而不是像React那样由Facebook这样的大公司维护。相似之处React和Vue之间有很多相似之处。例如,它们都是专注于创建富前端应用程序的JavaScriptUI框架。与“功能齐全”的早期JavaScript框架不同,Reat和Vue只有框架的骨架,路由、状态管理等其他功能都是框架的独立组件。VirtualDOM啊哈,人们常说什么是VirtualDOM?Vue.js(2.0版)和React之间的最后一个相似之处是它们都使用一种叫做“虚拟DOM”的东西。所谓VirtualDOM,基本上就是它的名字的意思:虚拟DOM,DOM树的虚拟表示。它的诞生基于这样一个概念,即改变实际的DOM状态比改变JavaScript对象要昂贵得多。虚拟DOM是映射真实DOM的JavaScript对象。如果你需要改变任何元素的状态,你必须先在虚拟DOM上改变它,而不是直接改变真实的DOM。当发生变化时,会创建一个新的虚拟DOM对象,并计算新旧虚拟DOM之间的差异。然后将这些差异应用于真实的DOM。例子如下,我们可以看到下面列表的代码是如何用HTML写的:

  • item1
  • item2
  • 而在JavaScript,我们可以简单地使用对象为上面的示例创建一个映射:{type:'ul',props:{'class':'list'},children:[{type:'li',props:{},children:['item1']},{type:'li',props:{},children:['item2']}]}真正的VirtualDOM会比上面的例子复杂一些,但本质上是一个内嵌的A环绕数组的本机对象。当一个新项目被添加到这个JavaScript对象时,一个函数会计算新旧虚拟DOM之间的差异,并将其反映在真实的DOM上。计算差异的算法是高性能框架的秘诀,React和Vue的实现略有不同。Vue声称它可以更快地计算出VirtualDOM的差异,因为它会在渲染过程中跟踪每个组件的依赖关系,而无需重新渲染整个组件树。对于React,每次应用程序的状态发生变化时,所有的子组件都会被重新渲染。当然,这可以通过shouldComponentUpdate生命周期方法来控制,但Vue将此视为默认优化。总结:如果您的应用程序具有复杂的交互并且需要处理大量的UI更改,那么使用VirtualDOM是个好主意。如果不经常更新元素,那么VirtualDOM不一定适用,性能可能不如直接操作DOM。组件化React和Vue都鼓励组件化应用程序。从本质上讲,建议您将应用程序拆分为功能明确的模块,并且每个模块之间可以以合适的方式进行通信。组件化的示例可以在本文中间找到:您可以将组件视为用户界面的小块。如果我要设计Facebook的UI,聊天窗口将是一个组件,评论将是另一个组件,而不断更新的好友列表将是一个组件。在Vue中,如果遵循一定的规则,就可以使用单文件组件。//PastaItem.vue尽你所能参见上面的示例,HTML、JavaScript和CSS都写在一个文件中。您不再需要在.vue组件文件中导入CSS,尽管这仍然是可能的。React也很相似,JavaScript和JSX写在同一个组件文件中。importReactfrom"react";classPastaItemextendsReact.Component{render(){const{details,index}=this.props;返回(

    {details.name}

    h3>

    {details.desc}

    this.props.addToOrder(index)}className="btnbtn-primary">Addtoorder{this.props.orders||0}
    );}}exportdefaultPastaItem;Props在上面两个例子中,我们可以看到React和Vue都有'props的概念',这是属性的简写。props是组件中的一个特殊属性,它允许父组件向子组件传递数据。Object.keys(this.state.pastadishes).map(key=>)在上面的JSX库组中,index、key、details、orders、addToOrder都是props,数据会下载到子组件PastaItem中。这在React中是必需的,它的“状态”依赖于“单一事实来源”(稍后会详细介绍)。在Vue中,道具略有不同。它们也是在组件中定义的,但是Vue依赖于模板语法,你可以通过模板的循环功能更高效地展示传入的数据。这是实现template,但是这段代码可以完美运行,但是在React中显示相同的数据有点麻烦。构建工具React和Vue都有自己的构建工具,您可以使用它们快速设置开发环境。React可以使用CreateReactApp(CRA),而Vue对应的是vue-cli。这两种工具都允许您根据最佳实践获得项目模板集。由于CRA有很多选项,使用起来可能有点麻烦。这个工具会强制你使用Webpack和Babel。另一方面,vue-cli有一个模板列表可供选择,可以按需创建不同的模板,使用起来更加灵活。其实这两个工具都非常好用,都可以给你搭建一个很好的环境。如果你可以不配置Webpack,Jeff和我认为这是一件很棒的事情。Chrome开发工具React和Vue都有很棒的Chrome扩展来帮助你发现错误。他们检查您的应用程序并让您查看Vue或React中的更改。您还可以在应用程序中查看状态并实时查看更新。React开发工具:https://cdn.deliciousbrains.com/content/uploads/2017/06/15151112/react-devtools.mp4Vue开发工具:https://cdn.deliciousbrains.com/content/uploads/2017/06/15151111/vue-devtools.mp4配套框架Vue与React类似,但它们处理框架的方式略有不同。相同的是,这两个框架都专注于UI层,路由和状态管理等其他功能由配套框架处理。不同之处在于它们与各自的配套框架的关系。Vue的核心团队维护着vue-router和vuex,它们都作为官方推荐存在。React的react-router和react-redux是由社区成员维护的,并不是官方维护的。主要区别Vue和React有很多相似之处,但也有完全不一致的地方。TemplatesvsJSXReact和Vue最大的区别就是模板的写法。Vue鼓励您编写近似于常规HTML的模板。它的编写非常接近标准HTML元素,但具有更多属性。这些属性也可以是用于单文件组件,但它需要在构建时将组件转换为有效的JavaScript和HTML。Vue鼓励您使用HTML模板进行渲染,使用类似Angular的方法来输出动态内容。因此,Vue可以通过将原有模板集成到新的Vue模板中,轻松地为旧应用程序提供升级。它还使新手很容易适应它的语法。另一方面,React建议所有模板都用JSX编写,这是一种常见的JavaScript语法扩展。同样的代码,用JSX编写,如下所示:={this.state.pastadishes[key]}addToOrder={this.addToOrder}orders={this.state.orders[key]}/>)}React/JSX乍一看非常冗长,但是使用JavaScript代替模板来开发,给了开发者很多编程能力。但请记住:能力越大,责任越大。BenParkerJSX只是混合了XML语法的JavaScript,但是一旦掌握了它,使用起来就会很愉快。这可能只是我个人的看法,但我认为它比Angular1的样式属性要好得多,而且Angular1真的无法忍受。相反的论点是Vue的模板语法消除了向视图/组件添加逻辑的诱惑,保持了关注点的分离。值得一提的是,与React一样,Vue在技术上支持渲染函数和JSX,但它不是默认的。状态管理与对象属性如果您熟悉React,就会知道应用程序中的状态是一个关键(React)概念。还有一些配套框架旨在管理大型状态对象,例如Redux。此外,React应用程序中的状态对象是不可变的,这意味着它不能直接更改(这不一定是真的)。在React中,您需要使用setState()方法来更新状态。addToOrder(key){//Makeacopyofthis.stateconstorders={...this.state.orders};//updateoraddorders[key]=orders[key]+1||1;this.setState({orders});}中在Vue中,state对象不是必须的,数据在Vue对象中通过data属性进行管理。exportdefault{name:'app',data(){return{samplePasta:samplePasta,orders:{}}},...方法:{handleOrder:function(key){if(!this.orders.hasOwnProperty(key)){this.$set(this.orders,key,{count:0});}this.orders[key].count+=1;}}}在Vue中,你不需要使用类似setState()的方法改变它的状态,在Vue对象中,data参数是应用程序中数据的保存器。关于在大型应用中管理状态的话题,Vue.js的作者尤玉玺曾说过,(Vue的)解决方案适用于小型应用,但不适用于大型应用。在大多数情况下,框架内置的状态管理不足以支持大规模应用,必须使用Redux或Vuex等状态管理解决方案。考虑到这一点,争论如何在您的应用程序中管理状态可能是不成熟的优化,并且它可能只是个人偏好的问题。此外,您可能真的不需要担心这方面的问题。ReactNative与?ReactNative能够在移动设备上创建原生应用程序,而React处于领先地位。使用JavaScript、CSS和HTML创建本机移动应用程序是一项重要的创新。Vue社区和阿里合作开发了Vue版本的ReactNative——Weex也很不错,但是还在开发中,还没有经过实际项目的验证。那么,谁赢得了这场比赛?TLDR;JavaScript已死,一起用TypeScript如果你想在职场上拥有闪耀的JavaScriptUI框架体验,React和Vue都是不错的选择。React似乎更受欢迎,但Vue也越来越广为人知。如果你想将现有应用程序升级到新的JavaScript框架,那么我建议你选择Vue。事实上,当您想要创建现代JavaScript应用程序时,两者都是不错的选择,具体取决于您的喜好。您对React或Vue有何看法?让我们在评论中知道!