16 điểm bởi GN⁺ 2025-10-12 | 1 bình luận | Chia sẻ qua WhatsApp
  • Datastar là một framework nhẹ có thể dùng để xây dựng từ website tĩnh đơn giản đến ứng dụng web cộng tác thời gian thực, và có thể bắt đầu chỉ bằng cách thêm một thẻ script vào HTML
  • Dự án áp dụng cách tiếp cận hypermedia-first mở rộng HTML để tạo UI tương tác lấy backend làm trung tâm
  • Tương tự htmx ở khả năng phản hồi phía backend, đồng thời cũng hỗ trợ tính phản ứng phía frontend như Alpine.js, và hoạt động không cần gói npm hay phụ thuộc nào
  • Ở frontend, hành vi phản ứng được triển khai bằng các thuộc tính chuẩn data-*, còn ở backend, chỉnh sửa DOM và thay đổi trạng thái được thực hiện thông qua các sự kiện
  • Với cập nhật thời gian thực dựa trên SSE (Server-Sent Events) và SDK cho nhiều ngôn ngữ, Datastar hướng đến mục tiêu đơn giản hóa việc phát triển ứng dụng web reactive do backend dẫn dắt

Tổng quan về Datastar

  • Datastar là framework dựa trên hypermedia mở rộng HTML, có cấu trúc cho phép hiện thực ứng dụng web tương tác thời gian thực bằng cách thao tác DOM trực tiếp từ backend
  • Ở phía trình duyệt, chỉ cần tải một script dung lượng 10.7KB là toàn bộ tính năng được kích hoạt, không cần cài công cụ build hay framework
  • Kế thừa nguyên tắc của Hypermedia Systems, máy chủ dẫn dắt trạng thái của UI và phía client phản ánh lại trạng thái đó một cách reactive
  • Bằng cách xử lý cập nhật dữ liệu, thay đổi trạng thái, và vá DOM (patching) bằng các sự kiện từ backend, Datastar giảm thiểu logic phía frontend

Cách cài đặt

  • Cách đơn giản nhất là thêm script qua CDN như sau
  • Hoặc có thể tải trực tiếp tệp về hay dùng Datastar bundler để tự tạo bundle riêng
  • Hoàn toàn không cần cài npm hay thiết lập môi trường Node

Thuộc tính data-* và tính phản ứng

  • Cốt lõi là định nghĩa hành vi theo kiểu khai báo thông qua thuộc tính data-* của HTML
    • Ví dụ: data-on-click="alert('Hello!')"
  • Thuộc tính data-on chỉ định biểu thức Datastar sẽ chạy khi một sự kiện cụ thể xảy ra, và tại đây cũng có thể dùng JavaScript thông thường
  • Dự án cung cấp tự động hoàn thành và hỗ trợ cú pháp thông qua extension VSCodeplugin IntelliJ chuyên dụng

Vá DOM theo hướng backend dẫn dắt

  • Datastar hoạt động theo cách máy chủ dẫn dắt frontend
    • Khi máy chủ gửi một mảnh HTML, Datastar sẽ hợp nhất nó vào DOM bằng chiến lược morphing
    • Morphing chỉ cập nhật phần thay đổi để giữ nguyên trạng thái và cải thiện hiệu năng
  • Ví dụ:
    <button data-on-click="@get('/endpoint')">Open the pod bay doors, HAL.</button>  
    <div id="hal"></div>  
    
    Khi máy chủ trả về một mảnh HTML, Datastar sẽ tự động thay thế phần tử id="hal"

Streaming dựa trên Server-Sent Events (SSE)

  • Máy chủ có thể gửi sự kiện datastar-patch-elements để cập nhật DOM theo thời gian thực

  • Ví dụ sau sẽ hiển thị lời thoại của HAL rồi khởi tạo lại sau 1 giây

    event: datastar-patch-elements  
    data: elements <div id="hal">I’m sorry, Dave. I’m afraid I can’t do that.</div>  
    
    event: datastar-patch-elements  
    data: elements <div id="hal">Waiting for an order...</div>  
    
  • Để hỗ trợ việc này, Datastar cung cấp SDK cho nhiều ngôn ngữ khác nhau:

    • Clojure, C#, Go, Java, Kotlin, PHP, Python, Ruby, Rust, Node.js
    • Mỗi SDK phát các sự kiện vá DOM thông qua lớp PatchElements hoặc ServerSentEventGenerator

Datastar Inspector và công cụ

  • Ngoài công cụ dành cho nhà phát triển trên trình duyệt, bạn còn có thể dùng Datastar Inspector để xem trực quan các sự kiện SSE
  • Ngoài tài liệu chính thức, dự án còn cung cấp nhiều tài nguyên phong phú như DeepWiki do AI tạo, mẫu mã cho LLM, và tài liệu một trang

Kết luận

  • Datastar là một cách tiếp cận hiện đại nhằm đơn giản hóa việc phát triển ứng dụng hypermedia lấy HTML làm trung tâm
  • Nhẹ hơn các framework SPA truyền thống và mang lại trải nghiệm phát triển phản ứng cân bằng giữa backend và frontend
  • Phù hợp với các dự án cần streaming thời gian thực, điều khiển UI lấy máy chủ làm trung tâm, và triển khai không phụ thuộc

1 bình luận

 
GN⁺ 2025-10-12
Ý kiến trên Hacker News
  • Đội ngũ vận hành Datastar là những người rất rõ ràng về niềm tin và triết lý, đồng thời cũng rất hào phóng dành thời gian cho cả người mới; giữa những tranh cãi quanh phiên bản Pro, điều này đang bị quên lãng, nhưng đây tuyệt đối không phải chiến lược kiếm tiền và công ty được đăng ký phi lợi nhuận; họ chỉ tách những tính năng mà chỉ một số ít người cần sang Pro, vì chủ yếu chính nhóm nhỏ muốn các tính năng đó là những người hay liên hệ nhất, làm gánh nặng hỗ trợ tăng lên, nên đây là cách kiểm soát hiệu quả hơn; ngược lại, đây là một cách tiếp cận sáng tạo và công bằng để (a) báo hiệu rằng đó là những tính năng "dễ gây vướng víu", (b) khiến những người cần nhiều hỗ trợ nhất hoặc nhận được nhiều giá trị từ Datastar trả một khoản nhỏ, và (c) giúp dành nhiều thời gian hơn cho toàn bộ cộng đồng, nên là tác động tích cực

    • Nếu các tính năng như data-animate, data-on-resize, data-scroll-into-view mà bị xem là "dễ gây vướng víu" thì tức là thiết kế chưa ổn; tôi cũng không nghĩ đó là những tính năng chỉ thiểu số mới cần; họ muốn thu phí cho thứ mình muốn thì không sao, nhưng tôi không nghĩ cần phải bịa ra cái cớ như vậy

    • Tôi tò mò không biết tính năng copy-to-clipboard có thực sự là loại tính năng tạo gánh nặng hỗ trợ lớn hay không; nếu mức độ của Datastar thực sự tệ đến vậy, đến cả tính năng đơn giản cũng cần nhiều hỗ trợ mới chạy ổn, thì tôi khó mà đồng ý

  • Nếu bạn nghĩ Datastar không đủ cho realtime/cộng tác/multiplayer hoặc cho rằng nhất định phải cần tính năng Pro, hãy tham khảo 3 bản demo đã trụ được trên trang chính HN, chạy trên VPS 5 đô mà không cần tính năng Pro, để thấy Datastar đúng là một thành tựu kỹ thuật rất ấn tượng

    • https://checkboxes.andersmurphy.com/

    • https://cells.andersmurphy.com/

    • https://example.andersmurphy.com/ (Game of Life nhiều người chơi)
      Trong các ví dụ checkboxes/cells, việc render view được điều chỉnh thích ứng nên có thể zoom out khá nhiều, và virtual scroll cũng có back pressure

    • Dù nói là đã trụ được trên trang chính HN, nhưng ngay màn hình đầu tiên đã có dòng chữ rất to "bring your own backend", nên không phải là nó trụ được là nhờ Datastar

  • Thông tin về các thread thảo luận HN liên quan đang diễn ra:

  • Tôi không hiểu vì sao cộng đồng lại thù địch đến vậy; Datastar phần lớn là mã nguồn mở, chạy được với bất kỳ ngôn ngữ nào, và cũng là một dự án thú vị ở chỗ nó đang suy nghĩ cách gây quỹ phát triển; tôi nghĩ việc họ đẩy dự án của mình theo cách họ muốn là điều hoàn toàn bình thường; tôi cũng định thử nghịch với golang, và cảm ơn vì công sức bỏ ra; chỉ có một góp ý là theo mặt bằng nước tôi thì 299 đô là số tiền cực lớn, trong khi một số tính năng Pro có thể là bắt buộc, nên mức giá này quá nặng; tôi mong họ cân nhắc chính sách giá động theo quốc gia như Steam hoặc hỗ trợ theo dạng quyên góp; các tính năng như animation đã được sveltekit cung cấp miễn phí, không phải tôi muốn dùng chùa mà là thật sự không kham nổi; sẽ tốt hơn nếu áp giá cao hơn cho doanh nghiệp và rẻ hơn cho solo developer; trước giờ tôi chưa từng trả tiền cho cộng đồng hay dự án online nào, nhưng với Datastar thì nếu ở mức 5~10 đô tôi sẵn sàng ủng hộ; tôi chỉ mong giá gói solo hạ xuống cỡ một game switch (silksong) là được; đây là một dự án thật sự rất hay, nên tôi thấy tiếc khi phản ứng của cộng đồng lại chỉ trích đến mức kỳ lạ như vậy

    • Đây có vẻ là lời phê bình hợp lý duy nhất trong toàn bộ cuộc thảo luận tới lúc này; 299 đô thực sự là mức giá ngoài tầm với của rất nhiều người; tuy vậy, so với việc các nhà phát triển sống ở những nước có chi phí sinh hoạt cao và đang cung cấp giá trị lớn hơn, số tiền đó có thể vẫn là nhỏ; ý tưởng áp dụng giá theo từng quốc gia là hay, nhưng cách triển khai thì rắc rối và lợi ích thực tế có thể không đáng kể; các tính năng mã nguồn mở miễn phí hiện đã cung cấp hơn 95% giá trị và chức năng, nên với đa số người không thực sự cần giấy phép Pro, cứ thoải mái dùng miễn phí, học hỏi hoặc hưởng lợi từ đó là được

    • Điểm khởi đầu cho sự chỉ trích của tôi là như sau

      • Trang chủ hoàn toàn không nhắc gì đến Pro, phải lục tài liệu mới biết. Cảm giác như mồi nhử
      • Pro không chỉ gói hỗ trợ hay ví dụ mà còn gói cả tính năng thực tế
      • Nếu phụ thuộc vào tính năng Pro thì sẽ bị khóa vào Datastar và quyền bảo trì bị buộc vào nhà cung cấp
      • Không có Pro thì trang web thậm chí không hoạt động, nên vendor lock-in còn là vấn đề lớn hơn
      • Không có demo trải nghiệm để biết Pro bán cái gì; không có thứ gì có thể thử trực tiếp trên trình duyệt như Alpine.js hay React Flow Pro
      • Dù có nhận được source code thì cũng không thể chia sẻ các cải tiến
      • Đây không phải vấn đề giá cả mà là vấn đề cấu trúc và giá trị; với người này có thể rẻ, với người khác có thể đắt
      • Một số mô hình Pro đáng tham khảo: Alpine.js Pro, React Flow Pro
    • Các công ty nhỏ cũng phải tự hỗ trợ, nên ở những nước có chi phí sinh hoạt cao thì 5 đô còn không đủ để xử lý nổi một ticket hỗ trợ

  • Tôi đã phát triển frontend dựa trên Go và Templ với Datastar được vài tháng, và rất hài lòng với tính năng @actions cùng cách trang được cập nhật theo phản hồi; tuy nhiên cá nhân tôi vẫn còn lăn tăn về signals. Với field đơn lẻ hay dropdown thì ổn, nhưng backend của tôi là API kiểu Kubernetes, nên khi cố lưu JSON resource vào signal thì cách Datastar phân tích cấu trúc thành sub-signal lại không hợp; đặc biệt là những cấu trúc như label của Kubernetes, nơi key có hostname prefix, thì hoàn toàn không xử lý được và signals trở nên rất lộn xộn; data binding với đường dẫn key đơn giản thì ổn, nhưng với đường dẫn cần index hoặc key dạng hostname thì không được; thêm vào đó, các quy tắc tự động chuyển đổi HTML attribute trong JS (snake→camel, v.v.) và cách xử lý modifier cũng dễ gây lỗi nên khá phức tạp; dù vậy, tôi vẫn thích việc nó hợp nhất các tính năng kiểu HTMX/Alpine vào một cách làm hypermedia thống nhất; tôi cũng hài lòng vì có thể tránh hệ sinh thái NodeJS; đã từng có lần wire format thay đổi ở bản RC, và vì tôi dùng Fiber nên tự triển khai trực tiếp mà không dùng Go SDK, thành ra cập nhật khá vất vả; nhưng tôi nghĩ thay đổi định dạng đó là thay đổi tích cực; đội phát triển đang đi đúng hướng nên mong họ tiếp tục phát triển tốt

  • Ý tưởng của Datastar có vẻ rất hay nên tôi cũng từng cân nhắc áp dụng, nhưng điều khiến tôi lo là việc phiên bản mã nguồn mở bị giới hạn để không cạnh tranh tính năng với Pro có thể là con đường nhanh nhất dẫn tới hard fork; hệ sinh thái của nó cũng đâu đủ lớn để người ta không có lý do chuyển sang thứ khác
    [edit: mô hình open-core với việc đóng một số plugin có thể hoàn toàn hợp lý, và kể cả không như vậy thì vẫn có nhiều lựa chọn; tôi mong cả nhà phát triển lẫn người dùng Datastar đều thành công]

    • Nếu lo chuyện hard fork, thì hãy fork các plugin từ thời trước-Pro rồi chỉnh cho phù hợp với bản Datastar pro hiện tại; như vậy sẽ có ích cho tất cả mọi người, vì chúng chỉ là đoạn mã nhỏ cỡ 50 dòng nên rất dễ làm

    • Cách nói "đặt giới hạn" là hơi quá; các attribute/event chỉ có trong Pro là số ít và không phải tính năng cốt lõi; thực tế hầu hết đều có thể thay thế bằng một ít JS gửi từ server; xem danh sách cụ thể ở đây: https://data-star.dev/reference/datastar_pro

    • Tôi thật sự khuyến khích có ai đó fork nó, ai làm cũng được

  • Có lẽ vì tôi đã quá quen với hệ sinh thái React, nhưng với tôi, khi công việc vượt quá một mức độ phức tạp nhất định thì cách này về mặt logic lại khó hơn nhiều; nếu tôi không hiểu sai mô tả, Datastar là một kiểu backend-frontend mà backend trả về HTML, và theo kinh nghiệm trước đây của tôi thì đó thật sự là kiểu tôi không muốn quay lại; đặc biệt với người dùng có kết nối chậm (vẫn còn rất nhiều như dsl, vệ tinh đời cũ, 2G, v.v.), trải nghiệm sẽ kém đi rõ rệt vì thay vì nhận nhiều gói JSON nhỏ, họ lại phải nhận nhiều đợt HTML lớn hơn

    • Theo kinh nghiệm của tôi, dùng react app trên 2G/3G thì nhiều khi ngay từ đầu đã không bao giờ hiện lên nổi, trong khi nếu nhận HTML một lượt thì đa số trường hợp nội dung lại hiện trong vòng 1~2 giây; kỹ sư thường hay tự tạo lại time out một cách tùy tiện, nên dù đang phát hiện tiến độ qua socket thì trong app lại chẳng có cảm giác gì; tôi chỉ mong đừng quá cố làm mọi thứ trông "mượt như bay"

    • Kiểu "backend trả về html" này chính là cách website thời modem 56k từng hoạt động, và tôi vẫn còn nhớ hồi đó người ta xếp layout bằng hàng chục lớp thẻ table lồng nhau

    • Frontend là một phạm trù rất rộng; với những nơi như blog cá nhân hay cửa hàng, nơi nội dung tĩnh nhiều, chỉ cần tải nhanh và ít tương tác, thì công cụ kiểu htmx là phù hợp; nhưng nếu muốn làm ứng dụng cỡ Figma hay Discord thì cách này là không đủ; với những bậc cao thủ cực đoan, DOM chỉ là nhà tù, còn họ chỉ thấy thỏa mãn khi dùng canvas kết hợp tính toán trên GPU

    • Nếu cần offline hoàn toàn thì dĩ nhiên phải chọn cách khác, nhưng phần lớn website không thật sự cần trạng thái bền vững, nên chỉ với page caching hay event state cũng đã đủ dùng; nếu chạy datastar js sdk trong service worker và đồng bộ trạng thái thiết yếu vào browser storage thì nó cũng có thể đóng vai backend; ngay cả trên kết nối chậm, nếu nén mạnh SSE stream thì dù có nhiều thông tin lặp, tỷ lệ nén vẫn có thể vượt 90%; internet chậm thường cũng đi kèm thiết bị chậm, nên so với react, css-in-js và những thứ nặng nề khác thì Datastar nhẹ hơn rất nhiều, trong khi về mặt chức năng gần như không mất mát gì mà lại đơn giản hơn hẳn

  • Đây không phải pattern gì quá mới; thời chuyển từ DHTML sang XHR người ta đã từng đi qua con đường này một lần, rồi gần như bỏ nó vì đủ loại trade-off; các kỹ thuật mới như DOM patching rốt cuộc cũng mang theo những vấn đề cũ tương tự (ghép cặp quá chặt, thiếu ổn định, nặng dữ liệu, độ trễ); Datastar có vẻ gần với một giải pháp giúp công ty nhỏ cắt giảm chi phí phát triển hơn là đột phá qua giới hạn mới của công nghệ; không phải tệ, nhưng cảm giác như lịch sử đang lặp lại

    • Với tư cách tác giả Datastar, việc chẳng có gì mới lạ thực ra lại chính là chủ đích; tôi thấy tiếc khi sau thời kỳ đẹp đẽ mà jQuery chỉ tác động nhẹ lên trang, SPA lại cố kéo mọi thứ sang frontend và làm mất đi bản chất là backend mới là nơi nắm trạng thái; điều tôi muốn không phải đổi mới mà là đưa mọi thứ trở lại bình thường

    • Tôi nghĩ liệu Astro chẳng phải đã giải quyết vấn đề này rồi sao

  • Video ở cuối trang tuyệt vời đến mức khiến tôi muốn dùng ngay cho dự án tiếp theo; đoạn 'The planet uncomplicanus' đặc biệt gây ấn tượng

  • Tôi cũng thích những gì https://www.zjax.dev/ đã làm