Hotwire: Công nghệ HTML over the wire
(hotwired.dev)- Hotwire là một cách tiếp cận để xây dựng ứng dụng web hiện đại bằng cách truyền HTML thay vì JSON, hướng tới lần tải đầu nhanh và tính phản hồi tốt mà không cần nhiều JavaScript
- Vì việc render được giữ lại ở template phía máy chủ, quy trình phát triển có thể được duy trì đơn giản bất kể ngôn ngữ sử dụng
- Các framework do 37signals tạo ra cho HEY được kết hợp với nhau, tạo thành hệ sinh thái Hotwire trải dài từ web đến nhiều nền tảng khác
- Thành phần cốt lõi là Turbo xử lý chuyển trang, gửi form, tách component và cập nhật từng phần dựa trên WebSocket mà không cần viết JavaScript
- Những tương tác tùy chỉnh mà Turbo chưa đáp ứng đủ sẽ được Stimulus bổ sung, còn Hotwire Native cho phép tạo ứng dụng di động native dựa trên ứng dụng web hiện có
Cách tiếp cận render HTML trên máy chủ rồi gửi đi
- Hotwire là một cách tiếp cận thay thế để xây dựng ứng dụng web hiện đại theo kiểu HTML-over-the-wire
- Thay vì JSON, nó truyền HTML qua mạng, giúp xây dựng ứng dụng mà không cần nhiều JavaScript
- Mục tiêu là tải trang đầu tiên nhanh, duy trì render template phía máy chủ, và mang lại trải nghiệm phát triển đơn giản, hiệu quả hơn
- Đây là hướng đi không đánh đổi tốc độ và tính phản hồi thường được kỳ vọng ở các ứng dụng một trang truyền thống
- HTML-over-the-wire có thể được dùng như một cách tham khảo để tự xây dựng công cụ, hoặc có thể dùng trực tiếp các framework Hotwire mà 37signals đã tạo cho HEY
Vai trò của Turbo, Stimulus và Hotwire Native
- Turbo là thành phần cốt lõi của Hotwire
- Cung cấp các kỹ thuật bổ trợ để xử lý nhanh việc chuyển trang và gửi form
- Chia các trang phức tạp thành component và stream các cập nhật từng phần của trang qua WebSocket
- Cung cấp các tính năng này mà không cần viết JavaScript
- Stimulus được dùng khi cần mã tùy chỉnh mà chỉ Turbo thôi là chưa đủ
- Turbo thường xử lý được ít nhất 80% các tương tác vốn trước đây cần JavaScript
- Stimulus cho phép xử lý trạng thái và kết nối theo cách lấy HTML làm trung tâm
- Hotwire Native là framework ưu tiên web để tạo ứng dụng di động native
- Cung cấp các công cụ cần thiết để xây dựng ứng dụng di động bằng cách tận dụng ứng dụng web hiện có
1 bình luận
Ý kiến trên Hacker News
Có một phiên bản ít được marketing hơn của chức năng này là htmx: https://htmx.org/
Nó cho phép làm những việc như vậy chỉ với một file JavaScript, và tôi thường thấy nó được dùng cùng backend Go, nhưng trông có vẻ khá linh hoạt. Tôi đã nghĩ sẽ thử dùng nó từ khoảng một năm trước
Chỉ trong năm qua đã có hàng trăm bài gửi lên HN 0, và cũng có bài vượt 1000 điểm. Trong khi đó Hotwire có chưa đến 30 bài gửi trong năm qua 1, và bài phổ biến nhất trong số đó chính là bài này
Chỉ cần lướt YouTube một chút cũng thấy các influencer lập trình liên tục đẩy htmx lên, kèm thumbnail có mặt họ
Twitter cũng rất sôi động, nó thường xuyên xuất hiện trên kênh YouTube của The Primeagen và khá phổ biến
Nếu tìm thứ tương tự trong PHP/Laravel, tôi rất khuyến nghị Livewire: https://laravel-livewire.com/
Với các dự án phức tạp hơn tôi vẫn dùng React, nhưng việc có thể viết toàn bộ bằng Blade/PHP trong khi vẫn duy trì các thành phần UI phản ứng luôn đem lại cảm giác mới mẻ. Tôi nhớ từng thấy một package cho phép render component React/Vue bên trong Livewire khi cần: https://minglejs.unitedbycode.com/. Nó trông như một lối thoát thú vị khi cần kéo các package hiện có vào
Trước đây tôi khá tiêu cực với Hotwire/Livewire, nhưng giờ tôi xem chúng là công cụ phù hợp tùy hoàn cảnh
Gửi partial template qua wire là cách tiếp cận hypermedia, chỉ là ngày nay chúng ta không còn thường xây dựng ứng dụng hypermedia tốt nữa. Tôi đi đến đây sau khi đọc lại htmx và bài luận REST của RTF; tôi không cho rằng hypermedia về bản chất là một kiến trúc ưu việt hơn, nhưng nó là một lựa chọn chính đáng ngang hàng giữa nhiều lựa chọn, và thật tốt khi nó vẫn tiếp tục tiến hóa, dù chậm
Đây gần như là cách dễ nhất để tạo PWA mà không rơi vào hố thỏ React/Vue/Svelte
Tôi cũng đã dùng những thứ đó và nghĩ chúng rất tuyệt, nhưng so với htmx thì chúng có cảm giác thiên về trải nghiệm nhà phát triển hơn là lấy công nghệ làm trung tâm. Cuộc cạnh tranh giữa chúng rốt cuộc có lẽ sẽ phụ thuộc vào việc tích hợp tốt hơn với backend framework nào
Cá nhân tôi cho rằng PWA là vấn đề phía client, và nên xử lý ở phía client thay vì thêm phụ thuộc vào server
Cuộc thảo luận trên HN năm 2020, gần thời điểm thứ này lần đầu xuất hiện hơn, ở đây: https://news.ycombinator.com/item?id=25507942
Các bài liên quan gồm Why Hotwire Could be the Future of Front-end Dev - https://news.ycombinator.com/item?id=26195969 - tháng 2/2021, 6 bình luận / Hotwire: A new old way to build web apps - https://news.ycombinator.com/item?id=25942864 - tháng 1/2021, 56 bình luận
Cảm giác như gần như đã đi một vòng. Tôi nhớ khoảng năm 2005 hay 2006, chúng tôi chặn các cú nhấp, gắn thêm tham số, chỉ nhận về mảnh HTML đã render rồi thay phần nội dung bằng
.innerHTMLMẹo là giữ HTTP request mở liên tục và thỉnh thoảng server gửi cập nhật xuống, mà các cập nhật đó cũng là HTML. Khi ấy có khi còn chưa thao tác DOM được, nên có thể đúng nghĩa là một trang có các thẻ không bao giờ đóng
Các framework render phía server đang làm cho tương tác phía client dễ hơn, còn React thông qua RSC đang làm cho render phía server dễ hơn. Nếu là web app có mức độ tương tác rất cao thì SPA vẫn có lợi thế
Dù có rất nhiều dự án SPA, điều đó không mô tả toàn bộ mọi website trên đời
Pagination được triển khai kiểu: khi cuộn xuống và bấm “Show more”, nó yêu cầu trang tiếp theo từ server dưới dạng mảnh HTML, tải vào một iframe ẩn, rồi sau khi tải xong thì gắn vào trang hiện tại
Nghĩ đến việc web, JavaScript và TypeScript đã tốt lên rất nhiều trong thời gian đó, thật khó để hào hứng trở lại với cách tiếp cận này
Tôi không xử lý nhiều web app cần frontend tương tác cao, nhưng trong các cửa hàng thương mại điện tử và app Rails nội bộ, Turbo và Stimulus đã giảm đáng kể lượng kiến thức mà lập trình viên mới phải học
Ví dụ, trong một dự án Django, chúng tôi dùng KnockoutJS đã được kiểm chứng để nhanh chóng dựng trọn một công cụ văn phòng, và điều này cũng phần nào gần với tinh thần của HTMX. Arrow.JS, dù còn sớm, cũng tương tự. Độ phức tạp, đặc biệt là độ phức tạp ở UI, phần lớn là do chính chúng ta tạo ra; cách làm cũ hoàn toàn không lỗi thời mà còn đang quay lại. Có cả một thế hệ lập trình viên trẻ bước vào ngành đúng vào giai đoạn ngớ ngẩn nhất, khi ngành này thuyết phục mọi người rằng mọi ứng dụng web đều phải bị biến thành một khối quá phức tạp và khó chịu đựng
Tôi đã trả phí dùng Hey từ lúc ra mắt, và nếu trải nghiệm web app của Hey là case tốt nhất của Hotwire thì xin cho tôi từ chối
Nó tệ trên kết nối chậm. Có thể là do lập trình viên không thêm trạng thái loading hay trạng thái lỗi, có thể do độ phức tạp lớn, cũng có thể là bug của Hey. Tôi không biết, nhưng không hay chút nào
Với độ trễ từ trung bình đến cao, hành vi trở nên khó đoán hoặc giống bug. Những hộp không có nội dung mở ra, link không hoạt động như kỳ vọng, và khi thực hiện nhiều thao tác nhanh liên tiếp thì chúng không bị hủy theo cách trực quan. Cảm giác đơn giản là lệch nhịp
Dù SPA có tệ đến đâu, cái này có vẻ là một bước lùi so với hướng làm UI có cảm giác native và tự nhiên
Lý do bài này nổi lại bây giờ là vì tuần trước có người đăng rằng Hey mở modal chậm: https://x.com/noahflk/status/1795758603577545035
Hey do DHH tạo ra, và DHH cũng tạo ra Hotwire cùng Rails. Sau đó mọi thứ trở thành một cuộc tranh luận nóng, trộn lẫn giữa phản bác của DHH rằng video gốc được quay trên mạng bị giới hạn, phản ứng rằng nếu modal mất thời gian để tải thì Hotwire phụ thuộc quá nhiều vào mạng, các bên bênh vực Rails/Hotwire, và các ý kiến phản đối cách tiếp cận này. Đây là chủ đề lớn trên Twitter tuần trước
Tác giả cũng viết rằng “cố tình làm chậm để trình diễn”: https://x.com/noahflk/status/1795855075526471915. Người đó nói không nhằm cho thấy trải nghiệm của người dùng “MacBook tốt ở SF với Internet gigabit”, mà muốn nói về người dùng Internet di động chậm và laptop rẻ. Cũng có người chỉ ra rằng SPA Google Calendar còn chậm hơn nhiều, và lựa chọn không chỉ có “Internet gigabit ở SF” với “3G bị giới hạn mạnh”. Bài đăng gốc rất dễ gây hiểu lầm, thực tế gần như là nói dối
Đặc biệt cấu trúc trang rất ấn tượng. Ví dụ, overlay menu ngữ cảnh áp dụng tổ hợp
details/summary/anchortheo hướng progressive enhancement, và kể cả khi tắt JavaScript hoặc asset không tải được, nó vẫn tải nội dung menu một cách thanh lịch bằng layout đơn giản. Ngoài ra còn nhiều chỗ dùng Web API rất cẩn trọng, và tôi nhớ mã client gần như không bị obfuscate, lại có kèm source map. Tôi không phải fan của DHH và cũng không định theo dõi drama tuần đó, nhưng lần này tôi cảm thấy 37signals đã làm đúngTôi đã tạo Swap JS, một bản triển khai tối giản hơn của cùng ý tưởng, cách đây 2 năm: https://github.com/josephernest/Swap
Đã thử dùng trong vài dự án và nó hoạt động tốt