# Xây dựng ứng dụng ngân hàng Phần 1: Mẫu HTML và định tuyến trong ứng dụng web ```mermaid journey title Your Banking App Development Journey section SPA Fundamentals Understand single-page apps: 3: Student Learn template concepts: 4: Student Master DOM manipulation: 4: Student section Routing Systems Implement client-side routing: 4: Student Handle browser history: 5: Student Create navigation systems: 5: Student section Professional Patterns Build modular architecture: 5: Student Apply best practices: 5: Student Create user experiences: 5: Student ``` Khi máy tính hướng dẫn Apollo 11 điều hướng lên mặt trăng vào năm 1969, nó phải chuyển đổi giữa các chương trình khác nhau mà không cần khởi động lại toàn bộ hệ thống. Các ứng dụng web hiện đại hoạt động tương tự – chúng thay đổi những gì bạn thấy mà không tải lại mọi thứ từ đầu. Điều này tạo ra trải nghiệm mượt mà, nhạy bén mà người dùng mong đợi ngày nay. Không giống như các trang web truyền thống tải lại toàn bộ trang cho mỗi tương tác, các ứng dụng web hiện đại chỉ cập nhật các phần cần thay đổi. Cách tiếp cận này, giống như cách trung tâm điều khiển chuyển đổi giữa các màn hình khác nhau trong khi duy trì liên lạc liên tục, tạo ra trải nghiệm mượt mà mà chúng ta mong đợi. Đây là những điểm khác biệt nổi bật: | Ứng dụng nhiều trang truyền thống | Ứng dụng một trang hiện đại | |----------------------------------|-----------------------------| | **Điều hướng** | Tải lại toàn bộ trang cho mỗi màn hình | Chuyển đổi nội dung tức thì | | **Hiệu suất** | Chậm hơn do tải toàn bộ HTML | Nhanh hơn với các cập nhật từng phần | | **Trải nghiệm người dùng** | Nhấp nháy trang gây khó chịu | Chuyển đổi mượt mà như ứng dụng | | **Chia sẻ dữ liệu** | Khó khăn giữa các trang | Quản lý trạng thái dễ dàng | | **Phát triển** | Nhiều tệp HTML cần duy trì | Một tệp HTML với các mẫu động | **Hiểu sự tiến hóa:** - **Ứng dụng truyền thống** yêu cầu yêu cầu máy chủ cho mỗi hành động điều hướng - **SPA hiện đại** tải một lần và cập nhật nội dung động bằng JavaScript - **Kỳ vọng của người dùng** hiện nay ưu tiên tương tác tức thì, liền mạch - **Lợi ích hiệu suất** bao gồm giảm băng thông và phản hồi nhanh hơn Trong bài học này, chúng ta sẽ xây dựng một ứng dụng ngân hàng với nhiều màn hình kết nối liền mạch. Giống như cách các nhà khoa học sử dụng các công cụ mô-đun có thể được cấu hình lại cho các thí nghiệm khác nhau, chúng ta sẽ sử dụng các mẫu HTML làm thành phần tái sử dụng có thể hiển thị khi cần. Bạn sẽ làm việc với các mẫu HTML (bản thiết kế tái sử dụng cho các màn hình khác nhau), định tuyến JavaScript (hệ thống chuyển đổi giữa các màn hình), và API lịch sử của trình duyệt (giúp nút quay lại hoạt động như mong đợi). Đây là những kỹ thuật cơ bản được sử dụng bởi các framework như React, Vue, và Angular. Kết thúc bài học, bạn sẽ có một ứng dụng ngân hàng hoạt động, minh họa các nguyên tắc chuyên nghiệp của ứng dụng một trang. ```mermaid mindmap root((Single-Page Applications)) Architecture Template System Client-side Routing State Management Event Handling Templates Reusable Components Dynamic Content DOM Manipulation Content Switching Routing URL Management History API Navigation Logic Browser Integration User Experience Fast Navigation Smooth Transitions Consistent State Modern Interactions Performance Reduced Server Requests Faster Page Transitions Efficient Resource Usage Better Responsiveness ``` ## Câu hỏi trước bài học [Quiz trước bài học](https://ff-quizzes.netlify.app/web/quiz/41) ### Những gì bạn cần Chúng ta sẽ cần một máy chủ web cục bộ để kiểm tra ứng dụng ngân hàng – đừng lo, nó dễ hơn bạn nghĩ! Nếu bạn chưa có máy chủ nào, chỉ cần cài đặt [Node.js](https://nodejs.org) và chạy `npx lite-server` từ thư mục dự án của bạn. Lệnh tiện lợi này sẽ khởi động một máy chủ cục bộ và tự động mở ứng dụng của bạn trong trình duyệt. ### Chuẩn bị Trên máy tính của bạn, tạo một thư mục tên là `bank` với một tệp tên là `index.html` bên trong. Chúng ta sẽ bắt đầu từ [mã mẫu HTML](https://en.wikipedia.org/wiki/Boilerplate_code): ```html Bank App ``` **Mã mẫu này cung cấp:** - **Thiết lập** cấu trúc tài liệu HTML5 với khai báo DOCTYPE đúng - **Cấu hình** mã hóa ký tự là UTF-8 để hỗ trợ văn bản quốc tế - **Kích hoạt** thiết kế đáp ứng với thẻ meta viewport cho khả năng tương thích di động - **Đặt** tiêu đề mô tả xuất hiện trên tab trình duyệt - **Tạo** phần thân sạch sẽ nơi chúng ta sẽ xây dựng ứng dụng > 📁 **Xem trước cấu trúc dự án** > > **Kết thúc bài học, dự án của bạn sẽ bao gồm:** > ``` > bank/ > ├── index.html > ├── app.js > └── style.css > ``` > > **Chức năng của các tệp:** > - **index.html**: Chứa tất cả các mẫu và cung cấp cấu trúc ứng dụng > - **app.js**: Xử lý định tuyến, điều hướng, và quản lý mẫu > - **Templates**: Định nghĩa giao diện cho đăng nhập, bảng điều khiển, và các màn hình khác --- ## Mẫu HTML Mẫu giải quyết một vấn đề cơ bản trong phát triển web. Khi Gutenberg phát minh ra máy in chữ rời vào những năm 1440, ông nhận ra rằng thay vì khắc toàn bộ trang, ông có thể tạo các khối chữ tái sử dụng và sắp xếp chúng khi cần. Mẫu HTML hoạt động theo nguyên tắc tương tự – thay vì tạo các tệp HTML riêng biệt cho mỗi màn hình, bạn định nghĩa các cấu trúc tái sử dụng có thể hiển thị khi cần. ```mermaid flowchart TD A["📋 Template Definition"] --> B["💬 Hidden in DOM"] B --> C["🔍 JavaScript Finds Template"] C --> D["📋 Clone Template Content"] D --> E["🔗 Attach to Visible DOM"] E --> F["👁️ User Sees Content"] G["Login Template"] --> A H["Dashboard Template"] --> A I["Future Templates"] --> A style A fill:#e3f2fd style D fill:#e8f5e8 style F fill:#fff3e0 style B fill:#f3e5f5 ``` Hãy nghĩ về mẫu như bản thiết kế cho các phần khác nhau của ứng dụng. Giống như một kiến trúc sư tạo một bản thiết kế và sử dụng nó nhiều lần thay vì vẽ lại các phòng giống hệt nhau, chúng ta tạo mẫu một lần và sử dụng chúng khi cần. Trình duyệt giữ các mẫu này ẩn cho đến khi JavaScript kích hoạt chúng. Nếu bạn muốn tạo nhiều màn hình cho một trang web, một giải pháp là tạo một tệp HTML cho mỗi màn hình bạn muốn hiển thị. Tuy nhiên, giải pháp này đi kèm với một số bất tiện: - Bạn phải tải lại toàn bộ HTML khi chuyển đổi màn hình, điều này có thể chậm. - Khó chia sẻ dữ liệu giữa các màn hình khác nhau. Một cách tiếp cận khác là chỉ có một tệp HTML, và định nghĩa nhiều [mẫu HTML](https://developer.mozilla.org/docs/Web/HTML/Element/template) bằng cách sử dụng thẻ `