Bỏ qua tới nội dung
Headless CMS· ·8 phút đọc

KeystoneJS là gì và khi nào nên chọn nó

Nguyen Hien
KeystoneJS là gì và khi nào nên chọn nó
Cỡ chữ

Khi tìm hiểu các công cụ quản trị nội dung tách rời (headless), bạn sẽ gặp một nhánh đặc biệt: thay vì click chuột dựng trường dữ liệu trên giao diện, bạn khai báo mọi thứ bằng mã nguồn. KeystoneJS thuộc nhánh này, và đó vừa là điểm mạnh vừa là rào cản tuỳ vào người dùng.

KeystoneJS hoạt động theo nguyên lý nào

KeystoneJS do Thinkmill — một công ty thiết kế và phát triển ở Úc — xây dựng. Phiên bản đang phát triển hiện nay là Keystone 6 (đặt trong namespace @keystone-6/* trên npm), với bản phát hành mới nhất vào tháng 3 năm 2026; Keystone 5 đã chuyển sang chế độ duy trì (maintenance mode — chỉ vá lỗi, không thêm tính năng).

Ý tưởng cốt lõi gói gọn trong một câu của chính tài liệu Keystone: bạn mô tả schema (lược đồ dữ liệu — định nghĩa các loại nội dung và trường của chúng), và Keystone trả lại cho bạn một GraphQL API mạnh cùng một trang quản trị (Admin UI) đẹp. Cụ thể, bạn viết một tệp cấu hình TypeScript khai báo các “list” (danh sách — tương đương một loại nội dung như Bài viết, Sản phẩm) với các trường, quan hệ, quy tắc phân quyền và các hook (móc xử lý — đoạn code chạy xen vào lúc tạo/sửa/xoá). Từ schema đó, Keystone tự sinh ra ba thứ cùng lúc.

  • GraphQL API đầy đủ truy vấn, phân trang, lọc, sắp xếp và các mutation (thao tác ghi dữ liệu) tạo/sửa/xoá.
  • Admin UI bằng React, tự đọc schema và quy tắc phân quyền để dựng giao diện nhập liệu cho người biên tập.
  • Lớp database qua Prisma — Keystone tự lo việc tạo bảng và chạy migration (di trú — cập nhật cấu trúc database khi schema đổi).
Sơ đồ các thành phần cốt lõi của KeystoneJS gồm schema, Admin UI, GraphQL và cơ sở dữ liệu
Bốn thành phần làm nên KeystoneJS: khai báo schema, hệ thống tự sinh giao diện và API.

Điểm đặc trưng về kỹ thuật

Khác biệt lớn nhất là cách tiếp cận “code-first” (ưu tiên code). Cấu trúc dữ liệu nằm trong các tệp .ts của dự án, đồng nghĩa nó được version (lưu vết qua Git) như mọi đoạn code khác. Khi đổi schema, bạn sửa code rồi commit; môi trường khác chỉ cần kéo code về và chạy migration là đồng bộ. Điều này hợp với quy trình CI/CD (tích hợp và triển khai liên tục) hơn là cấu hình rời rạc lưu trong database.

Một đoạn khai báo trường rất gọn, ví dụ:

list({
  fields: {
    title: text({ validation: { isRequired: true } }),
    author: relationship({ ref: 'User' }),
  },
})

Về dữ liệu, Keystone dựa trên Prisma nên hỗ trợ PostgreSQL, MySQL và SQLite. TypeScript là công dân hạng nhất: schema sinh ra kiểu (type) tự động, nên khi gõ sai tên trường hay truy vấn lệch kiểu, trình biên dịch báo lỗi ngay thay vì để lỗi trượt ra lúc chạy. Keystone cũng có sẵn trình soạn thảo văn bản giàu định dạng (document field) lưu nội dung dưới dạng có cấu trúc, tiện cho việc xuất ra nhiều kênh.

KeystoneJS so với Strapi

Cặp được so sánh nhiều nhất là KeystoneJS và Strapi, vì cả hai đều là headless CMS chạy trên Node.js và đều phát GraphQL API. Khác biệt nằm ở triết lý vận hành.

Tiêu chíKeystoneJSStrapi
Cách định nghĩa schemaBằng code TypeScriptPhần lớn qua giao diện (content-type builder)
API mặc địnhGraphQL là trung tâmREST mặc định, GraphQL qua plugin
Mở rộngHook và code tuỳ biến trong dự ánHệ plugin phong phú
Phù hợp vớiLập trình viên muốn kiểm soát bằng codeĐội có cả người không code, cần dựng nhanh qua UI
Cộng đồngNhỏ hơn, gọnLớn hơn, tài liệu nhiều

Nói ngắn gọn: Strapi nghiêng về cấu hình qua giao diện, dựng nhanh và thân thiện cả với người ít code. KeystoneJS nghiêng về kiểm soát bằng mã nguồn, đổi lại bạn phải viết và đọc TypeScript. Nếu muốn tìm hiểu sâu hai lựa chọn này, có bài riêng về Strapi và cách nó dựng nội dung qua giao diện cũng như Directus chạy thẳng trên database có sẵn để bạn đối chiếu.

Khi nào nên dùng và khi nào không

Nên cân nhắc KeystoneJS khi:

  • Đội ngũ đã quen TypeScript và muốn schema được quản lý bằng Git như phần code còn lại.
  • Bạn cần GraphQL API ngay từ đầu và muốn kiểm soát chặt phân quyền, validation, logic nghiệp vụ bằng code.
  • Dự án có nhiều môi trường (dev, staging, production) cần đồng bộ cấu trúc dữ liệu một cách lặp lại được.

Có thể không hợp khi:

  • Người dựng nội dung không biết lập trình và cần tự thêm trường dữ liệu qua giao diện.
  • Bạn muốn một hệ sinh thái plugin lớn cắm vào là chạy, hoặc cần cộng đồng đông để tra cứu nhanh.
  • Dự án nhỏ, đơn giản, chỉ cần một CMS truyền thống là đủ.

Nếu bạn thấy việc tự xoay xở với một nền tảng như KeystoneJS hơi quá sức và chỉ muốn có ngay một website hoàn chỉnh chạy được, Web22 nhận thiết kế website trọn gói để bạn khỏi phải tự dựng từ đầu.

Bảng so sánh KeystoneJS và Strapi về cách định nghĩa dữ liệu và kiểu API
KeystoneJS thiên code và GraphQL, Strapi thiên giao diện và REST.

Câu hỏi thường gặp

KeystoneJS có miễn phí không?

Có. KeystoneJS là dự án mã nguồn mở, dùng miễn phí. Chi phí chủ yếu đến từ hosting và database bạn tự chọn.

KeystoneJS dùng database nào?

Keystone 6 chạy qua Prisma nên hỗ trợ PostgreSQL, MySQL và SQLite. Việc tạo bảng và migration được Keystone xử lý tự động theo schema.

KeystoneJS có phải framework hay chỉ là CMS?

Nó là cả hai: vừa là headless CMS với Admin UI sẵn, vừa là framework để bạn lập trình logic backend quanh dữ liệu của mình.

Nếu bạn đang phân vân giữa các nền tảng headless và muốn một web headless lập trình riêng đúng nhu cầu, Web22 có thể cùng bạn rà soát lựa chọn phù hợp với đội ngũ và ngân sách.

Đọc tiếp

Bài viết
cùng chủ đề.

Tất cả bài viết
Chat Zalo