جستجو برای:
سبد خرید 0
  • صفحه اصلی
  • دوره های آموزشی
    • آموزش کتابخانه Ant Design به سادگی آب خوردن !
    • آموزش ساخت داشبورد حرفه ای با ری اکت !
    • آموزش فریمورک Tailwind CSS به زبان ساده!
    • آموزش HTML و CSS پروژه محور و اصولی !
  • وبلاگ
  • تماس با ما
  • درباره ما
logo-frontendi-150
0
  • خانه
  • دوره ها
  • وبلاگ فِرانت اِندی
  • تماس با ما
ورود / عضویت
  • صفحه اصلی
  • دوره های آموزشی
    • آموزش کتابخانه Ant Design به سادگی آب خوردن !
    • آموزش ساخت داشبورد حرفه ای با ری اکت !
    • آموزش فریمورک Tailwind CSS به زبان ساده!
    • آموزش HTML و CSS پروژه محور و اصولی !
  • وبلاگ
  • تماس با ما
  • درباره ما
ورود / عضویت

وبلاگ

فرانت اندی > وبلاگ فِرانت اِندی > ری اکت > دام مجازی ری اکت و بررسی تخصصی Virtual DOM ری اکت

دام مجازی ری اکت و بررسی تخصصی Virtual DOM ری اکت

14 مرداد 1402
ارسال شده توسط احمد احمدنژاد
ری اکت
دام مجازی ری اکت - دام مجازی React - دام چیست ؟ - DOM چیست ؟ - VDOM چیست ؟ - Virtual DOM ری اکت

اگه شماهم یک React Developer تازه وارد هستید یا چندسال سابقه کار دارید ، ممکنه یک دید کلی از دام مجازی ری اکت ( React Virtual Dom ) داشته باشید ولی این کافی نیست !

حقیقتا به عنوان یک Front End Enginner باید درک عمیقی از React داشته باشید . از اونجاییکه دام مجازی یکی از مهمترین مباحث ری اکت هست ، لازم هست یکبار برای همیشه بدونیم که دام مجازی ری اکت چیه و چطور کار میکنه ؟

پس با فِرانت اِندی همراه باشید تا بصورت تخصصی بررسیش کنیم 🙂

لطفا در مطالعه این مقاله کمی صبور باشید 🙂 مباحثی که تو این مقاله راجبش صحبت میکنیم ممکنه برای برخی سنگین باشن ولی بهتون قول میدم یادگیریشون بشدت به Level Up شدنتون کمک میکنه ! پس لطفا کمی با صبوری و دقت بیشتری این مقاله رو مطالعه کنید 🙂

قبل از بررسی تخصصی Virtual DOM ، بهتره بریم سراغ خود DOM و ببینیم DOM چیه .

دام چیست ؟ - DOM چیست ؟ - DOM جاوا اسکریپت - دام جاوا اسکریپت

DOM چیست ؟

دام مخفف عبارت Document Object Model هست . در واقع DOM نشان دهنده UI ( ظاهر ) وبسایت شماست و هربار که تغییری در سایت اعمال میشه ، DOM یکبار بروزرسانی میشه.

در حقیقت DOM یک ساختار درختی از تمامی Element ها و تگ های موجود در صفحه وب شماست.

دام مجازی ری اکت - دام مجازی React - دام چیست ؟ - DOM چیست ؟ - VDOM چیست ؟ - Virtual DOM ری اکت

به تصویر بالا دقت کنید .

کد سمت چپ ، کد Html صفحه شماست که به DOM سمت راست تبدیل شده . در واقع DOM یک ساختار درختی شکل از اجرای صفحه شما ( تگ ها ) میسازه .

یک مثال واقعی از DOM برای درک نقطه ضعف آن

فرض کنید داخل صفحه ای از سایتتون یک لیست 10 عددی از اطلاعات کاربران خودتون دارید و قصد دارید فقط اطلاعات کاربر اول رو ویرایش کنید .

پس از ویرایش اطلاعات کاربر اول ، تمام لیست 10 عددی در DOM بروزرسانی میشه !

و این اصلا خوب نیست !! چون شما فقط یک مورد رو ویرایش کردید و توقع دارید فقط همون کاربر در DOM بروزرسانی بشه اما تمامی لیست ( 10 کاربر ) بروزرسانی میشن !

این یعنی 9 برابر زمان بیشتر و بیهوده برای بروزرسانی UI !

اینجاست که ارزش واقعی Virtual DOM ری اکت ، به چشم میاد. دام مجازی ری اکت مشکلات DOM رو نداره و performance و سرعت فوق العاده ای داره.

دام مجازی ری اکت چیست ؟

بطور خلاصه و ساده Virtual DOM یک نسخه مجازی و کوچک شده از DOM اصلی وبسایت شماست که React از اون برای اعمال سریع تغییرات روی سایت استفاده میکنه.

 انجام اینکار باعث میشه که فقط همان اِلِمانی که تغییر داشته ، در UI بروزرسانی بشه .

دام مجازی همانطور که از اسمش هم پیداست ، یک نسخه مجازی از DOM واقعیه .

هربار که چیزی ( اِلِمانی ) در وبسایت ما تغییر میکنه ، بجای اینکه DOM اصلی بروزرسانی بشه ، دام مجازی بروزرسانی میشه .

سالها پیش ( که هنوز کتابخانه های جاوااسکریپتی مثل ری اکت و Vue.js وجود نداشتن ) چیزی به اسم Virtual DOM هم وجود نداشت. 

اگه هنوز هم سری به سایتهای قدیمی بندازید میبینید هربار که سایت تغییری میکنه ( مثلا از صفحه ای به صفحه دیگر میرید ) کل صفحه Refresh میشه .

یا مثلا زمانیکه محصولی رو به سبد خرید خودتون اضافه میکنید ، بلافاصله کل صفحه Refresh میشه !

این اتفاق به این دلیل میوفته که مستقیما DOM داره بروزرسانی میشه . اما توی React به لطف وجود داشتن دام مجازی ، دیگه Refresh شدنی صورت نمیگیره . چون دام مجازی داره تغییر میکنه.

در React ، به ازای هر Element در DOM واقعی ، یک Element در دام مجازی وجود دارد . ( یعنی در ازای هر div در DOM ، یک div با همان خصوصیات و ویژگی ها در دام مجازی وجود دارد )

دام مجازی ( Virtual DOM ) یک مفهوم برنامه نویسیه که در آن یک نمایش مجازی از UI تو حافظه نگهداری میشه . همگام سازی این دام مجازی با دام واقعی تو ری اکت توسط کتابخونه ReactDOM انجام میشه . به این فرآیند در برنامه نویسی reconciliation میگیم .

مفهوم reconciliation

تفاوت بروزرسانی DOM با VDOM ( دام مجازی )

بروزرسانی DOM خیلی کند و زمانبره اما در عوض بروزرسانی VDOM ( دام مجازی ) خیلی سریعتره !

چون در دام مجازی چیزی در صفحه ، نمایش داده نمیشه .

چرا Virtual DOM سریعتر است ؟

دام مجازی ری اکت - دام مجازی React - دام چیست ؟ - DOM چیست ؟ - VDOM چیست ؟ - Virtual DOM ری اکت

اینکه فقط بدونیم Virtual DOM از DOM سریعتره ، حقیقتا کافی نیست !

به عنوان یک Front-End Enginner باید دلیل سریعتر بودن دام مجازی رو بدونیم .

زمانیکه یک Element به UI وبسایت اضافه میشه ، بلافاصله یک دام مجازی ایجاد میشه ( با ساختار درختی که تصویرش بالاتر موجوده  ).

به محض تغییر در خصوصیات یا حالات هرکدوم از این Element ها ، یک دام مجازی دیگه ایجاد میشه .

در این مرحله VDOM اول با VDOM دوم مقایسه میشه.

بعد از این مقایسه ، مشخص میشه که چه Element هایی تغییر داشتن و باید توی UI هم تغییر کنن .

در این مرحله دام مجازی بهترین و مناسبترین روش برای اعمال این تغییرات به DOM اصلی رو پیدا میکنه و اون تغییرات رو به DOM واقعی اضافه میکنه.

انجام اینکار باعث میشه که کمترین زمان و هزینه برای بروزرسانی DOM صورت بگیره .

توی تصویر زیر میتونید عملیات مقایسه دام مجازی 1 با دام مجازی 2 رو ببینید :

دام مجازی ری اکت - دام مجازی React - دام چیست ؟ - DOM چیست ؟ - VDOM چیست ؟ - Virtual DOM ری اکت

به تصویر بالا دقت کنید .

3 دام مجازی در این پروسه مشخص شده . دایره های آبی رنگ Element هایی هستند که در UI به کاربر نشان میدهیم .

دایره های سبز رنگ ، Element هایی هستن که تغییر وضعیت داشتن .

زمانیکه وضعیت یک Element تغییر میکنه ، بلافاصله یک VDOM ساخته میشه و بصورت کامل با VDOM قبلی مقایسه میشه .

نتیجه مقایسه VDOM اول ( دام قبلی ) با VDOM دوم ( دام فعلی ) یک VDOM جدید هست که وارد DOM واقعی میشه.

تا به اینجای کار باید درک درستی از نحوه کار Virtual Dom و تفاوتش با DOM بدست اورده باشید . 

حالا وقتشه که بریم ببینیم ری اکت چطور از دام مجازی استفاده میکنه ؟

ری اکت چطور از Virtual DOM ( دام مجازی ) استفاده میکند ؟

ری اکت طی چند مرحله از دام مجازی استفاده میکند .

 

1 – ری اکت منتظر میمونه تا یک State تغییر پیدا کنه ( تغییر حالت یک Element )

در کتابخانه ری اکت به هر تیکه کد یک Component ( کامپوننت ) میگیم که هر کامپوننت یک یا چند State ( حالت ) داره .

زمانیکه State ( حالت ) یک کامپوننت تغییر میکنه ، ری اکت دام مجازی رو بروزرسانی میکنه. پس از بروزرسانی دام مجازی ، ری اکت نسخه قبلی VDOM را با نسخه فعلی VDOM مقایسه میکنه .

به این فرآیند diffing میگوییم .

پس از این مرحله ، حالا دیگه React میدونه که کدام Element ها تغییر حالت داشتن و فقط همان Element ها رو در DOM واقعی بروزرسانی میکنه.

انجام این پروسه در مقایسه با دستکاری مستقیم DOM ، بسیار کم هزینه تر و در مدت زمان کمتری صورت میپذیره .

همین عملکرد فوق العاده هست که React رو با سایر رقبای خودش مثل جی کوئری ، وردپرس و .. متمایز میکنه.

2- ری اکت تغییرات نهایی رو به DOM بصورت گروهی ارسال میکنه !

بروزرسانی DOM ، یکی از پرهزینه ترین مراحل تغییر حالت ( state ) اپیکیشن وب هست .

حالا فرض کنید به ازای هر تغییر کوچک ، ری اکت یک درخواست به DOM واقعی بابت بروزرسانی DOM بده !

اما خداروشکر اینطور نیست :/

ری اکت تضمین میکنه که تغییرات نهایی رو به DOM بصورت گروهی ارسال میکنه تا کمترین درخواست ممکن رو به DOM بابت بروزرسانی بده .

3- ری اکت از یک الگوریتم موثر برای پیدا کردن تغییر حالت ها استفاده میکنه ! ( شناسایی تغییر حالت Elements )

ری اکت برای اینکه بتونه تغییر حالات ( تغییر state ها ) رو تشخیص بده از یک الگوریتم اکتشافی با 2 خصوصیت زیر استفاده میکنه :

ذو Element با Type ( نوع ) متفاوت که درخت های مختلفی تولید میکنن.

خود React Developer مشخص کنه که کدام Element باید در تمامی re-Render ها در دسترس باشه . ( توسط ویژگی key )

بررسی Element ها با Type های متفاوت

بیاید خودمونو جای React بگذاریم و ببینیم رفتار ری اکت با Element های زیر چگونه هست و چطور تغییر این 2 اِلِمان رو به DOM ارسال میکنه :

				
					<div className="two" title="سلام" />
				
			
				
					<div className="one" title="سلام" />
				
			

وقتی ری اکت به 2 اِلِمان با Type یکسان برمیخوره ، اون Element رو در درخت VDOM نگه میداره و فقط Attribute های تغییر پیدا کرده رو بروز میکنه .

در واقع ری اکت متوجه میشه که فقط className این Element تغییر پیدا کرده ، پس فقط همین attribute رو در VDOM تغییر میده .

یک دام مجازی ( Virtual DOM ) دقیقا جیست ؟

بعد از اینهمه توضیحات ، آماده باشید تا بریم یک نمونه دام مجازی React ببینیم 🙂

اما قبلش ، برای یادآوری میخوام ساختار قابل مشاهده یک درخت دام مجازی رو بهتون نشون بدم :

دام مجازی ری اکت - دام مجازی React - دام چیست ؟ - DOM چیست ؟ - VDOM چیست ؟ - Virtual DOM ری اکت

حقیقتا یک Virtual DOM چیزی جز یک Object جاوااسکریپتی نیست ! همونطور که از اسمش پیداست ( Document Object Model )

اگر بخوام آبجکت جاوا اسکریپتی درخت تصویر بالایی رو نشونتون بدم ، دقیقا تیکه کد زیر میشه :

				
					const VirtualDom = { // دام مجازی از اینجا شروع میشود
    tagName: "html",
    children: [
        { tagName: "head" },
        {
            tagName: "body",
            children: [
                {
                    tagName: "ul",
                    attributes: { "class": "list" },
                    children: [
                        {
                            tagName: "li",
                            attributes: { "class": "list__item" },
                            textContent: "لیست من"
                        } // end li
                    ]
                } // end ul
            ]
        } // end body
    ]
} // end html
				
			

فریمورک های کار با دام مجازی ( Virtual DOM )

برای اینکه بتونید با دام مجازی ( Virtual DOM ) کار کنید میتونید از فریمورک های مختلفی استفاده کنید ، حتی میتونید بصورت دستی ( بدون فریمورک ) هم این کار رو بکنید که خیلی منطقی نیست .( قضیه درست کردن دوباره چرخ هست )

به عنوان یک مثال ساده ، با استفاده از روش زیر میتونید یک Element رو تو React وارد DOM مجازی کنید :

 

				
					import React from 'react';
import ReactDOM from 'react-dom';// این همون کتابخانه کار با دام مجازیه تو ری اکت

const list = React.createElement("ul", { className: "list" },
    React.createElement("li", { className: "list__item" }, "List item") // اینجا دو تا اِلِمان ساختیم
);

ReactDOM.render(list, document.body);// با استفاده از این دستور ، تو دام مجازی رندر کردیمشون
				
			

جمع بندی

چیزی که قابل انکار نیست ، اینه که داریم به سمتی میریم که DOM جای خودشو کم کم به Virtual DOM میده . دلایل این موضوع هم کاملا مشخصه و تو این مقاله بصورت تخصصی در موردش صحبت کردیم .

راستش من و شمایی که React Developer هستیم باید مباحث پایه React رو بصورت عمیق درک کرده باشیم و هدفم از انتشار این مقاله همین موضوع بود.

امیدوارم داستان دام مجازی React رو حسابی متوجه شده باشید 🙂

دام مجازی ( Virtual Dom ) چیست ؟

بطور خلاصه و ساده Virtual Dom یک نسخه مجازی و کوچک شده از DOM اصلی وبسایت شما است که React از آن برای اعمال سریع تغییرات روی سایت استفاده میکند. انجام اینکار باعث میشود که فقط همان اِلِمانی که تغییر داشته ، در UI بروزرسانی شود .

بین DOM و Virtual Dom کدام سریعتر است ؟

قطعا Virtual Dom سرعت بیشتری در بروزرسانی DOM دارد . دلایل تخصصی این مورد در این مقاله ذکر شده است .

VDOM چیست ؟

در حقیقت VDOM مخفف Virtual Document Object Model هست و به معنای همون دام مجازی میباشد که در این مقاله در موردش صحبت کردیم .

سوالات متداول فِرانت اِندی
درباره احمد احمدنژاد

من یه برنامه نویس و توسعه دهنده وب هستم که عاشق دنیای صفر و یکم❤️

نوشته‌های بیشتر از احمد احمدنژاد
قبلی هوک useNavigate در ری اکت برای ریدایرکت کاربر
بعدی هوک useContext ری اکت و بررسی تخصصی Context API ری اکت !

24 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • Mousa گفت:
    18 مرداد 1402 در 16:52

    سلام ممنون از نویسنده محترم که انقدر تخصصی و زبان ساده دام مجازی ری اکت رو بهمون توضیح داد. یکبار برای همیشه فهمیدم Virtual Dom ری اکت چیه .تشکر

    پاسخ
    • احمد احمدنژاد گفت:
      18 مرداد 1402 در 17:01

      سلام و درود
      ممنونم از پیام قشنگتون و خوشحالم که براتون مفید واقع شده 🙂

      پاسخ
  • محست گفت:
    10 شهریور 1402 در 05:09

    خیلی مقاله مفید و عالی بود . دمتون گرم

    پاسخ
    • احمد احمدنژاد گفت:
      10 شهریور 1402 در 19:19

      سلام و درود
      خوشحالم که براتون مفید واقع شده 🙂

      پاسخ
  • محمدرضا گفت:
    5 آبان 1402 در 05:03

    شاید جالب باشه براتون من از هوش مصنوعی گوگل به فارسی پرسیدم دام مجازی رو برام توضیح بده و اون لینک این مقاله رو بهم داد 😍👌🙏

    پاسخ
    • احمد احمدنژاد گفت:
      5 آبان 1402 در 20:43

      سلام و درود
      خوشحالم که این مقاله برات مفید بوده 😍 و دم هوش مصنوعی گوگل هم گرم 😂
      موفق باشی

      پاسخ
  • فرشید گفت:
    2 بهمن 1402 در 11:47

    ممنون از شما، مفید بود

    پاسخ
    • احمد احمدنژاد گفت:
      2 بهمن 1402 در 16:26

      سلام فرشید جان
      خوشحالم که این مقاله برات مفید واقع شده 🙂

      پاسخ
  • saba گفت:
    15 بهمن 1402 در 21:10

    سلام خیلی عالی توضیح دادین چند تا مقاله خوندم هیچکدوم انقد ساده و روان توضیح نداده بودن

    پاسخ
    • احمد احمدنژاد گفت:
      16 بهمن 1402 در 09:45

      سلام 🙂
      واقعا خوشحالم که این مقاله برات مفید بوده و خیلی خیلی ممنونم ازت که نظرت رو درمورد این مقاله بهم گفتی چون همین نظرات کمک میکنن بتونم مقالاتی که کیفیت مناسب ندارن رو بازنویسی کنم 🙂

      پاسخ
  • علیرضا گفت:
    12 تیر 1403 در 13:21

    اینکه vdom در نهایت dom رو اپدیت میکنه و قبلش هم یه سری مقایسه ها انجام میده، کار رو یکم دشوار تر نمیکنه نسبت به اینکه مستقیما dom اپدیت بشه، اینجوری یه مرحله کمتر انجام میشه?

    پاسخ
    • احمد احمدنژاد گفت:
      12 تیر 1403 در 14:24

      سلام علیرضا جان وقتت بخیر
      برای پاسخ دادن به این سوال، اول باید بدونیم که عمل “مقایسه” برای چی انجام میشه.
      مقایسه برای پیدا کردن بخش هایی که تغییر داشتن و بروزرسانی بخش هایی که تغییر داشتن انجام میشه.
      اگه ما “مقایسه” رو حذف کنیم، چطور میتونیم تشخیص بدیم که چه بخش هایی تغییر داشتن ؟

      ممنون از سوالی که پرسیدی و بازم اگه سوالی برات پیش اومد حتما مطرح کن 🙂
      موفق باشی

      پاسخ
  • امیر ریاحی گفت:
    17 مرداد 1403 در 07:22

    خیلی کامل و ساده توضیح دادید و کاملا متوجه شدم ممنون ازتون…

    پاسخ
    • احمد احمدنژاد گفت:
      17 مرداد 1403 در 07:55

      سلام امیر جان خیلی خوشحالم که برات مفید واقع شده و ممنون از نظر لطفت 🙂

      پاسخ
  • قاصدی گفت:
    26 مرداد 1403 در 14:48

    سلام خیلی عالی توضیح دادید ممنونم کامل و ساده و قابل فهم 👌❤️

    پاسخ
    • احمد احمدنژاد گفت:
      3 شهریور 1403 در 17:10

      سلام خوشحالم که براتون مفید واقع شده 🙂
      موفق باشی

      پاسخ
  • فرشته گفت:
    3 شهریور 1403 در 09:41

    خیلی خیلی مفید بود،مرسی از مطالب خیلی خوبی که ارائه میکنید واقعا عالی و به زبان ساده، من از مقالات سایت شما بسیار استفاده میکنم و یکی از مرجع های خوب برای من شده

    پاسخ
    • احمد احمدنژاد گفت:
      3 شهریور 1403 در 17:11

      سلام خییلی ممنون از نظر لطفتون و بینهایت خوشحالم که مقالات براتون مفید واقع شدن 🙂
      موفق باشی

      پاسخ
  • sadjad.ghasemi گفت:
    23 مهر 1403 در 09:50

    سپاس از شما که اینقدر ساده و زیبا توضیح دادید

    پاسخ
    • احمد احمدنژاد گفت:
      23 مهر 1403 در 17:30

      سلام سجاد جان
      خوشحالم که برات مفید واقع شده.
      موفق باشی 🙂

      پاسخ
  • صراف گفت:
    6 آذر 1403 در 18:12

    به جرات میگم مطالب شما رو قویترین مرجع فارسی زبان در حوزه react میدونم. عالی هستید. با قدرت ادامه بدید

    پاسخ
    • احمد احمدنژاد گفت:
      9 آذر 1403 در 13:28

      سلام علی جان، دمت گرم بابت نظر لطفت حساابی انرژی دادی بهم 🙂

      پاسخ
  • جواد گفت:
    16 بهمن 1403 در 13:09

    عالی بود واقعا دمتون گرم 🙂

    پاسخ
    • احمد احمدنژاد گفت:
      18 بهمن 1403 در 21:09

      قربانت جواد جان 🙂

      پاسخ

دیدگاهتان را بنویسید لغو پاسخ

جستجو برای:
پیاده سازی و مشاوره فِرانت اِند!

پیاده سازی اصولی و بهینه پروژه های فِرانت اِند در کمترین زمان ممکن 🙂

پیاده سازی و مشاوره

صفحات فِرانت اِندی
  • وبلاگ
  • تماس با ما
  • درباره ما
تماس با ما
  • [email protected]
  • 09102944692
شبکه های اجتماعی
Youtube Instagram Telegram
اشتراک گذاری در شبکه های اجتماعی
ارسال به ایمیل
https://frontendi.com/?p=9644
مرورگر شما از HTML5 پشتیبانی نمی کند.