পাঠ ১২ · ৫৮-এর মধ্যে · মডিউল ৩
Home / Courses / Full-Stack Web Frameworks / React বনাম Vue বনাম Angular

React বনাম Vue বনাম Angular — একটি তুলনা

React vs Vue vs Angular: a comparison
১১ মিনিট পড়া শুরু · Beginner Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • React, Vue, Angular-এর সিনট্যাক্স দর্শন (JSX বনাম টেমপ্লেট) সম্পর্কে সাধারণ ধারণা
  • তিনটির ভার্চুয়াল DOM ব্যবহারের পদ্ধতিতে পার্থক্য
  • রিঅ্যাক্টিভিটি মডেল — এক্সপ্লিসিট রিরেন্ডার বনাম রিঅ্যাক্টিভ ট্র্যাকিং বনাম চেঞ্জ-ডিটেকশন
  • শেখার বক্ররেখা ও সাধারণ ব্যবহারের ক্ষেত্র
  • Python কোডে একই "কাউন্টার" সমস্যা তিনটি ভিন্ন স্টাইলে সমাধান করে দর্শনের পার্থক্য বাস্তবে অনুভব করা

১ · সংক্ষিপ্ত পরিচয়

React (Meta/Facebook, ২০১৩) একটি UI লাইব্রেরি — শুধু ভিউ-স্তর নিয়ে কাজ করে, রাউটিং/স্টেট ম্যানেজমেন্ট আলাদা লাইব্রেরি দিয়ে যোগ করতে হয় (যেমন React Router)। Vue (Evan You, ২০১৪) একটি প্রগ্রেসিভ ফ্রেমওয়ার্ক — ছোট স্ক্রিপ্ট হিসেবেও শুরু করা যায়, আবার পূর্ণাঙ্গ অ্যাপ্লিকেশনেও বাড়ানো যায়। Angular (Google, ২০১৬-এর পুনর্লিখন) একটি সম্পূর্ণ, opinionated ফ্রেমওয়ার্ক — রাউটিং, ফর্ম হ্যান্ডলিং, HTTP ক্লায়েন্ট, ডিপেন্ডেন্সি ইনজেকশন — সবকিছু বিল্ট-ইন।

২ · তুলনা — মাত্রা অনুযায়ী

নিচে প্রতিটি মাত্রার জন্য তিনটি ফ্রেমওয়ার্কের সাধারণভাবে স্বীকৃত বৈশিষ্ট্য দেওয়া হলো:

সিনট্যাক্স / টেমপ্লেটিং:

React
JSX — জাভাস্ক্রিপ্টের ভেতরেই HTML-এর মতো সিনট্যাক্স লেখা হয়; UI ও লজিক একই ফাইলে থাকে।
Vue
HTML-এর কাছাকাছি টেমপ্লেট সিনট্যাক্স (.vue সিঙ্গেল-ফাইল কম্পোনেন্ট) — টেমপ্লেট, লজিক ও স্টাইল আলাদা সেকশনে।
Angular
HTML টেমপ্লেট + TypeScript ক্লাস, ডেকোরেটর (@Component) দিয়ে মেটাডেটা যুক্ত করা।

ভার্চুয়াল DOM পদ্ধতি:

React
ক্লাসিক ভার্চুয়াল DOM ও L10-এর মতো ডিফিং/রিকনসিলিয়েশন ব্যবহার করে।
Vue
ভার্চুয়াল DOM ব্যবহার করে, সাথে কম্পাইল-টাইমে অপ্টিমাইজেশন যোগ করে যা কোন অংশ পরিবর্তনযোগ্য তা আগে থেকেই চিহ্নিত করে রাখে।
Angular
ঐতিহ্যগতভাবে ভার্চুয়াল DOM-এর বদলে নিজস্ব চেঞ্জ-ডিটেকশন সিস্টেম দিয়ে সরাসরি বাইন্ডিং আপডেট করে।

রিঅ্যাক্টিভিটি মডেল:

React
এক্সপ্লিসিট — একটি state-আপডেট ফাংশন কল করলেই কেবল রিরেন্ডার ট্রিগার হয় (ডেভেলপারকে "আমি বদলেছি" ঘোষণা করতে হয়)।
Vue
স্বয়ংক্রিয় ডিপেন্ডেন্সি-ট্র্যাকিং রিঅ্যাক্টিভিটি — একটি রিঅ্যাক্টিভ ভ্যালু বদলালেই যা যা তার উপর নির্ভরশীল তা স্বয়ংক্রিয়ভাবে আপডেট হয়।
Angular
চেঞ্জ-ডিটেকশন চক্র — নিয়মিত বিরতিতে (বা ইভেন্টের পর) পুরো কম্পোনেন্ট ট্রি পরীক্ষা করে কোথায় মান বদলেছে তা খুঁজে বের করে।

শেখার বক্ররেখা ও সাধারণ ব্যবহারের ক্ষেত্র:

React
মাঝারি শেখার বক্ররেখা, বিশাল ইকোসিস্টেম ও কমিউনিটি — নমনীয়, বড়-থেকে-ছোট যেকোনো স্কেলের SPA-তে জনপ্রিয়।
Vue
তুলনামূলক মৃদু শেখার বক্ররেখা, HTML-ঘনিষ্ঠ সিনট্যাক্স — ছোট থেকে মাঝারি প্রজেক্ট ও ধীরে ধীরে গ্রহণের জন্য উপযোগী।
Angular
খাড়া শেখার বক্ররেখা (TypeScript, DI, RxJS প্রয়োজন) — বড়, এন্টারপ্রাইজ-স্কেল অ্যাপ্লিকেশনে প্রচলিত, যেখানে একটি সুসংগঠিত, opinionated কাঠামো মূল্যবান।

৩ · একই সমস্যা, তিনটি দর্শন — Python দিয়ে সিমুলেশন

নিচের কোড সেলে একই কাউন্টার-আপডেট সমস্যা তিনটি ভিন্ন Python ফাংশন-স্টাইলে সমাধান করা হয়েছে — প্রতিটি স্টাইল একটি ফ্রেমওয়ার্কের রিঅ্যাক্টিভিটি-দর্শনের রূপক (কোনোটাই সেই ফ্রেমওয়ার্কের প্রকৃত সিনট্যাক্স নয়, শুধু ধারণাগত সাদৃশ্য):

Python
# --- স্টাইল ১: React-এর দর্শন -- এক্সপ্লিসিট রিরেন্ডার কল ---
def react_style_counter():
    print("--- React-স্টাইল (এক্সপ্লিসিট রিরেন্ডার) ---")
    state = {"count": 0}

    def render():
        print(f"  render() কল হলো -> count = {state['count']}")

    def set_count(new_value):
        state["count"] = new_value
        render()  # <-- ডেভেলপারকেই স্পষ্টভাবে রিরেন্ডার ট্রিগার করতে হয়

    render()          # প্রাথমিক render
    set_count(1)
    set_count(2)


# --- স্টাইল ২: Vue-এর দর্শন -- স্বয়ংক্রিয় রিঅ্যাক্টিভ ট্র্যাকিং ---
class Observable:
    """একটি মান -- বদলালেই রেজিস্টার-করা 'watcher' স্বয়ংক্রিয়ভাবে কল হয়"""
    def __init__(self, initial_value, watcher):
        self._value = initial_value
        self._watcher = watcher

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, new_value):
        self._value = new_value
        self._watcher(new_value)  # <-- মান বদলানোর সাথে সাথেই স্বয়ংক্রিয় ট্রিগার


def vue_style_counter():
    print("--- Vue-স্টাইল (স্বয়ংক্রিয় রিঅ্যাক্টিভিটি) ---")

    def render(count):
        print(f"  watcher স্বয়ংক্রিয়ভাবে render করল -> count = {count}")

    count = Observable(0, watcher=render)
    render(count.value)   # প্রাথমিক render
    count.value = 1       # <-- ডেভেলপার শুধু মান বদলাচ্ছে, render() আলাদা করে ডাকছে না
    count.value = 2


# --- স্টাইল ৩: Angular-এর দর্শন -- এক্সপ্লিসিট চেঞ্জ-ডিটেকশন চক্র ---
def angular_style_counter():
    print("--- Angular-স্টাইল (চেঞ্জ-ডিটেকশন চক্র) ---")
    state = {"count": 0}
    last_checked = {"count": None}

    def check_for_changes(cycle_num):
        if state["count"] != last_checked["count"]:
            print(f"  [চক্র {cycle_num}] পরিবর্তন পাওয়া গেল -> count = {state['count']}")
            last_checked["count"] = state["count"]
        else:
            print(f"  [চক্র {cycle_num}] কোনো পরিবর্তন নেই, স্কিপ")

    check_for_changes(1)      # প্রাথমিক চক্র
    state["count"] = 1        # <-- সরাসরি মান বদলানো হলো, কিন্তু এখনো 'দেখা' হয়নি
    check_for_changes(2)      # পরের চক্রেই এটা ধরা পড়ে
    check_for_changes(3)      # কোনো পরিবর্তন নেই -- তাই স্কিপ হবে
    state["count"] = 2
    check_for_changes(4)


react_style_counter()
print()
vue_style_counter()
print()
angular_style_counter()

    
লক্ষ্য করুন তিনটি স্টাইলেই চূড়ান্ত ফলাফল একই (কাউন্ট ০ থেকে শুরু করে শেষমেশ ২-তে পৌঁছায়), কিন্তু কীভাবে রিরেন্ডার ট্রিগার হয় তা সম্পূর্ণ ভিন্ন: React-স্টাইলে ডেভেলপার নিজে render() কল করে, Vue-স্টাইলে মান বদলানোর সাথেই value.setter স্বয়ংক্রিয়ভাবে watcher কল করে, আর Angular-স্টাইলে মান বদলানো ও "দেখা" (চেক করা) দুটো আলাদা ধাপ — মান বদলানোর পরেও পরের চেক-চক্র না আসা পর্যন্ত তা "লক্ষ্য করা" হয় না।
মূল কথা · Key takeaway

React, Vue, Angular তিনটিই কম্পোনেন্ট-ভিত্তিক UI তৈরি করে, কিন্তু "কখন ও কীভাবে রিরেন্ডার ঘটবে" — এই প্রশ্নের উত্তরে ভিন্ন দর্শন অনুসরণ করে: এক্সপ্লিসিট কল, স্বয়ংক্রিয় নির্ভরতা-ট্র্যাকিং, ও চক্রাকার চেঞ্জ-ডিটেকশন। প্রকৃত সিনট্যাক্স আলাদা হলেও L09-L11-এ শেখা কম্পোনেন্ট, props, state, লাইফসাইকেল, ভার্চুয়াল DOM-এর ধারণাগুলো তিনটিতেই কোনো-না-কোনো রূপে উপস্থিত।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ Vue-স্টাইল কোডে count.value = 1 লেখাটাই কেন render()-কে স্বয়ংক্রিয়ভাবে ট্রিগার করে দেয় — কোন Python ফিচার এটা সম্ভব করছে?

এটি সম্ভব হয়েছে Python-এর @property ও তার .setter ফিচার দিয়ে। Observable ক্লাসে value-কে একটি property বানানো হয়েছে, যার setter-এর ভেতরে self._watcher(new_value) কল লুকানো আছে। ফলে বাইরে থেকে দেখলে এটি একটি সাধারণ অ্যাসাইনমেন্ট (count.value = 1) মনে হয়, কিন্তু ভেতরে ভেতরে এটি একটি ফাংশন কল ঘটাচ্ছে — এটাই আসল Vue-এর রিঅ্যাক্টিভিটি সিস্টেমের (JavaScript-এ Proxy/getter-setter দিয়ে তৈরি) ধারণাগত রূপক।

প্র ০২ Angular-স্টাইল কোডে [চক্র ৩]-এ "কোনো পরিবর্তন নেই" কেন প্রিন্ট হয়, যদিও তার ঠিক আগে state["count"] = 1 সেট করা হয়েছিল?

কারণ state["count"] = 1 সেট হওয়ার পর চক্র ২ ইতিমধ্যে সেই পরিবর্তন ধরে ফেলেছে এবং last_checked["count"]-কেও 1-এ আপডেট করে দিয়েছে। তাই চক্র ৩-এ এসে state["count"] (এখনো ১) ও last_checked["count"] (এখন ১) — দুটোই সমান, তাই কোনো নতুন পরিবর্তন নেই বলে "স্কিপ" প্রিন্ট হয়। এটাই দেখায় চেঞ্জ-ডিটেকশন শুধু এখনো-না-দেখা পরিবর্তন ধরে, আগেই-দেখা-হয়ে-যাওয়া মান বারবার রিপোর্ট করে না।

প্র ০৩ এই তিনটি প্রজেক্টের মধ্যে কোনটি সবচেয়ে "ভালো" — React, Vue, না Angular?

কোনো একক সঠিক উত্তর নেই — এটি নির্ভর করে প্রজেক্টের স্কেল, টিমের অভিজ্ঞতা, ও প্রয়োজনীয়তার উপর। ছোট থেকে মাঝারি প্রজেক্টে দ্রুত শুরু করতে Vue-এর মৃদু শেখার বক্ররেখা সুবিধাজনক হতে পারে; নমনীয়তা ও বিশাল ইকোসিস্টেম দরকার হলে React জনপ্রিয়; বড়, দীর্ঘমেয়াদী এন্টারপ্রাইজ প্রজেক্টে Angular-এর বিল্ট-ইন কাঠামো (রাউটিং, DI, ফর্ম) মূল্যবান হতে পারে। M13-এর "সঠিক স্ট্যাক বাছাই করা" পাঠে এই সিদ্ধান্ত-প্রক্রিয়া আরও বিস্তারিত আলোচনা করা হবে।

অনুশীলন

  1. চিন্তা করুন: React-স্টাইল কোডে যদি ডেভেলপার ভুলে set_count(new_value)-এর ভেতরে render() কল করতে ভুলে যান (শুধু state["count"] = new_value লেখেন), তাহলে বাস্তব React-এ এর সবচেয়ে কাছাকাছি কী সমস্যা হতো?

    এটি "স্টেল UI" (stale UI) সমস্যার রূপক — অভ্যন্তরীণ ডেটা বদলে গেলেও স্ক্রিনে দেখানো UI পুরনো মানই দেখাতে থাকবে, কারণ কেউ রিরেন্ডার ট্রিগার করেনি। বাস্তব React-এ এই কারণেই সরাসরি ভ্যারিয়েবল বদলানোর বদলে সবসময় useState-এর মতো state-আপডেট ফাংশন ব্যবহার করতে হয় — সেগুলো ভেতরে ভেতরে রিরেন্ডার সিডিউল করে দেয়, ডেভেলপারকে আলাদা করে মনে রাখতে হয় না।

  2. পরীক্ষা করুন: উপরের কোড সেলে angular_style_counter() ফাংশনে check_for_changes(3) লাইনটি বাদ দিয়ে দেখুন এবং Run চাপুন — চক্র নম্বরগুলো কীভাবে বদলায় এবং মোট কতগুলো চক্র "পরিবর্তন পাওয়া গেল" রিপোর্ট করে তা লক্ষ করুন।

    check_for_changes(3) বাদ দিলে বাকি কলগুলো (১, ২, ৪) একইভাবে চলবে, শুধু "চক্র ৩: কোনো পরিবর্তন নেই" লাইনটি আর প্রিন্ট হবে না। মোট "পরিবর্তন পাওয়া গেল" রিপোর্ট সংখ্যা অপরিবর্তিত থাকবে (২টি — চক্র ২ ও চক্র ৪-এ), কারণ চক্র ৩ আসলে কোনো নতুন পরিবর্তন খুঁজেই পেত না। এটাই দেখায় অপ্রয়োজনীয় চেঞ্জ-ডিটেকশন চক্র বাদ দিলে ফলাফলে কোনো তথ্য হারায় না, শুধু কম্পিউটেশনাল কাজ কমে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • পরের পাঠ L13 সিঙ্গেল-পেজ অ্যাপ্লিকেশনে ফুল পেজ রিলোড ছাড়াই ক্লায়েন্ট-সাইড রাউটিং কীভাবে কাজ করে।
  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৮টি পাঠ আর্কিটেকচার প্যাটার্ন, ফ্রন্ট-এন্ড/ব্যাক-এন্ড ফ্রেমওয়ার্ক ফান্ডামেন্টাল, স্টেট ম্যানেজমেন্ট, REST API, ORM, অথেন্টিকেশন, রেন্ডারিং স্ট্র্যাটেজি ও ডিপ্লয়মেন্ট।
  • JavaScript Programming কোর্স সহোদর কোর্স এই তিনটি ফ্রেমওয়ার্কই মূলত জাভাস্ক্রিপ্ট-ভিত্তিক — ভাষাগত ভিত্তি সেই কোর্সে তৈরি হয়েছে।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Programming Languages & Compiler Design, Software Engineering & Git, Theory of Computation, Engineering Economics ও Full-Stack Web Frameworks — সব এক জায়গায়।
আগের পাঠ
Props, State ও কম্পোনেন্ট লাইফসাইকেল