Tôi chọn Astro với output: "server" thay vì static generation mặc định, vì muốn bài viết đọc thẳng từ Supabase lúc request — đăng bài mới không cần trigger build lại toàn site.
Điểm mạnh
- Chuyển từ static sang server chỉ cần đổi
outputtrongastro.config.tsvà thêm adapter, không phải viết lại toàn bộ routing. - Adapter
@astrojs/cloudflaremap gần như trực tiếp sang Cloudflare Workers, không cần thêm lớp trung gian. - Vẫn giữ được các trang tĩnh (About, Shelves) không đổi gì — SSR chỉ áp dụng cho phần cần dữ liệu động.
Điểm yếu
- Routing đa ngôn ngữ tự động của Astro (
i18n.routing) không sinh route đúng như kỳ vọng cho một số page có sẵn — cuối cùng tôi phải tự làm folder[locale]và validate thủ công qua middleware, thay vì dùng cơ chế built-in. - Một vài tính năng của theme gốc (search Pagefind, dynamic OG image, content collection cũ) giả định site là static — phải tắt tạm khi chuyển sang đọc dữ liệu từ Supabase, chưa viết lại.
- Deploy lên Cloudflare Workers đòi hỏi để ý kỹ cấu hình package manager (pnpm workspace) và dependency trực tiếp (
wrangler) — xem case study riêng tôi viết về hai lỗi build gặp phải.
Đánh giá: 4/5. Đáng dùng nếu bạn thực sự cần SSR (dữ liệu động, không muốn rebuild); nếu blog vẫn hoàn toàn tĩnh thì static generation mặc định của Astro đơn giản hơn nhiều, không đáng đánh đổi.