- Một ví dụ triển khai cho phép hiển thị bình luận bằng Bluesky API ngay cả trên trang web tĩnh
- Vì Bluesky xử lý xác thực tài khoản, quản lý spam, lưu trữ và kiểm duyệt, nên không cần duy trì máy chủ riêng
- Phần triển khai gồm khoảng 200 dòng mã TypeScript, sử dụng
@bluesky/api và Tanstack react-query
- Bình luận được hiển thị ở dạng chỉ đọc, và tự động tải bằng cách liên kết ID bài đăng Bluesky trong metadata của từng bài blog
- Một triển khai mang tính thử nghiệm cho thấy khả năng kết hợp giữa nền tảng mạng xã hội mở và blog tĩnh
Bối cảnh triển khai mục bình luận Bluesky
- Điểm khởi đầu là việc khó tự host tính năng bình luận trên các trang web được tạo tĩnh
- Nội dung tĩnh triển khai trên CDN không thể lưu trữ dữ liệu động
- Nếu vận hành VPS hoặc dịch vụ đám mây riêng thì chi phí và gánh nặng quản trị sẽ lớn
- Bluesky là nền tảng mở dựa trên API công khai và giao thức AT, vốn đã cung cấp sẵn những chức năng cần cho việc quản lý bình luận
- Bluesky xử lý xác thực tài khoản, lọc spam, lưu trữ và kiểm duyệt
- Phía blog chỉ cần gọi API để hiển thị bình luận
Các lựa chọn khác và lý do chọn Bluesky
- Cũng đã cân nhắc các lựa chọn như Twitter, Disqus, giscus (dựa trên GitHub Discussions)
- Bluesky được xây dựng trên giao thức AT phi tập trung, nên ít rủi ro bị một công ty cụ thể kiểm soát hơn
- So với nền tảng dựa trên GitHub, đây là nền tảng thiên về hội thoại nên phù hợp hơn cho việc host bình luận
Cách triển khai
- Có tham khảo gói bluesky-comments do Cory Zue công khai, nhưng đã chọn tự triển khai
- Tự viết mã để tùy biến theo phong cách của trang và mở rộng về sau
- Toàn bộ phần triển khai, gồm cả component UI và hàm API, có quy mô khoảng 200 dòng
- Ban đầu cũng cân nhắc chức năng đăng trực tiếp thông qua OAuth, nhưng đã loại bỏ do độ phức tạp của UI và giới hạn thời gian
- Kết quả là chỉ triển khai chức năng hiển thị bình luận ở chế độ chỉ đọc
Cấu trúc kỹ thuật
- Trang web được xây dựng bằng React Server Components và Parcel
- Nội dung được viết bằng MDX, nên có thể nhúng trực tiếp JavaScript/JSX
- Trong đối tượng
metadata của mỗi bài viết có thêm bskyPostId để liên kết với bài đăng Bluesky
- Sử dụng SDK TypeScript của Bluesky (
@bluesky/api) để nhận dữ liệu luồng bình luận từ endpoint getPostThread
- Các yêu cầu API được quản lý bằng Tanstack react-query
- Tự động xử lý trạng thái lỗi, tải và thử lại
Thiết kế UI
- Từ phản hồi của Bluesky, chỉ trích xuất nội dung văn bản để hiển thị bằng UI bình luận đơn giản
- Cấu trúc luồng được phân biệt bằng thụt lề và đường viền bên trái
- Ảnh hồ sơ và ngày đăng tham khảo thiết kế của Bluesky
- Ở phía trên có thêm liên kết tới bài đăng Bluesky gốc để khuyến khích tham gia cuộc trò chuyện
- Không có chức năng viết bình luận; người dùng sẽ trả lời trực tiếp trên Bluesky
Khả năng trong tương lai
- Nếu cần, có thể công khai phần triển khai này thành một gói độc lập
- Tuy nhiên, mã hiện tại được điều chỉnh cho phù hợp với trang cá nhân
- Vì cấu trúc đơn giản, các nhà phát triển khác cũng có thể dễ dàng tham khảo mã nguồn để tự triển khai
- Vẫn chưa rõ việc tích hợp bình luận Bluesky có giúp tăng mức độ tương tác cho blog hay không
Phản ứng của người dùng Bluesky
- Nhiều người dùng Bluesky đã để lại phản hồi tích cực như “ý tưởng hay”, “phản hồi rất nhanh”, “phù hợp làm lựa chọn thay thế Disqus”
- Một số người đặt câu hỏi về quản lý spam, xử lý bình luận lồng nhau, hỗ trợ tệp đính kèm
- Tác giả giải thích rằng có thể ẩn các bình luận cụ thể bằng tính năng kiểm duyệt cá nhân của Bluesky
1 bình luận
Ý kiến trên Hacker News
Nếu bạn render blog hay website bằng static site generator, có người đề xuất cách đưa bình luận về thành file nội dung và đưa vào quy trình build
.mdhoặc.htmlCách này khá tốn công, nhưng có ưu điểm là chặn spam và toàn quyền sở hữu dữ liệu
Nếu không muốn dùng React, bạn có thể tham khảo web component bình luận Bluesky mà tôi làm
Có thể xem tại kho GitHub và theme playground.
Việc tùy biến theme rất dễ
Có người đã dựa trên ý tưởng của bài gốc để làm một hệ thống bình luận dựa trên Mastodon
Xem chi tiết trong bài blog của tôi
Tham khảo: bài blog liên quan
Có ý kiến nói rằng vì luật của EU liên quan đến phát ngôn thù ghét, nếu chủ site không lọc bình luận thì có thể bị xử phạt, nên tôi tò mò thực tế ra sao
Vì vậy tôi đã tắt hẳn chức năng bình luận
Blog của tôi có cấu trúc hoàn toàn tĩnh, và dùng một script Cloudflare Worker 50 dòng để nhận bình luận rồi thêm thẳng vào Markdown.
Có thể làm như vậy mà không cần embed tính năng bình luận
Có thể tự động hóa bằng cách dùng Bluesky API để tự tìm bài đăng đầu tiên có chứa link blog cụ thể rồi nối nó với phần bình luận
Tôi đã tạo một tài khoản để thử vì có vẻ nó cũng giúp Bluesky phát triển. Nghe khá giống một ý tưởng growth hacking thú vị
Lý tưởng nhất thì hệ thống bình luận tự host hoặc dựa trên Fediverse sẽ bền vững hơn
Blog của tôi không nổi tiếng lắm, nhưng trước đây từng trải qua địa ngục spam và bình luận thù ghét
Vì thế tôi sẽ không bao giờ mở lại chức năng bình luận trên blog cá nhân nữa
Ngay cả với hệ thống dựa trên Bluesky, bạn vẫn có thể thêm labeler riêng để lọc các bình luận có gắn nhãn nhất định, tức là vẫn có thể tự kiểm duyệt
Tôi cũng làm một ý tưởng tương tự: ngoài blog của mình, tôi đã thêm cartes.app với chức năng bình luận theo từng địa điểm OSM
Có thể để lại review bằng tài khoản ATproto, và dữ liệu được lưu trên PDS dưới dạng JSON do người dùng sở hữu