

Trong thế giới web hiện đại, không còn nhiều ai chọn React hay Vue cho một trang web đơn giản – vì chúng tốn hàng chục MB bundle, require build pipeline phức tạp, và làm cho trang chậm tải. Hai công cụ HTMX và Alpine.js đang thay đổi cuộc chơi bằng cách mang lại trải nghiệm reactive ngay trong HTML thuần, không cần build, không bundle, và không compile.
HTMX (v4.0 mới nhất) cho phép truy cập trực tiếp AJAX, CSS Transitions, WebSockets và Server-Sent Events ngay từ HTML attributes. Alpine.js (được mô tả như “jQuery for the modern web”) cung cấp 15 attributes để xây dựng reactive behavior ngay trong markup. Kết hợp chúng, bạn có thể build cả một web app động mà không cần tới bundle bundler nào cả.
HTMX: Hypertext đã trọn cho modern web
Core attributes – 4 thuật ngữ bạn cần nhớ
htmx mở rộng HTML theo 4 trụ cột cơ bản:
- hx-trigger: Sự kiện kích hoạt (click, change, load, polling, websockets…)
- hx-get / hx-post / hx-put / hx-delete / hx-patch: HTTP verb gửi request
- hx-target: CSS selector phần tử nhận response
- hx-swap: Cách thay thế nội dung (innerHTML, outerHTML, beforeBegin, afterEnd…)

WebSockets & Server-Sent Events
Hơn cả AJAX, htmx hỗ trợ kết nối thời gian thực ngay trong HTML:
<div hx-ws="connect:/socket">
<span hx-ws-send>Ping</span>
<div id="messages" hx-ws-swap="innerHTML"></div>
</div>
Tương tự, SSE (Server-Sent Events) qua hx-sse attribute để nhận real-time updates từ server mà không cần polling.
Kích thước nhỏ, nhanh như gió
htmx chỉ ~16KB khi nén gzip – nhỏ hơn 67% so với React. Không có virtual DOM, không có reconciliation, chỉ là DOM manipulation thuần. Điều này làm cho trang tải nhanh hơn đáng kể, đặc biệt trên mobile và kết nối chậm.
Alpine.js: jQuery cho thời đại modern web
Cú pháp minimal – học trong 5 phút
Alpine.js cung cấp chỉ 15 attributes, 6 properties và 2 methods – đủ để xây dựng mọi interactive component:
<div x-data="{ open: false }">
<button @click="open = true">Expand</button>
<span x-show="open">Content here...</span>
</div>
Đây là toàn bộ code cần thiết cho một dropdown toggle. Không cần component, không cần state management, không cần build pipeline – chỉ cần thêm một <script> tag.
Alpine directives – nhanh chóng và trực quan
| Directive | Mô tả | Ví dụ |
|---|---|---|
x-data |
Khai báo component data | x-data="{ count: 0 }" |
x-bind / : |
Ràng buộc attribute | :class="active ? 'on' : ''" |
x-on / @ |
Lắng nghe sự kiện | @click="count++" |
x-model |
2-way binding input | x-model="search" |
x-show |
Toggle hiển thị | x-show="open" |
x-html |
Set innerHTML | x-html="content" |
Hòa hợp HTMX + Alpine.js – Tối ưu nhất cho trang web nhẹ
Khi nào nên dùng HTMX vs Alpine.js?
| Trường hợp | HTMX | Alpine.js |
|---|---|---|
| Load nội dung từ server | Better – dùng AJAX để fetch HTML fragment | Chỉ client-side |
| Interactive UI state (toggle, dropdown) | Hạn chế – cần AJAX round-trip | Better – reactive state ngay trong browser |
| Real-time WebSocket/SSE | Better – hỗ trợ built-in | Phải viết thủ công |
| Form validation trước submit | Không phù hợp | Better – client-side validation |
| Live search / autocomplete | Good – fetch từ server | Good – filter client-side |
Chiến lược kết hợp – HTMX cho server, Alpine cho client

Kết hợp HTMX + Alpine.js mang lại mô hình phân tách rõ ràng:
- HTMX: Chịu trách nhiệm fetch dữ liệu từ server, cập nhật DOM khi server trả về HTML fragment. Dùng cho navigation, pagination, form submit, real-time updates.
- Alpine.js: Chịu trách nhiệm xử lý interactive state ngay trên client (toggle menu, dark mode, form validation, animations). Không cần server round-trip.
Ví dụ thực tế: Shopping cart
<!-- Alpine.js: toggle cart dropdown -->
<div x-data="{ open: false }" class="cart">
<button @click="open = !open">🛒 Cart (0)</button>
<div x-show="open" hx-get="/cart/items" hx-trigger="open" hx-swap="innerHTML">
<span>Loading...</span>
</div>
</div>
Trong ví dụ này, Alpine.js quyết định thời điểm dropdown mở/đóng (client-side, instantaneous), trong khi HTMX fetch nội dung giỏ hàng từ server chỉ khi dropdown thực sự mở ra – tối ưu cả tốc độ và số lượng request.
Benchmark: HTMX + Alpine vs React SPA

| Metric | HTMX + Alpine | React (Create React App) |
|---|---|---|
| Bundle size (gzip) | ~22KB | ~150KB+ |
| Thời gian render đầu tiên | 20-50ms | 200-500ms+ |
| First Contentful Paint | ~500ms | ~1500ms |
| TTFB (Server-rendered) | ~100ms | ~200ms+ |
| Số lượng JS files | 2 (htmx + alpine) | 10+ |
Với cùng một trang web đơn giản, HTMX + Alpine.js cho phép giảm 85% kích thước bundle và tăng tốc FCP gấp 3x so với React SPA truyền thống.
Kết luận – Khi nào nên chuyển đổi?
HTMX + Alpine.js không phải là “silver bullet” cho mọi dự án – nhưng chúng rất phù hợp cho:
- Marketing pages, landing pages: không cần interactivity phức tạp, bundle nhỏ = SEO tốt
- Admin dashboards: form-heavy, server-rendered, Alpine cho interactive widgets
- Progressive enhancement: Thêm Alpine vào trang HTML tĩnh để làm interactive, dùng HTMX cho AJAX khi cần
- Team không có JS framework expert: HTML + attributes dễ học và maintain hơn JSX/TypeScript phức tạp
Nếu bạn đang xây dựng một trang web nhỏ đến vừa, thay vì bỏ 3 tuần học React hooks hay Vue composables – hãy thử HTMX + Alpine.js. Bạn sẽ dư sức hoàn thành trong 3 tiếng, bundle chỉ ~22KB, và trang load nhanh như ý.
Nguồn: HTMX Official, Alpine.js Official Docs, HTMX Documentation
