← Vibe coding với Next.js

Bài 3 · Cơ bản · 20 phút

Sản phẩm số chạy thế nào

Biên soạn bởi Nguyễn Anh Tuấn

Mô hình tinh thần cho người không code, nhìn qua lăng kính một app Next.js + PostgreSQL: frontend vs backend, database, hosting/deploy, domain là gì; repo/file/thư mục; commit/branch/PR nghĩa là gì khi nhìn lướt. Kèm sơ đồ "giải phẫu một app Next.js đã deploy".

Ở bài Nghĩ như người làm sản phẩm, mèo con học cách mô tả cho AI. Để mô tả cho chuẩn, có một thứ giúp ích nhiều: hình dung sơ sản phẩm chạy ra sao phía sau. Khách chỉ bấm một nút, nhưng đằng sau là cả một dây chuyền - và bạn không cần gõ được nó, chỉ cần một bản đồ trong đầu.

Bài này vẽ bản đồ đó bằng lời thường, lấy ví dụ xuyên suốt khoá: một web bán hàng có ví (khách nạp tiền, mua hàng, bị trừ số dư). Không có dòng code nào ở đây - chỉ là cách các mảnh ghép với nhau.

Một sản phẩm web có hai nửa. Frontend là phần khách nhìn thấy và bấm: trang hàng, nút "Mua", ô nhập, màu sắc - chạy ngay trong trình duyệt. Backend là phần xử lý ẩn chạy trên máy chủ: kiểm mật khẩu đúng không, trừ số dư bao nhiêu, lưu đơn vào đâu - khách không thấy.

  • Frontend = giao diện khách thấy & bấm, chạy trong trình duyệt.
  • Backend = phần xử lý ẩn (đăng nhập, trừ tiền, lưu đơn), chạy trên máy chủ.
  • Web bán hàng: danh sách hàng + nút Mua = frontend; trừ số dư + lưu đơn = backend.
  • Next.js gom được cả hai nửa trong một dự án (full-stack).

Vì sao tách hai nửa

Tách ra vì có những việc không được để khách tự làm. Nếu để trình duyệt tự trừ tiền, một người rành kỹ thuật có thể sửa cho số dư nhảy lung tung. Việc đụng tới tiền và dữ liệu phải nằm ở backend, nơi khách không can thiệp được - một ý ta sẽ gặp lại ở bài bảo mật.

Tắt máy chủ rồi mở lại, số dư của khách vẫn còn - nhờ database (cơ sở dữ liệu). Đây là nơi giữ dữ liệu lâu dài và có tổ chức: tài khoản, số dư, sản phẩm, đơn hàng. Khoá này dùng PostgreSQL, một database phổ biến và vững.

Phân biệt nhanh: frontend lo hiển thị, backend lo xử lý, còn database lo ghi nhớ. Ba vai khác nhau, phối hợp với nhau trong mỗi lần khách bấm.

Để người khác vào được, sản phẩm phải chạy trên một máy luôn bật và có một địa chỉ ai cũng gõ tới được. Máy đó là VPS (máy chủ ảo thuê theo tháng); địa chỉ đó là tên miền (vd shopcuatoi.vn). Tên miền trỏ tới VPS, và đây là toàn cảnh khi khách truy cập:

🌐 Trình duyệtmàn hình kháchtên miềnHTTPS🖥️ VPS của bạn (máy chủ thuê)Nginxnhận kháchNext.jsfrontend + backendPostgreSQLdatabase (nhớ)request đi vào, dữ liệu trả ra theo chiều ngược lại
Trình duyệt gọi qua tên miền + HTTPS tới VPS; trong VPS: Nginx nhận khách, chuyển cho Next.js xử lý, Next.js đọc/ghi PostgreSQL.

Nginx là người nhận khách ngoài cửa rồi chuyển request vào trong; Next.js xử lý; PostgreSQL giữ dữ liệu. Cụm này được dựng sẵn bằng một lệnh ở bài deploy cuối khoá - giờ chỉ cần nhớ mặt từng mảnh.

Trung thực

Sơ đồ trên lược giản. Sản phẩm đông khách còn có CDN, cache, cân bằng tải… và bản thân Next.js chia nhỏ thành nhiều phần. Mèo con chưa cần tới chúng để dựng và mở bán; khi nào chạm trần, bài chi phí cuối khoá sẽ nói khi nào cần nâng cấp hay thuê người.

Tất cả những thứ trên, dưới dạng chữ, là mã nguồn - các file nằm trong thư mục, gom lại thành một repo (kho chứa toàn bộ dự án). Nhìn lướt một dự án Next.js cũng không đáng sợ:

cây thư mục một dự án Next.js (rút gọn) - nhìn để quen mặt, chưa cần thuộc

shop-cua-toi/
├── app/            # các trang & giao diện (frontend)
│   ├── page.tsx        # trang chủ
│   └── api/            # phần xử lý ẩn (backend)
├── public/         # ảnh, file tĩnh
├── package.json    # khai báo dự án & thư viện
└── next.config.js  # cấu hình Next.js

Khi làm việc, mèo con sẽ nghe ba từ: commit (một lần lưu mốc thay đổi), branch (nhánh để làm thử mà không đụng bản chính), và PR (pull request - lời đề nghị gộp thay đổi vào). Chưa cần thuộc; chỉ cần nhận ra chúng khi Claude hoặc GitHub nhắc tới - bài GitHub & vibe trên web/điện thoại sẽ cho dùng tay.

Vậy là mèo con có bản đồ: frontend (thấy), backend (xử lý), database (nhớ), gói lại thành repo, đặt lên VPS, gắn tên miền. Có bản đồ này, mô tả cho AI sẽ trúng hơn và mèo con không hoảng khi nó nhắc thuật ngữ.

Bước tiếp theo

Đủ lý thuyết. Bài kế ta mở Claude Code và dựng khung web bán hàng đầu tiên chạy ngay ở máy mình: Dựng app Next.js đầu tiên.

Câu hỏi thường gặp

Cả hai. Next.js vừa dựng giao diện cho trình duyệt (frontend), vừa chạy phần xử lý ẩn như kiểm tra đăng nhập hay trừ số dư (backend). Người ta gọi nó là framework full-stack vì gom được cả hai phía trong một dự án - tiện cho người vibe coding vì chỉ phải làm việc với một thứ.

Để mô tả cho AI cho chuẩn và để không hoảng khi nó (hoặc GitHub) nhắc tới "backend", "database", "deploy". Bạn không cần gõ được những thứ này; bạn cần đủ bản đồ trong đầu để ra quyết định và kiểm tra xem AI làm có hợp lý không.

Một file rời thì lưu được, nhưng tìm/sửa/khoá để nhiều người dùng cùng lúc mà không loạn thì rất khổ. Database (như PostgreSQL) sinh ra để làm đúng việc đó: lưu có tổ chức, tìm nhanh, cập nhật an toàn khi đông người. Bài "Lưu dữ liệu với PostgreSQL" sẽ đi sâu hơn.

Máy của bạn tắt là sản phẩm sập, và người ngoài cũng không gõ địa chỉ vào máy bạn được. VPS là một máy chủ thuê luôn bật, có địa chỉ công khai trên internet - nên ai cũng vào được mọi lúc. Bài deploy ở cuối khoá sẽ hướng dẫn dựng VPS bằng một lệnh.

Không. Ở bài này chỉ cần hiểu đại ý: commit là một lần lưu mốc thay đổi, branch là một nhánh để làm thử mà không đụng bản chính, PR là lời đề nghị gộp thay đổi vào. Bài "GitHub & vibe trên web/điện thoại" sẽ cho mèo con dùng tay.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Đâu là việc của FRONTEND?

Bài tập về nhà

  1. 1

    Dán nhãn frontend / backend

    Với 6 việc của web bán hàng (hiện danh sách hàng, kiểm mật khẩu, bấm nút "Mua", trừ số dư, đổi màu nút, lưu đơn vào database), gắn nhãn FE (frontend) hay BE (backend) cho từng cái.

    ✅ Hoàn thành khi: Mỗi việc có đúng một nhãn FE/BE; ví dụ: hiện danh sách & đổi màu nút & nút Mua = FE; kiểm mật khẩu, trừ số dư, lưu đơn = BE.

  2. 2

    Vẽ đường đi một request

    Khách bấm "Nạp tiền". Viết ra các chặng request đi qua, theo sơ đồ trong bài.

    ✅ Hoàn thành khi: Liệt kê đúng thứ tự: trình duyệt → (tên miền + HTTPS) → VPS → Nginx → Next.js → PostgreSQL, và dữ liệu trả về theo chiều ngược lại.

  3. 3

    Liệt kê dữ liệu cần nhớ

    Kể 5 thứ web bán hàng phải lưu trong database (để tắt máy mở lại vẫn còn).

    ✅ Hoàn thành khi: Có 5 mục hợp lý, ví dụ: tài khoản khách, số dư ví, danh sách sản phẩm, đơn hàng, lịch sử giao dịch nạp tiền.

  4. 4

    Hosting vs tên miền

    Viết một câu cho "hosting/VPS" và một câu cho "tên miền", rồi một câu vì sao cần cả hai.

    ✅ Hoàn thành khi: Phân biệt rõ: VPS là máy chạy sản phẩm (luôn bật); tên miền là địa chỉ để người ta tìm tới; thiếu một trong hai thì khách không vào được.

  5. 5

    Soi một repo trên GitHub

    Mở một kho mã công khai trên GitHub (ví dụ github.com/vercel/next.js) và chỉ ra: một thư mục, một file, và chỗ xem lịch sử commit.

    ✅ Hoàn thành khi: Chụp/ghi lại: tên một thư mục, tên một file, và số commit (hoặc trang "Commits") của kho - mèo con đã nhìn thấy repo/file/thư mục bằng mắt.

  6. 6

    Nhờ Claude giải phẫu dự án

    Mở Claude Code trong thư mục đã tạo ở bài 1, hỏi "giải thích cấu trúc thư mục dự án này cho người không rành kỹ thuật".

    ✅ Hoàn thành khi: Đọc lời giải thích và đối chiếu với sơ đồ trong bài: nhận ra đâu là phần giao diện, phần xử lý, phần cấu hình.