Framework là gì? React, Vue, Next.js — bộ Lego cho lập trình viên
Framework là 'bộ Lego dựng sẵn' của lập trình — thay vì code từ con số 0, dev ghép các block có sẵn. Hiểu khi nào cần framework, framework nào phù hợp dự án, và sao Next.js + React đang chiếm 60% web 2026.
Mục lục bài viết(18)

Framework như bộ Lego — mỗi block là một component có sẵn (form, modal, route, state management), bạn ghép lại thành app. Code từ con số 0 = nặn đất sét; dùng framework = ráp Lego. Cùng ra sản phẩm nhưng nhanh hơn 5-10 lần. Nguồn: Wikimedia Commons (CC BY-SA 3.0).
Hiểu đơn giản nhất
Framework là bộ công cụ + cấu trúc + quy tắc lập trình dựng sẵn — bạn KHÔNG phải viết từ con số 0. Tương tự như khi mua tủ:
| Cách | Thời gian | Phù hợp |
|---|---|---|
| Tự đóng từ gỗ thô | 2-4 tuần | Thợ lành nghề, tủ unique |
| Mua tủ IKEA ráp tại nhà | 1-2 giờ | Đại đa số người dùng |
| Mua tủ làm sẵn ráp sẵn | 30 phút lắp đặt | Cần ngay, không muốn động tay |
Code web cũng vậy:
- Vanilla JS (không framework) = đóng tủ từ gỗ thô — full control nhưng chậm
- Framework (React, Vue, Next.js) = mua IKEA — quy tắc rõ ràng, build nhanh
- CMS (WordPress, Shopify) = mua tủ làm sẵn — không động đến code
Framework cung cấp: routing (router — định tuyến URL — đi từ trang A sang B), state management (state — trạng thái dữ liệu — nhớ user đang đăng nhập), components có sẵn (component — khối UI tái sử dụng — form, modal, button), build tool (build — biên dịch + đóng gói code — gộp file, minify, đẩy lên hosting).
Tại sao bạn cần biết
- Hiểu báo giá agency. "Build Next.js" khác "build React thuần" khác "build với Astro" — chi phí và performance khác nhau.
- Tránh chọn nhầm framework. WordPress cho SaaS (Software as a Service — phần mềm dạng dịch vụ) phức tạp = đau khổ. React cho landing page 5 trang = overkill, load chậm.
- Đọc CV dev có nghĩa. "Senior React/Next.js" vs "Vue/Nuxt" vs "Svelte" — biết người này phù hợp dự án của bạn không.
- Hiểu hệ sinh thái. Mỗi framework có "thế giới" riêng — npm package, agency, community. Chọn framework lớn = dễ tìm dev khi expand.
Framework có gì
Một framework đầy đủ bao gồm 6 thành phần:
| Thành phần | Vai trò | Ví dụ trong Next.js |
|---|---|---|
| Routing | URL /about → trang About.tsx | Folder app/about/page.tsx |
| State management | Lưu data tạm (user, giỏ hàng) | useState, useContext, Zustand |
| Components | Block UI tái sử dụng | <Button>, <Modal>, <Form> |
| Data fetching | Lấy data từ API | fetch(), server components |
| Build tool | Gộp file, optimize | Turbopack, Webpack |
| Dev experience | Hot reload, error overlay | pnpm dev thay đổi thấy ngay |
Code vanilla phải tự build 6 thứ này từ đầu — mất 2-4 tuần. Framework có sẵn → bắt đầu code business logic ngay.
7 framework JS phổ biến nhất 2026
| Framework | Tạo bởi | Năm | Đặc điểm | Phù hợp với |
|---|---|---|---|---|
| React | 2013 | Component-based, JSX | Mặc định cho mọi dự án mới | |
| Next.js | Vercel | 2016 | Full-stack React, server components, SSR/SSG | SaaS, e-commerce, blog |
| Vue | Evan You | 2014 | Đơn giản hơn React, Trung Quốc + VN ưa | Web vừa, team junior |
| Nuxt | Sébastien Chopin | 2016 | Full-stack Vue như Next.js với React | Tương tự Next.js nhưng team Vue |
| Svelte / SvelteKit | Rich Harris | 2016 / 2020 | Compile-time, không runtime, bundle nhỏ | Web tối ưu performance |
| Astro | Fred Schott | 2021 | Multi-framework, ship 0 JS mặc định | Landing page, blog, marketing site |
| Angular | 2016 | "Battery included", TypeScript bắt buộc | Doanh nghiệp lớn, dự án nhiều dev |
Thị phần năm 2026 (theo State of JS Survey)
- React + Next.js: ~58%
- Vue + Nuxt: ~16%
- Svelte: ~8%
- Astro: ~7%
- Angular: ~7%
- Khác (Solid, Qwik, Remix): ~4%
VietCodex dùng Next.js + Tailwind + shadcn/ui mặc định — vì cộng đồng lớn nhất, dễ thuê dev kế nhiệm.
Framework có lợi gì cụ thể
Lợi 1: Nhanh hơn 5-10 lần
Build login form với vanilla JS = 200-500 dòng code (validate, error handling, API call, store token, redirect). Với Next.js + Supabase Auth = 20 dòng + 1 component có sẵn.
Lợi 2: Quy tắc rõ ràng, ít bug
Framework ép bạn theo pattern (folder structure, naming, lifecycle). Code 2 dev khác nhau viết vẫn nhất quán → đọc, sửa, mở rộng dễ.
Lợi 3: Có team support khi cần
Hỏi câu khó về React → 5 triệu kết quả Google, ChatGPT/Claude trả lời được. Hỏi về framework hiếm → khó tìm.
Lợi 4: Có agency + dev support
Cần build app Next.js → 100+ agency VN làm được, 1000+ dev freelance. Cần build app SvelteKit → 5-10 agency, 50 dev VN.
Lợi 5: Tích hợp tool sẵn
Vercel deploy Next.js 1-click. AWS Amplify deploy React 1-click. Mọi build tool, analytics, CDN đều ưu tiên support framework lớn.
Khi nào KHÔNG nên dùng framework
| Trường hợp | Lý do | Thay thế |
|---|---|---|
| Landing page 1 trang | Framework JS thêm 100-500KB không cần | HTML/CSS thuần hoặc Astro |
| Internal tool 1 lần dùng | Không có "long-term maintain" | Retool, Bubble, Webflow |
| Học programming cơ bản | Framework che mất concept underlying | Vanilla JS để hiểu DOM, async, scope |
| Web cực kỳ tối ưu performance | Mỗi KB tính tiền (gaming, IoT, embedded) | Vanilla hoặc framework siêu nhẹ (Preact, Alpine) |
| MVP < 1 tuần test ý tưởng | Setup framework mất thời gian | No-code (Webflow, Carrd, Bubble) |
Quy tắc: framework là đầu tư — học 1-2 tháng để tiết kiệm hàng năm. Nếu dự án < 1 tuần, không đáng học framework.
Ví dụ thực tế: build form đăng ký với + không framework
Yêu cầu: form có 3 field (email, password, full name), validate, gửi API tạo user, hiển thị success/error.
Cách 1: Vanilla HTML + JS thuần (~150 dòng)
<form id="register-form">
<input name="email" type="email" required />
<input name="password" type="password" minlength="8" required />
<input name="fullName" required />
<div id="error" class="error" style="display:none"></div>
<button type="submit">Đăng ký</button>
</form>
<script>
const form = document.getElementById("register-form");
const errorEl = document.getElementById("error");
form.addEventListener("submit", async (e) => {
e.preventDefault();
errorEl.style.display = "none";
const formData = new FormData(form);
const data = Object.fromEntries(formData);
// Custom validation
if (data.password.length < 8) {
errorEl.textContent = "Password tối thiểu 8 ký tự";
errorEl.style.display = "block";
return;
}
// Loading state
const btn = form.querySelector("button");
btn.disabled = true;
btn.textContent = "Đang xử lý...";
try {
const res = await fetch("/api/register", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
});
const result = await res.json();
if (res.ok) {
window.location.href = "/welcome";
} else {
errorEl.textContent = result.error || "Đăng ký thất bại";
errorEl.style.display = "block";
}
} catch (err) {
errorEl.textContent = "Lỗi mạng, thử lại";
errorEl.style.display = "block";
} finally {
btn.disabled = false;
btn.textContent = "Đăng ký";
}
});
</script>Thời gian dev: 2-4 giờ (gồm test).
Cách 2: Next.js + react-hook-form + Zod validation (~50 dòng)
"use client";
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
const schema = z.object({
email: z.string().email(),
password: z.string().min(8),
fullName: z.string().min(1),
});
export default function RegisterForm() {
const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm({
resolver: zodResolver(schema),
});
const onSubmit = async (data) => {
const res = await fetch("/api/register", {
method: "POST",
body: JSON.stringify(data),
});
if (res.ok) window.location.href = "/welcome";
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("email")} placeholder="Email" />
{errors.email && <span>{errors.email.message}</span>}
<input {...register("password")} type="password" placeholder="Password" />
{errors.password && <span>{errors.password.message}</span>}
<input {...register("fullName")} placeholder="Full name" />
<button disabled={isSubmitting}>
{isSubmitting ? "Đang xử lý..." : "Đăng ký"}
</button>
</form>
);
}Thời gian dev: 30-45 phút.
Kết quả
| Tiêu chí | Vanilla | Next.js + libraries |
|---|---|---|
| Dòng code | ~150 | ~50 |
| Thời gian dev | 2-4 giờ | 30-45 phút |
| Validation | Tự viết | Schema-based, type-safe |
| Error handling | Tự viết | Auto từ form library (thư viện code có sẵn) |
| Maintainability | Khó nếu form phức tạp hơn | Pattern rõ ràng, scale tốt |
| Bundle (gói code gửi browser) size | ~5KB | ~80KB (React + react-hook-form + Zod) |
| Phù hợp với | Web tĩnh, ít form | SaaS, dashboard, nhiều form |
Cùng kết quả, dùng framework tiết kiệm 75-85% thời gian đổi lấy 75KB JS thêm.
Tóm tắt 1 dòng
Framework = bộ Lego dựng sẵn cho lập trình. Next.js + React chiếm 58% web 2026, Vue/Nuxt 16%, Astro lên nhanh cho landing/blog. Nhanh hơn vanilla 5-10x nhưng thêm 50-200KB JS — chỉ nên dùng khi dự án có > 5 trang hoặc có state phức tạp.
Đọc tiếp
- HTML, CSS, JavaScript — 3 ngôn ngữ tạo nên mọi website — nền tảng phải biết TRƯỚC khi học framework
- Frontend vs Backend khác nhau ở đâu — framework có cả frontend và backend, mỗi loại có ecosystem riêng
- API là gì? Tại sao mọi app đều cần — framework giúp viết REST/GraphQL API trong vài dòng
- Web hoạt động thế nào — hành trình 200ms — framework ảnh hưởng bước 5 (render) nhiều nhất