Trong kỷ nguyên React, Vue, Svelte, developer đã quen “JavaScript là chủ, HTML là phụ” — bundle 200KB+ JS chỉ để render một dynamic list. HTMX đưa triết lý ngược lại: HTML là giao diện chính, JS chỉ là enhancement. Thư viện 14KB (gzipped) cho phép bạn tạo hypermedia-driven apps chỉ với HTML attributes, không cần build tool, không cần virtual DOM, không cần client-side routing.
HTMX ra đời năm 2020 do Carson Gross phát triển, tác giả của Intercooler.js (phiên bản tiền nhiệm). Hiện đang được adopt bởi các team muốn đơn giản hóa stack: Django, Rails, Phoenix, Go templates.
Cách HTMX hoạt động: hypermedia over complex APIs
REST API trả JSON → frontend JS render HTML. HTMX đổi hướng: server trả trực tiếp HTML partials, client chỉ swap DOM fragment. Ví dụ:
Khi click button, HTMX gửi POST request, server trả HTML partial (một
hoặc
), HTMX chèn vào #task-list. Không cần fetch(), không cần innerHTML, không cần state management.
Cơ chế này hoạt động bằng cách sử dụng hypermedia như engine của ứng dụng. Thay vì server trả về JSON và client phải render lại UI, server trả về HTML fragment đã render sẵn. HTMX intercept các click, form submit, và thay thế chúng bằng AJAX request, sau đó swap kết quả vào DOM. Điều này loại bỏ hoàn toàn nhu cầu về client-side template rendering.
HTMX sử dụng các HTML attributes đặc biệt như hx-get, hx-post, hx-put, hx-delete để định nghĩa hành vi AJAX. Attributes hx-target và hx-swap điều khiển kết quả được chèn vào đâu và cách nào. Hệ thống attribute này tạo nên một declarative API hoàn toàn trong HTML, giúp developer dễ dàng hiểu và bảo trì code mà không cần nhảy qua lại giữa template và JavaScript logic.
HTMX request flow: button click → POST request → HTML partial response → DOM swap
Extensions: htmx-ext
HTMX core đủ cho 80% use cases. Phần 20% còn lại có thể xử lý bằng htmx-extensions:
ws: WebSocket support cho real-time updates.
sse: Server-Sent Events cho streaming.
loading-states: CSS class tự động thêm khi request pending.
preload: Prefetch links khi hover.
Extensions cài đặt như attribute bình thường: . Không cần build, không cần npm install.
So sánh HTMX với React, Vue, LiveView
Tiêu chí
HTMX
React
Phoenix LiveView
Client JS bundle
14KB (core)
40KB+ (React + ReactDOM)
0KB (server-driven)
Build tool
Không cần
Bắt buộc (Vite, webpack)
Không cần (Elixir only)
State management
HTML attributes
Redux, Zustand, Jotai…
Server process state
SSR
Mặc định (server render)
Cần Next.js, Remix
Mặc định
Real-time
Extensions (ws, sse)
React Query, Socket.io
Built-in (channels)
Learning curve
Thấp (1-2 ngày)
Trung bình
Cao (Elixir + OTP)
Sự khác biệt cốt lõi là HTMX xem HTML là format truyền tải state, trong khi React/Vue xem HTML là output của JavaScript. Với HTMX, state sống trên server (HTML được render từ server), client chỉ hiển thị và gửi user actions. Điều này đơn giản hóa mental model: không có two-way binding, không có virtual DOM diffing, không có hydration mismatch.
Code editor showing HTMX HTML attributes in VS Code
Khi nào dùng HTMX?
HTMX phù hợp nhất với:
CRUD apps: Admin dashboard, internal tools, CMS — phần lớn là form và table.
Legacy migration: Server-rendered app cần thêm interactivity mà không rewrite toàn bộ sang SPA.
Small team, big product: Một backend developer có thể handle cả server + UI.
HTMX không phù hợp cho: game, 3D visualization, heavy canvas drawing, real-time multiplayer với state phức tạp. Những use case này vẫn cần SPA framework.
Không cần useState, không cần useEffect, không cần npm run dev. Chỉ HTML + server.
Khi user click nút “Xóa”, HTMX gửi DELETE request đến /tasks/{{.ID}}. Server xử lý xóa trong database và trả về empty response. HTMX nhận response và thực hiện hx-swap="outerHTML" trên element li gần nhất, loại bỏ nó khỏi DOM. Toàn bộ logic chỉ trong template HTML và handler Go, không có một dòng JavaScript nào.
Để thêm task mới, bạn có thể dùng form với hx-post và hx-swap="afterbegin" để chèn task mới vào đầu list. Form submit sẽ được HTMX intercept, gửi qua AJAX, server tạo task mới và trả về HTML của task đó, HTMX chèn vào #task-list. User experience mượt mà như SPA nhưng code server-side hoàn toàn truyền thống.
Kết luận
HTMX không phải “React killer” — nó giải quyết một problem space khác. Khi bạn cần interactivity nhưng không cần heavy client-side logic, HTMX cho bạn productivity gấp 2-3 lần: không chọn framework, không config bundler, không xử lý hydration mismatch.
Triết lý “HTML over everything” đang quay lại, không phải vì developer thích retro, mà vì HTML đã đủ mạnh cho 90% UI patterns. Còn 10% còn lại — hãy dùng đúng tool cho đúng job.
Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.
Aider là gì? Aider là công cụ AI pair programming chạy trực tiếp trong terminal, cho phép developer làm việc song hành với LLM trên codebase của mình. Khác với…
pgvector là gì? pgvector là extension mở rộng cho PostgreSQL cho phép lưu trữ,chỉ mục và tìm kiếm vector embedding ngay trong database quen thuộc. Thay vì vận hành một…