بخصوص: "مقارنة أطر JS: React و Vue و Hyperapp"

هذه مقالة استجابة صغيرة لمنشور "مقارنة أطر JS: React و Vue و Hyperapp" . بشكل عام ، لست من المعجبين بهذه المقارنات. ومع ذلك ، نظرًا لأننا كنا نتحدث عن مثل هذا الإطار الهامشي مثل Hyperapp ، بالمقارنة مع mastodons مثل React و Vue ، فكرت ، لماذا لا تفكر في كل الأمثلة نفسها على Svelte . إذا جاز التعبير ، لإكمال الصورة. علاوة على ذلك ، يستغرق حرفيا 5 دقائق. دعنا نذهب!

الصورة

إذا كنت فجأة لا تعرف Svelte ومفهوم أطر الاختفاء ، يمكنك قراءة مقالات "اختفاء إطار JS السحري" و "إطار الاختفاء" .

لراحة القراء ، قمت بنسخ الأمثلة من المقالة الأصلية تحت المفسدين لجعلها أكثر ملاءمة للمقارنة. حسنًا ، لنبدأ.

مثال رقم 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")); 


فيو
 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" }); 


Hyperapp
 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")); 


velSvelte


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

مثال عملي.

ysisتحليل


مكون Svelte هو ملف html يحتوي على تنسيق مكون ملف واحد (SFC) سيئ السمعة ، بشكل أو بآخر ، مستخدم بالفعل في Vue و Ractive و Riot وبعض الأطر الأخرى. بالإضافة إلى قالب html نفسه ، يمكن أن يكون للمكون السلوك والمنطق الموصوفين في جافا سكريبت ، بالإضافة إلى أنماط النطاق المحددة للمكون.

لا يلزم أي جزء من المكون ، وبالتالي يمكن أن يتكون مكون العداد فقط من قالب html للعداد نفسه. لتغيير قيمة متغير العدد ، يستخدم معالج النقر الطريقة المضمنة لمكون 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")); 


فيو
 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" }); 


Hyperapp
 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")); 


velSvelte


 <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> 

مثال عملي.

ysisتحليل


على عكس JSX ، الذي يستخدم ، مثل نسخة كربونية ، في جميع الأطر الثلاثة من المقارنة الأصلية ، وفي الواقع يمتد كود جافا سكريبت مع بناء جملة يشبه html ، يستخدم Svelte ميزات أكثر شيوعًا - تضمين كود js و css في html باستخدام < البرنامج النصي> و <style> .

يقوم البرنامج النصي للمكون بتصدير كائن JS بسيط مقسم إلى أقسام. يصف قسم الطرق طرق المكونات التي يمكن استخدامها من خلال مثيل المكون وفي معالجات الأحداث. لذلك ، عند النقر فوق الزر ، يتم استدعاء طريقة getData () ، التي يتم طلب البيانات بداخلها وعند اكتمال العملية ، يتم تثبيت البيانات ببساطة في حالة المكون ويتم رسمها على الفور في القالب.

لاحظ استخدام تدمير كائن النشر (النشر) في كل خطوة من خطوات تكرار قائمة النشر:

 {#each posts as {title, body}} 

تتجنب هذه الحيلة التكرار في نماذج مثل {post.title} وتبسّط النماذج بصريًا باستخدام إدخال أقصر {title} .

مثال 3: مكون عنصر القائمة لتطبيق المهام الواجبة


رد فعل (أسلوب وظيفي)
 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> ); } } 


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


Hyperapp
 const TodoItem = ({ id, value, done, toggle }) = ( <li class={done ? "done" : ""} onclick={() => toggle(id)}> {value} </li> ); 


velSvelte


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

مثال عملي.

ysisتحليل


كل شيء عادي جدا هنا. نكشف فئة css اعتمادًا على القيمة المنجزة ونغير هذه القيمة إلى العكس عند النقر فوق عنصر قائمة.

مقارنة بين طرق دورة حياة المكون


إخلاء المسؤولية : من الآن فصاعدًا ، قررت حذف المقارنة مع Hyperapp ، لأنه بخلاف ذلك ستكون الجداول غير قابلة للقراءة ببساطة.

حدث
رد فعل
فيو
Svelte
التهيئة
مُنشئ
قبل الإنشاء ،
تم إنشاؤها
على الدولة
تصاعد
elementDidMount
beforemount شنت
oncreate ، onupdate
تحديث
elementDidUpdate
قبل التحديث ، تحديث
onstate ، onupdate
إلغاء التركيب
elementWillUnmount
-ondestroy
دمار
-قبل تدمير ، تدمير
-

ysisتحليل


Svelte هو أضيق الحدود للغاية ، بما في ذلك من حيث خطاطيف دورة الحياة. هناك 4 خطافات فقط:

  • onstate - يتم استدعاؤه قبل إنشاء المكون وتغيير كل حالة قبل تحديث DOM.
  • oncreate - لحظة إنشاء المكون.
  • عند التحديث - يتم الاتصال به فورًا بعد التثبيت في DOM وتغيير كل حالة بعد تحديث DOM.
  • ondestroy - يسمى عندما يتم إتلاف المكون وإزالته من DOM.


مقارنة أداء الإطار


بصراحة ، لا أعرف ما أعلق عليه. المعايير نفسها وطريقة تنفيذها تتسبب دائمًا في الكثير من الجدل ، لذلك لا أعتقد أنه من المنطقي تركيز الانتباه بشكل غير ضروري.
ومع ذلك ، لا يزال لدينا بيانات أخرى.

with العمل مع الجداول




▍ التحميل ، الإطلاق ، أحجام الكود




with العمل مع الذاكرة




ysisتحليل


إذا حكمنا من خلال الأرقام ، فإن Svelte سريع جدًا ، "يأكل" القليل من الذاكرة (بما في ذلك لأنه لا يستخدم VirtualDOM) ، فإنه يبدأ بسرعة ولديه حجم صغير.

بشكل عام ، لا أستطيع أن أقول أن نتائج المقاييس لهذه الأطر الثلاثة اختلفت بشكل كبير. ومع ذلك ، فإن Svelte فقط لديه عمود "أخضر" حصريًا ، أي إنه جيد تمامًا دفعة واحدة من جميع النواحي ، مما يعني أنه متوازن تمامًا وليس لديه تشوهات واضحة في السرعة أو استهلاك الذاكرة أو المقاييس الأخرى. بشكل عام ، يمكنك من خلاله بدء أي مشروع بأمان ، من الويب المعتاد ، إلى الأجهزة المحمولة والتلفزيون الذكي والمزيد من الأنظمة الغريبة.

الصورة

الملخص


Svelte هي أداة رائعة لبناء مكونات أي تطبيق ويب تقريبًا. إنه قوي مثل React ، وعلى الرغم من أنه يحتوي على مجتمع أصغر بكثير ، إلا أنه يتطلب جهدًا أقل لإتقانه. إنه مرن ، مثل Vue ، في حين أنه أكثر بساطة ويتم التحقق منه ، لأنه لا يحاول استيعاب جميع أفكار تطوير الويب الحديثة في وقت واحد.

بالإضافة إلى ذلك ، فهو الوحيد الذي يستخدم مفهوم الأطر المهددة بالانقراض . بمعنى آخر ، ليس لديه وقت تشغيل محدد بخلاف المتصفح نفسه.

التطبيقات على ذلك تتحول بسرعة ، لا تتطلب موارد وصغيرة الحجم. بالإضافة إلى ذلك ، يمكن استخدام Svelte "بسلاسة" في التطبيقات المكتوبة في أطر عمل أخرى ، والتي أخطط للكتابة عنها في المرة القادمة.

إذا قابلت هذا الإطار الرائع لأول مرة ، فقد تكون مهتمًا بقراءة مقالات أخرى حوله:

اختفاء JS Framework بطريقة سحرية
→ 1 كيلو بايت الإكمال التلقائي
SvelteJS: إصدار الإصدار الثاني

إذا كان لا يزال لديك أسئلة حول Svelte ، انضم إلى قناة Telegram باللغة الروسية SvelteJS . هناك يمكنك دائمًا طرح سؤال والحصول على المشورة ، ومعرفة آخر الأخبار ، والاستمتاع فقط بالدردشة. سنكون سعداء لرؤيتك!

Source: https://habr.com/ru/post/ar417747/


All Articles