Biến và kiểu dữ liệu
Variables & Types
Biến là cái hộp có nhãn. Dùng const cho giá trị không gán lại, let khi cần gán lại. Kiểu cơ bản: chuỗi, số, boolean, mảng, object, null, undefined.
From JavaScript basics to production-ready Next.js, TypeScript and Tailwind CSS
Chỉ với một trang, bạn đi từ let và const đến Server Component, hydration và Tailwind v4, vừa đọc vừa bấm thử.
Sáu ý tưởng nền tảng. Nắm chắc chúng, phần còn lại chỉ là ghép chúng lại với nhau.
Variables & Types
Biến là cái hộp có nhãn. Dùng const cho giá trị không gán lại, let khi cần gán lại. Kiểu cơ bản: chuỗi, số, boolean, mảng, object, null, undefined.
Functions & Arrow functions
Hàm gói một việc để gọi lại nhiều lần. Dạng ngắn: const add = (a, b) => a + b. Bạn sẽ viết rất nhiều hàm mũi tên trong React.
Static Types (TypeScript)
TypeScript là JavaScript cộng thêm kiểu: let age: number. Editor báo lỗi ngay khi bạn gán chuỗi cho biến số, trước khi chạy code.
Components & JSX
Component là hàm trả về giao diện: function Hello() { return <h1>Xin chào</h1>; }. UI là cây các component lồng nhau.
File-system routing
Trong Next.js, thư mục là đường dẫn. app/notes/page.tsx thành trang /notes. Không cần cấu hình router thủ công.
Utility classes (Tailwind CSS)
Thay vì viết file CSS riêng, bạn ghép class nhỏ ngay trong JSX: p-4 rounded-xl bg-teal-600. Mỗi class làm đúng một việc.
| Tiêu chí / Criterion | JavaScript | TypeScript |
|---|---|---|
| Kiểm tra kiểu / Type checking | Khi chạy (runtime), linh hoạt | Khi biên dịch và trong editor |
| Phát hiện lỗi / Catching bugs | Thường đến khi người dùng gặp lỗi | Nhiều lỗi bị chặn từ lúc viết code |
| Chạy ở đâu / Where it runs | Trình duyệt, Node.js | Biên dịch ra JS rồi mới chạy, kiểu bị xoá |
| Gợi ý code / Autocomplete | Hạn chế | Rất tốt vì editor biết cấu trúc dữ liệu |
| Độ khó học / Learning curve | Dễ bắt đầu | Học JS trước, thêm kiểu dần dần |
hover:, md:, chế độ tối và hệ thống design token mà inline style không có.'use client' nghĩa là không render trên server.” Sai: Client Component vẫn được prerender thành HTML, rồi mới hydrate.Bấm từng file trong dự án DevNotes để xem nó trở thành URL nào, chạy ở đâu, và code ra sao.
Bấm Bước tiếp hoặc Tự chạy để đi qua từng giai đoạn. Mặc định đang tạm dừng.
Sơ đồ khái niệm, không theo tỉ lệ thời gian. Conceptual diagram, not to scale.
Chỉnh các lựa chọn, xem class sinh ra và kết quả thực.
Ứng dụng ghi chú nhỏ, làm từng bước. Bạn cần Node.js bản mới (xem yêu cầu phiên bản trên trang tài liệu Next.js, vì con số này thay đổi theo từng bản).
| Tiêu chí / Criterion | Server Component | Client Component |
|---|---|---|
| Mặc định? / Default? | Có, trong thư mục app/ | Phải khai báo 'use client' ở đầu file |
Dùng useState, onClick | Không | Có |
async/await lấy dữ liệu trực tiếp | Có | Không trực tiếp, thường dùng thư viện hoặc Server Action |
| Code gửi xuống trình duyệt / Shipped JS | Không | Có, vào bundle |
| Truy cập bí mật (API key, DB) | An toàn | Không bao giờ đặt ở đây |
Cách làm tốt: giữ 'use client' ở các “lá” nhỏ (nút, form, dropdown), để cây phía trên là Server.
Giả sử trang của bạn có tổng lượng JS (đã nén gzip). Chuyển bao nhiêu phần sang Server Component thì tiết kiệm được bao nhiêu giây?
JS gửi xuống: → thời gian tải:
Công thức: giây = KB × 8 ÷ (Mbps × 1000). Chỉ tính thời gian truyền, chưa tính độ trễ mạng (RTT), giải nén, parse và chạy JS. Tốc độ mạng là số làm tròn tiêu biểu.
Tailwind mobile-first: class không tiền tố áp dụng cho mọi cỡ, md: áp dụng từ 768px trở lên. Kéo để thử với grid-cols-1 sm:grid-cols-2 lg:grid-cols-4.
Thang đo đúng tỉ lệ. Giá trị mặc định của Tailwind v4: 40, 48, 64, 80, 96 rem (tương ứng 640 → 1536px).
Thu hẹp kiểu Narrowing: TS hiểu kiểu sau mỗi lần kiểm tra.
Generic và utility type: viết một lần, dùng cho nhiều kiểu.
Trang tĩnh, nhanh, tốt cho SEO nhờ HTML dựng sẵn trên server.
Server Component lấy dữ liệu, Client Component lo biểu đồ tương tác.
Trang sản phẩm tái tạo định kỳ (ISR), giỏ hàng là Client Component.
| Chiến lược | Khi nào HTML được tạo | Dữ liệu tươi? | Hợp với |
|---|---|---|---|
| SSG Static | Lúc build | Cũ cho đến lần build kế | Blog, tài liệu |
| ISR Incremental | Build, rồi tái tạo theo chu kỳ | Tươi vừa phải | Trang sản phẩm, tin tức |
| SSR Dynamic | Mỗi yêu cầu | Luôn mới | Trang cá nhân hoá |
| Streaming | Mỗi yêu cầu, gửi từng phần | Luôn mới | Trang có phần chậm (dùng Suspense) |
| CSR Client | Trong trình duyệt | Luôn mới | Phần tương tác sau đăng nhập |
Biểu đồ minh hoạ định tính, không theo tỉ lệ. Qualitative illustration, not to scale. Các chiến lược kết hợp (như Partial Prerendering, Cache Components) thay đổi nhanh giữa các bản Next.js, hãy kiểm tra tài liệu bản bạn dùng.
Phần nhanh hiện ngay, phần chậm được stream vào sau.
Hàm chạy trên server, gọi trực tiếp từ form, không cần tự viết API.
Ngưỡng theo hướng dẫn của Google (ở phân vị 75). Mỗi thanh có thang riêng, chỉ so sánh vị trí các ngưỡng trong cùng một thanh. Ngưỡng có thể được cập nhật.
let, const, hàm mũi tên, module.Năm có thể lệch một chút tuỳ nguồn. Phiên bản mới nhất của Next.js, TypeScript, Tailwind thay đổi liên tục, hãy xem trang chính thức.
'use client' xuống các lá nhỏ.strict trong tsconfig.json và tránh any, dùng unknown rồi thu hẹp kiểu.next/image và next/font để tối ưu ảnh và font."bg-" + color, hãy ghi đủ tên class để Tailwind quét được.loading.tsx và error.tsx cho các route chậm hoặc dễ lỗi.fetch đã đổi giữa các bản chính, nên hãy đọc ghi chú phát hành khi nâng cấp.| English | Tiếng Việt | Example sentence |
|---|
5 điểm mỗi câu đúng, từ câu đúng thứ 3 liên tiếp được thêm 2 điểm thưởng chuỗi. Điểm tối đa là 136.