回复:“ JS框架比较:React,Vue和Hyperapp”

这是对出版物“ JS框架的比较:React,Vue和Hyperapp”的简短回应 。 总的来说,我不是这种比较的忠实拥护者。 但是,由于我们在谈论像Hyperapp这样的边际框架,所以与React和Vue这样的按钮相比,我想,为什么不考虑Svelte上的所有相同示例。 可以这么说,完成图片。 而且,这实际上需要5分钟。 走吧

图片

如果突然之间您不熟悉Svelte和消失的框架的概念,则可以阅读文章“ Magical Disappearing JS Framework”“ Disappearing Frames”

为了方便读者,我在扰流板下复制了原始文章中的示例,以使比较起来更加方便。 好吧,让我们开始吧。

例1:柜台申请


反应
import React from "react"; import ReactDOM from "react-dom"; class Counter extends React.Component { constructor(props) { super(props); this.state = { count: 0}; } down(value) { this.setState(state => ({ count: state.count - value })); } up(value) { this.setState(state => ({ count: state.count + value })); } render() { return ( <div> <h1>{this.state.count}</h1> <button onClick = {() => this.down(1)}>-</button> <button onClick = {() => this.up(1)}>+</button> </div> ); } } ReactDOM.render(<Counter />, document.querySelector("#app")); 


Vue
 import Vue from "vue"; new Vue({ data: { count: 0 }, methods: { down: function(value) { this.count -= value; }, up: function(value) { this.count += value; } }, render: function(h) { return( <div> <h1>{this.count}</h1> <button onClick={() => this.down(1)}>-</button> <button onClick={() => this.up(1)}>+</button> </div> ); }, el: "#app" }); 


超级应用程式
 import { h, app } from "hyperapp"; const state = { count: 0 }; const actions = { down: value => state => ({ count: state.count - value}), up: value => state => ({ count: state.count + value}) }; const view = (state, actions) => ( <div> <h1>{state.count}</h1> <button onclick={() => actions.down(1)}>-</button> <button onclick={() => actions.up(1)}>+</button> </div> ); app(state, actions, view, document.querySelector("#app")); 


vel苗条


 <div> <h1>{count}</h1> <button on:click="set({count: count - 1})">-</button> <button on:click="set({count: count + 1})">+</button> </div> 

→一个工作示例。

▍分析


Svelte组件是html文件,具有臭名昭著的Single File Component(SFC)格式(一种或另一种格式),已在VueRactiveRiot和其他框架中使用。 除了html模板本身之外,组件还可以具有javascript中描述的行为和逻辑,以及该组件的范围样式。

不需要组件的任何部分,因此计数器的组件只能由计数器本身的html模板组成。 要更改count变量的值,单击处理程序将使用文档中介绍的set()组件的内置方法。

示例2:使用异步代码


反应
 import React from "react"; import ReactDOM from "react-dom"; class PostViewer extends React.Component { constructor(props) { super(props); this.state = { posts: [] }; } getData() { fetch(`https://jsonplaceholder.typicode.com/posts`) .then(response => response.json()) .then(json => { this.setState(state => ({ posts: json})); }); } render() { return ( <div> <button onClick={() => this.getData()}>Get posts</button> {this.state.posts.map(post => ( <div key={post.id}> <h2><font color="#3AC1EF">{post.title}</font></h2> <p>{post.body}</p> </div> ))} </div> ); } } ReactDOM.render(<PostViewer />, document.querySelector("#app")); 


Vue
 import Vue from "vue"; new Vue({ data: { posts: [] }, methods: { getData: function(value) { fetch(`https://jsonplaceholder.typicode.com/posts`) .then(response => response.json()) .then(json => { this.posts = json; }); } }, render: function(h) { return ( <div> <button onClick={() => this.getData()}>Get posts</button> {this.posts.map(post => ( <div key={post.id}> <h2><font color="#3AC1EF">{post.title}</font></h2> <p>{post.body}</p> </div> ))} </div> ); }, el: "#app" }); 


超级应用程式
 import { h, app } from "hyperapp"; const state = { posts: [] }; const actions = { getData: () => (state, actions) => { fetch(`https://jsonplaceholder.typicode.com/posts`) .then(response => response.json()) .then(json => { actions.getDataComplete(json); }); }, getDataComplete: data => state => ({ posts: data }) }; const view = (state, actions) => ( <div> <button onclick={() => actions.getData()}>Get posts</button> {state.posts.map(post => ( <div key={post.id}> <h2><font color="#3AC1EF">{post.title}</font></h2> <p>{post.body}</p> </div> ))} </div> ); app(state, actions, view, document.querySelector("#app")); 


vel苗条


 <div> <button on:click="getData()">Get posts</button> {#each posts as {title, body}} <div> <h2><font color="#3AC1EF">{title}</font></h2> <p>{body}</p> </div> {/each} </div> <script> export default { methods: { getData() { fetch('https://jsonplaceholder.typicode.com/posts') .then(res => res.json()) .then(posts => this.set({ posts })); } } }; </script> 

→一个工作示例。

▍分析


JSX不像JSX,它像原始副本一样,在所有3个框架中都使用,实际上是用类似html的语法扩展了javascript代码,而Svelte使用了更熟悉的功能-使用<<将js和css代码嵌入html中script><style>

组件脚本导出一个简单的JS对象,该对象分为几部分。 方法部分描述了可通过组件实例和事件处理程序使用的组件方法。 因此,当您单击按钮时,将调用getData()方法,在其中请求数据,并且在操作完成后,将数据简单地安装在组件状态并立即绘制在模板中。

请注意在发布列表迭代的每个步骤中,使用解构发布对象(发布):

 {#each posts as {title, body}} 

此技巧可避免模板{post.title}中的冗余,并使用较短的条目{title}直观地简化模板。

示例3:待办事项应用程序的列表项组件


React(功能样式)
 function TodoItem(props) { return ( <li class={props.done ? "done" : ""} onclick={() => props.toggle(props.id)}> {props.value} </li> ); } 


反应
 class TodoItem extends React.Component { render () { return ( <li class={this.props.done ? "done" : ""} onclick={() => this.props.toggle(this.props.id)}> {this.props.value} </li> ); } } 


Vue
 var TodoItem = Vue.component("todoitem", { props: ["id", "value", "done", "toggle"], template: '<li v-bind:class="{done : done}" v-on:click="toggle(id)">{{value}}</li>' }); 


超级应用程式
 const TodoItem = ({ id, value, done, toggle }) = ( <li class={done ? "done" : ""} onclick={() => toggle(id)}> {value} </li> ); 


vel苗条


 <li class="{done ? 'done' : ''}" on:click="set({done: !done})">{value}</li> 

→一个工作示例。

▍分析


这里的一切都很平淡。 我们根据完成值公开css类,并在单击列表项时将此值更改为相反的值。

组件生命周期方法的比较


免责声明 :从现在开始,我决定省略与Hyperapp的比较,因为否则表将根本无法读取。

大事记
反应
Vue
斯维尔特
初始化
建设者
beforeCreate,
被创造
安装方式
componentDidMount
beforeMount,已安装
oncreate,onupdate
更新资料
componentDidUpdate
beforeUpdate,已更新
onstate,onupdate
正在卸载
componentWillUnmount
--毁灭
毁灭
--销毁前,销毁
--

▍分析


Svelte非常简约,包括生命周期挂钩。 只有4个钩子:

  • onstate-在创建组件之前调用,在DOM更新之前更改每个状态。
  • oncreate-创建组件的时刻。
  • onupdate-在装入DOM后立即调用,并且在更新DOM后每个状态都会更改。
  • ondestroy-在销毁组件并将其从DOM中删除时调用。


框架性能比较


老实说,我不知道该发表什么评论。 基准本身及其执行方式始终会引起很多争议,因此我认为不必要地集中注意力是没有道理的。
但是,我们仍然没有其他数据。

tables使用表格




▍加载,启动,代码大小




memory处理内存




▍分析


从数字来看, Svelte相当快,“吃”很少的内存(包括因为它不使用VirtualDOM),因此启动速度很快,而且体积很小。

总的来说,我不能说这三个框架的基准测试结果差异很大。 但是,只有Svelte拥有专门的“绿色”列,即 它在各个方面都非常好,这意味着它是完美平衡的,并且在速度,内存消耗或其他指标上都没有明显的失真。 通常,有了它,您就可以安全地启动任何项目,从普通的Web到移动设备,智能电视以及更多特殊系统。

图片

总结


Svelte是构建几乎所有Web应用程序组件的出色工具。 它具有与React一样强大的功能,尽管社区规模明显较小,但掌握起来所需的精力更少。 像Vue一样,它是灵活的,同时更加简约和经过验证,因为它没有立即掌握现代Web开发的所有思想。

此外,他是唯一使用濒危框架概念的人。 换句话说,除了浏览器本身,它没有特定的运行时

它的应用程序很快出现,对资源的要求不高,而且尺寸很小。 另外, Svelte可以“无缝地”用其他框架编写的应用程序中,我计划在下一次编写。

如果您初次遇到这个很棒的框架,则可能有兴趣阅读有关该框架的其他文章:

神奇消失的JS框架
1Kb自动完成
SvelteJS:发布第二个版本

如果您仍然对Svelte有疑问,请加入俄语电报频道SvelteJS 。 在这里,您始终可以提出问题并获得建议,查找最新消息,然后享受聊天的乐趣。 我们将很高兴见到您!

Source: https://habr.com/ru/post/zh-CN417747/


All Articles