HTMX: HTML-first web development framework

HTMX là gì? HTML-first web development framework

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-targethx-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 diagram showing button click to POST request to HTML partial response to DOM swap
    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
    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.

    Ví dụ thực tế: Todo app với HTMX + Go

    Server Go render template:

    func listTasks(w http.ResponseWriter, r *http.Request) {
        tasks := db.GetTasks()
        tmpl.ExecuteTemplate(w, "task_list.html", tasks)
    }

    Template task_list.html:

      {{range .}}
    • {{.Title}}
    • {{end}}

    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-posthx-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.

    Nguồn tham khảo: HTMX docs, Carson Gross blog, Phoenix LiveView comparison, “Hypermedia Systems” book.

  • 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.

    Bài viết liên quan

    Aider là gì? AI pair programming công cụ coding trong terminal miễn phí

    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…

    Xem thêm

    Zig ngôn ngữ lập trình hệ thống thay thế C cho hiệu năng cao

    Zig là gì và tại sao developer quan tâm? Zig là ngôn ngữ lập trình hệ thống được tạo bởi Andrew Kelley nhằm thay thế C trong các dự án…

    Xem thêm

    PostgreSQL pgvector: Tìm kiếm vector similarity trong database quen thuộc

    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…

    Xem thêm
    0 0 đánh giá
    Article Rating
    Theo dõi
    Thông báo của
    guest
    0 Comments
    Cũ nhất
    Mới nhất Được bỏ phiếu nhiều nhất