Bỏ qua điều hướng
chuanweb.com
Quay lại tất cả bài viết

Chọn CMS headless cho blog Astro: từ Markdown thuần đến Keystatic và Decap

chuanweb.com 3 phút đọc

Một rào cản lớn khi làm blog kỹ thuật: người viết không muốn đụng code, nhưng hệ thống nội dung lại gắn chặt với kho mã nguồn. Bài này so sánh bốn cách quản lý nội dung cho Astro — từ tối giản đến đầy đủ — và cách chọn theo nhu cầu thật.

Markdown thuần + biên tập qua UI

Nội dung sống trong thư mục src/content/blog dưới dạng file .mdx. Với một CMS nhỏ hoặc web UI tự dựng, bạn có thể viết và đăng bài mà không cần chạm code.

---
title: 'Ví dụ bài viết'
description: 'Mô tả ngắn hiển thị trên Google'
pubDate: 2026-09-20
tags: ['Astro', 'WebDev']
featured: false
---

Nội dung viết bằng Markdown, hỗ trợ đầy đủ code block.

Ưu điểm: không phụ thuộc dịch vụ bên ngoài, toàn quyền kiểm soát, dữ liệu là file thuần dễ sao lưu. Nhược điểm: muốn giao diện chỉnh sửa đẹp thì phải tự xây hoặc nhờ công cụ.

Keystatic: CMS đặt ngay trong repo

Keystatic đọc schema file, tự sinh ra giao diện quản trị chạy local:

// src/keystatic.config.ts
import { defineConfig, collection } from '@keystatic/core';

export default defineConfig({
  storage: { kind: 'local' },
  collections: {
    posts: collection({
      label: 'Bài viết',
      path: 'src/content/blog/*',
      schema: {
        title: { kind: 'text', label: 'Tiêu đề' },
        pubDate: { kind: 'date', label: 'Ngày đăng' },
        featured: { kind: 'boolean', label: 'Nổi bật' },
      },
    }),
  },
});

Ưu điểm: trải nghiệm CMS thật sự, schema kiểm soát chất lượng dữ liệu. Nhược điểm: muốn đồng bộ giữa nhiều người qua git cần thêm backend.

Decap CMS: giao diện trong trình duyệt

Decap (trước là Netlify CMS) chạy như trang web con, ghi commit vào kho git:

backend:
  name: git-gateway
  branch: main
media_folder: public/images
collections:
  - name: posts
    label: Bài viết
    folder: src/content/blog
    fields:
      - { name: title, label: Tiêu đề, widget: string }
      - { name: pubDate, label: Ngày đăng, widget: datetime }

Ưu điểm: giao diện trình duyệt quen thuộc, có sẵn lịch sử phiên bản git. Nhược điểm: cần hạ tầng git và OAuth — vượt tầm với dự án không dùng GitHub/GitLab.

CMS headless dịch vụ: Sanity, Contentful

Khi đội ngũ sáng tạo nội dung nhiều người và cần luồng phê duyệt, quay sang CMS dạng dịch vụ. Astro kéo dữ liệu bằng API:

import { createClient } from '@sanity/client';

export const client = createClient({
  projectId: import.meta.env.SANITY_PROJECT_ID,
  dataset: 'production',
  apiVersion: '2026-01-01',
  useCdn: true,
});

Ưu điểm: giao diện chuyên nghiệp, phân quyền, preview realtime. Nhược điểm: chi phí theo lượng truy cập, phụ thuộc nhà cung cấp, cache phức tạp hơn.

Tiêu chí chọn

  • Một người viết, muốn đơn giản: Markdown thuần + editor web đơn giản.
  • Nội dung ít, muốn có form chỉnh sửa chuẩn: Keystatic.
  • Đã có sẵn GitHub/GitLab: Decap CMS.
  • Nhiều người, cần quy trình duyệt: CMS dịch vụ.

Kết luận

  • Không có CMS nào tốt nhất tuyệt đối — chỉ có CMS phù hợp với quy mô và thói quen của đội.
  • Bắt đầu từ file Markdown luôn là quyết định an toàn: dễ nâng cấp lên giải pháp lớn hơn.
  • Quan trọng nhất là schema hợp lệ để dữ liệu không phải di trú sau này.