Xây dựng dapp trên cardano từ con số không
About Lesson

Frontend Framework and Library


1. Khái niệm MPA (Multi-Page Application)

🔹 MPA là gì?

MPA (Multi-Page Application) là mô hình phát triển web truyền thống, trong đó mỗi lần người dùng chuyển sang một trang mới, trình duyệt sẽ gửi một yêu cầu (HTTP request) lên server để tải về toàn bộ tài nguyên HTML, CSS, và JavaScript mới.

Mỗi trang trên website là một file HTML riêng biệt, và việc điều hướng giữa các trang là thông qua các liên kết (links) đến các file đó.

🔹 Cách hoạt động của MPA

Khi người dùng truy cập một trang mới:

    1. Trình duyệt gửi request đến server.
    2. Server phản hồi lại bằng một file HTML hoàn chỉnh mới.
    3. Trình duyệt tải lại toàn bộ nội dung trang, bao gồm cả CSS, JS, và hình ảnh.

🔹 Ví dụ minh họa

Giả sử bạn vào trang báo VNExpress:

  • Khi click vào một bài viết khác, trang sẽ reload hoàn toàn.
  • Nếu bạn mở tab Network trong DevTools, bạn sẽ thấy trình duyệt gửi một request và nhận lại toàn bộ file HTML mới.
  • Những phần giống nhau (như header, footer) cũng bị tải lại — làm tốn băng thông và thời gian tải.

🔹 Demo MPA đơn giản

Tạo website MPA cơ bản gồm 2 trang:

index.html
about.html
style.css
script.js
 

index.html

<!DOCTYPE html>
<html lang="vi">
  <head>
    <meta charset="UTF-8" />
    <title>Trang chủ - MPA Demo</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <h1>Chào mừng đến với trang chủ!</h1>
    <a href="about.html">Đi đến trang giới thiệu</a>
  </body>
</html>
 

about.html

<!DOCTYPE html>
<html lang="vi">
  <head>
    <meta charset="UTF-8" />
    <title>Giới thiệu - MPA Demo</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <h1>Trang giới thiệu</h1>
    <a href="index.html">Quay lại trang chủ</a>
  </body>
</html>
 

➡ Khi bấm chuyển trang, trình duyệt load lại toàn bộ nội dung — đó là cách hoạt động của MPA.

🔹 Ưu điểm và nhược điểm

Ưu điểm Nhược điểm
Tối ưu SEO tốt do mỗi trang là HTML riêng Tốc độ tải chậm do reload toàn bộ trang
Dễ triển khai trên server truyền thống Mất trạng thái khi chuyển trang
Phù hợp cho website nhỏ (blog, tin tức) Trải nghiệm người dùng không mượt mà

2. Khái niệm SPA (Single Page Application)

🔹 SPA là gì?

SPA (Single Page Application) là ứng dụng web chỉ có một file HTML duy nhất, được tải một lần duy nhất khi khởi động.

Sau đó, các thay đổi nội dung hoặc chuyển trang được thực hiện bằng JavaScript (thường là React, Vue hoặc Angular) — mà không cần reload lại toàn bộ trang.

🔹 Cách hoạt động của SPA

  1. Khi người dùng truy cập lần đầu → trình duyệt tải index.html, các file CSS/JS.
  2. Khi chuyển giữa các phần (ví dụ “Home” → “About”) → trình duyệt không tải lại HTML, mà chỉ render lại phần nội dung cần thiết.
  3. Các dữ liệu được lấy từ server thông qua API (JSON), không phải HTML.

🔹 Minh họa khác biệt giữa MPA và SPA

Đặc điểm MPA SPA
Cấu trúc Nhiều file HTML Một file HTML duy nhất
Request mỗi lần chuyển trang Có (toàn bộ trang mới) Không (chỉ request dữ liệu JSON)
Tốc độ Chậm hơn Nhanh hơn
Framework phổ biến PHP, JSP, ASP.NET React, Vue, Angular

🔹 Demo SPA đơn giản

<div id="app"></div>
<button onclick="navigate('home')">Trang chủ</button>
<button onclick="navigate('about')">Giới thiệu</button>

<script>
  function navigate(page) {
    const app = document.getElementById("app");
    if (page === "home") app.innerHTML = "<h1>Trang chủ</h1>";
    else if (page === "about") app.innerHTML = "<h1>Giới thiệu</h1>";
  }
  navigate("home");
</script>
 

👉 Khi bấm nút, nội dung thay đổi ngay lập tứckhông reload trang.


3. Giới thiệu React và cách sử dụng cơ bản

3.1 React là gì?

  • React là thư viện JavaScript được phát triển bởi Facebook (Meta), dùng để xây dựng giao diện người dùng (UI), đặc biệt là các SPA.
  • Hoạt động theo tư duy Component-Based — chia giao diện thành nhiều khối nhỏ (component) dễ quản lý, tái sử dụng.
  • React chỉ tập trung vào phần View (V) trong mô hình MVC.

🔹 So sánh React với các framework khác

Tiêu chí React Vue.js Angular
Loại Thư viện Framework nhẹ Framework đầy đủ
Mức độ linh hoạt Rất cao Trung bình Cứng nhắc hơn
Dễ học Trung bình Dễ Khó hơn
Hệ sinh thái Rất lớn Vừa Lớn (enterprise)

3.2 Import React bằng CDN (Cách truyền thống)

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>React CDN Demo</title>
    <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
    <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  </head>
  <body>
    <div id="root"></div>
    <script type="text/babel">
      function Hello() {
        return <h1>Xin chào React!</h1>;
      }
      ReactDOM.render(<Hello />, document.getElementById("root"));
    </script>
  </body>
</html>
 

📌 Giải thích:

  • root là nơi React render toàn bộ ứng dụng.
  • ReactDOM.render() sẽ chèn component Hello vào thẻ <div id="root">.
  • Không reload lại trang khi nội dung thay đổi.

3.3 Demo cơ bản về Component và State

import React, { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <h2>Bạn đã bấm {count} lần</h2>
      <button onClick={() => setCount(count + 1)}>Tăng</button>
    </div>
  );
}

export default Counter;
 

👉 Khi bạn bấm nút, React chỉ cập nhật phần tử thay đổi (state count), không reload lại toàn bộ DOM.


4. Cài đặt và khởi tạo dự án React với Vite

4.1 Cài đặt Node.js

node -v
npm -v
 

4.2 Khởi tạo ứng dụng React bằng Vite

npm create vite@latest my-app
cd my-app
npm install
npm run dev
 

Khi chạy, bạn sẽ thấy ứng dụng React khởi động tại http://localhost:5173.


4.3 Cấu trúc thư mục của dự án React

 
my-app/
│
├── index.html              # File HTML gốc (chỉ có <div id="root">)
├── package.json            # Quản lý dependencies & scripts
├── vite.config.js          # Cấu hình build của Vite
└── src/
    ├── main.jsx            # Entry point render <App />
    ├── App.jsx             # Component chính
    └── assets/             # Thư mục chứa hình ảnh, CSS, ...
 

📌 Trong main.jsx:

 
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";

ReactDOM.createRoot(document.getElementById("root")).render(<App />);
 

4.4 Chạy và Build ứng dụng

  • Chạy ở môi trường dev:

    npm run dev
     

    → Mở trình duyệt tại localhost:5173.

  • Build cho production:

    npm run build
     

    → Tạo thư mục dist/ chứa bản tối ưu.


4.5 Các khái niệm React cơ bản

Khái niệm Mô tả
Component Khối giao diện nhỏ, tái sử dụng được
Props Truyền dữ liệu từ component cha xuống con
State Trạng thái nội bộ, dùng để quản lý dữ liệu động
Event Handling Xử lý sự kiện người dùng (onClickonChange, …)
Hooks cơ bản useStateuseEffectuseContext, …

✅ Tổng kết

  • MPA: Mỗi trang là một file HTML riêng, reload toàn bộ mỗi lần chuyển trang.
  • SPA: Chỉ có một HTML duy nhất, mọi thay đổi đều render trên client → nhanh và mượt.
  • React: Thư viện xây dựng UI theo hướng component, tối ưu cho SPA.
  • Vite: Công cụ tạo và chạy dự án React nhanh hơn create-react-app.

Bài Tập

📝 Bài tập 1: So sánh MPA và SPA

Đề bài

Giải thích sự khác biệt giữa MPA (Multi-Page Application) và SPA (Single-Page Application) dựa trên cách chúng hoạt động và hiệu suất.

Yêu cầu

  • Mô tả cách MPA và SPA xử lý yêu cầu và hiển thị nội dung.
  • Liệt kê ít nhất 2 ưu điểm và 2 nhược điểm của mỗi loại.
  • Đưa ra ví dụ thực tế cho từng loại ứng dụng.
Cách giải
  1. Cách hoạt động:
    • MPA: Mỗi lần chuyển trang, trình duyệt gửi yêu cầu đến server, server trả về file HTML mới cùng các tài nguyên (CSS, JS), tải lại toàn bộ trang.
    • SPA: Tải một trang HTML duy nhất ban đầu, các thay đổi nội dung được xử lý bằng JavaScript trên trình duyệt, sử dụng dữ liệu (thường là JSON) để cập nhật giao diện.
  2. Ưu và nhược điểm:
    • MPA:
      • Ưu điểm: Dễ phát triển cho website đơn giản; tốt cho SEO vì mỗi trang có nội dung riêng.
      • Nhược điểm: Tốc độ tải chậm do tải lại toàn bộ trang; trải nghiệm người dùng kém mượt mà.
    • SPA:
      • Ưu điểm: Tốc độ phản hồi nhanh, trải nghiệm mượt; giảm tải server vì chỉ gửi dữ liệu cần thiết.
      • Nhược điểm: Phức tạp hơn khi phát triển; SEO cần tối ưu thêm.
  3. Ví dụ:
    • MPA: Trang tin tức như Vietnam Express.
    • SPA: Ứng dụng như Gmail hoặc Trello.

Đáp án

  • MPA: Mỗi yêu cầu trả về một trang HTML mới, tải lại toàn bộ tài nguyên. Ví dụ: Vietnam Express. Ưu điểm: Dễ phát triển, tốt cho SEO. Nhược điểm: Tốc độ chậm, trải nghiệm kém mượt.
  • SPA: Tải một trang HTML ban đầu, dùng JavaScript để cập nhật nội dung. Ví dụ: Gmail. Ưu điểm: Nhanh, mượt mà. Nhược điểm: Phức tạp, SEO cần tối ưu.

📝 Bài tập 2: Tạo ứng dụng React cơ bản

Đề bài

Tạo một ứng dụng React đơn giản hiển thị dòng chữ “Chào mừng đến với React” trên giao diện.

Yêu cầu

  • Sử dụng Vite để tạo dự án React.
  • Tạo component Welcome hiển thị dòng chữ trên.
  • Chạy ứng dụng và kiểm tra trên trình duyệt.
Cách giải
  1. Khởi tạo dự án:
    • Cài Node.js và npm.
    • Chạy lệnh: npm create vite@latest my-react-app -- --template react.
    • Di chuyển vào thư mục: cd my-react-app và cài dependencies: npm install.
  2. Tạo component Welcome:
    • Tạo file Welcome.jsx trong thư mục src.
    • Viết mã JSX để hiển thị dòng chữ.
  3. Sử dụng component:
    • Sửa file App.jsx để import và render Welcome.
  4. Chạy ứng dụng:
    • Chạy: npm run dev và kiểm tra tại http://localhost:5173.

Đáp án

Tạo file src/Welcome.jsx:

function Welcome() {
  return <h1>Chào mừng đến với React</h1>;
}
export default Welcome;
 

Sửa file src/App.jsx:

import Welcome from "./Welcome";

function App() {
  return (
    <div>
      <Welcome />
    </div>
  );
}
export default App;
 

Chạy npm run dev, truy cập http://localhost:5173 để thấy dòng chữ “Chào mừng đến với React”.


📝 Bài tập 3: Tạo component tái sử dụng trong React

Đề bài

Tạo component Button tái sử dụng với nội dung và màu sắc tùy chỉnh.

Yêu cầu

  • Component Button nhận props: text (nội dung) và color (màu nền).
  • Sử dụng component trong App.jsx để hiển thị 3 nút với nội dung và màu sắc khác nhau.
  • Áp dụng CSS để nút có giao diện đẹp.
Cách giải
  1. Tạo component Button:
    • Tạo file Button.jsx trong thư mục src.
    • Dùng props text và color, áp dụng style inline hoặc CSS.
  2. Sử dụng trong App:
    • Trong App.jsx, import và render 3 lần Button với props khác nhau.
  3. Thêm CSS:
    • Tạo file Button.css hoặc dùng inline style để định dạng.

Đáp án

Tạo file src/Button.jsx:

import "./Button.css";

function Button({ text, color }) {
  return (
    <button style={{ backgroundColor: color }} className="custom-button">
      {text}
    </button>
  );
}
export default Button;
 

Tạo file src/Button.css:

.custom-button {
  padding: 10px 20px;
  margin: 5px;
  border: none;
  border-radius: 5px;
  color: white;
  font-size: 16px;
  cursor: pointer;
}
 

Sửa file src/App.jsx:

import Button from "./Button";

function App() {
  return (
    <div>
      <Button text="Nút Xanh" color="blue" />
      <Button text="Nút Đỏ" color="red" />
      <Button text="Nút Xám" color="gray" />
    </div>
  );
}
export default App;
 

Chạy npm run dev để xem 3 nút với màu sắc và nội dung khác nhau.


📝 Bài tập 4: Hiểu cấu trúc dự án React

Đề bài

Phân tích cấu trúc thư mục của dự án React tạo bằng Vite và giải thích vai trò các file chính.

Yêu cầu

  • Liệt kê các file/thư mục chính.
  • Giải thích chức năng của package.jsonindex.htmlmain.jsxApp.jsx.
  • Ví dụ cách thêm file CSS vào dự án.
Cách giải
  1. Cấu trúc thư mục:
    • Dự án React với Vite có thư mục srcpublic, và các file như package.jsonvite.config.jsindex.html.
  2. Chức năng file:
    • package.json: Quản lý dependencies và scripts.
    • index.html: File HTML gốc, chứa <div id="root">.
    • main.jsx: Khởi tạo ứng dụng, render App vào #root.
    • App.jsx: Component chính, chứa giao diện và logic.
  3. Thêm CSS:
    • Tạo file CSS trong src và import vào component.

Đáp án

  • Cấu trúc thư mục:

    my-react-app/
    ├── node_modules/
    ├── public/
    ├── src/
    │   ├── App.jsx
    │   ├── main.jsx
    │   ├── index.css
    ├── index.html
    ├── package.json
    ├── vite.config.js
    
     
  • Chức năng file:

    • package.json: Chứa thông tin dự án, dependencies, scripts như npm run dev.
    • index.html: File HTML chính, chứa <div id="root">.
    • main.jsx: Khởi tạo ứng dụng, render App vào #root.
    • App.jsx: Component chính, chứa giao diện và logic.
  • Ví dụ thêm CSS: Tạo file src/styles.css:

    body {
      background-color: #f0f0f0;
    }
     

    Import vào main.jsx:

    import "./index.css";
    import "./styles.css";
    import { createRoot } from "react-dom/client";
    import App from "./App";
    
    const root = createRoot(document.getElementById("root"));
    root.render(<App />);
     

📝 Bài tập 5: Tạo danh sách động với React

Đề bài

Tạo một ứng dụng React hiển thị danh sách các mục (items) từ một mảng dữ liệu.

Yêu cầu

  • Tạo component ItemList hiển thị danh sách các mục từ mảng.
  • Mỗi mục hiển thị tên và một nút xóa.
  • Khi nhấn nút xóa, mục đó bị xóa khỏi danh sách.
  • Sử dụng state để quản lý danh sách.
Cách giải
  1. Tạo component ItemList:
    • Tạo file ItemList.jsx trong thư mục src.
    • Sử dụng hook useState để quản lý mảng dữ liệu.
    • Dùng hàm map để render danh sách, mỗi mục có nút xóa.
  2. Xử lý xóa mục:
    • Thêm hàm xóa sử dụng filter để loại bỏ mục dựa trên index hoặc id.
  3. Sử dụng trong App:
    • Import và render ItemList trong App.jsx.

Đáp án

Tạo file src/ItemList.jsx:

import { useState } from "react";

function ItemList() {
  const [items, setItems] = useState(["Mục 1", "Mục 2", "Mục 3"]);

  const removeItem = (index) => {
    setItems(items.filter((_, i) => i !== index));
  };

  return (
    <div>
      <h2>Danh sách mục</h2>
      <ul>
        {items.map((item, index) => (
          <li key={index}>
            {item}
            <button onClick={() => removeItem(index)}>Xóa</button>
          </li>
        ))}
      </ul>
    </div>
  );
}
export default ItemList;
 

Sửa file src/App.jsx:

import ItemList from "./ItemList";

function App() {
  return (
    <div>
      <ItemList />
    </div>
  );
}
export default App;
 

Chạy npm run dev để xem danh sách, nhấn nút “Xóa” để xóa từng mục.