你的內容模型是網站儲存的集合和欄位的集合。你可以在管理面板或使用 CLI 定義它,隨時變更它,並可選擇從中產生 TypeScript 型別。本頁介紹如何使用它。
集合和欄位
集合是一種內容類型(文章、產品、作者)。每個集合都有你定義的欄位(標題、內文、價格)。每個項目還具有 EmDash 為你管理的系統欄位。
你可以在管理面板的 Content Types 下以視覺化方式建立和編輯集合和欄位,或使用 CLI。變更立即生效,非開發人員也可以執行此操作。
系統欄位
除了你定義的欄位外,每個項目都有這些欄位,始終存在:
| 欄位 | 用途 |
|---|---|
id | 穩定的唯一識別碼 |
slug | URL 安全的識別碼,每個語系唯一 |
status | draft、published 或 scheduled |
author_id | 建立項目的使用者 |
created_at / updated_at / published_at | 時間戳記 |
deleted_at | 軟刪除時設定;保留列 |
version | 每次儲存時遞增 |
刪除項目是軟刪除:可以復原。
隨時變更模型
你可以隨時透過管理面板或 CLI 在活動集合上新增、重新命名、刪除或重新設定欄位類型。現有內容會被保留。
TypeScript 型別
型別產生是可選的,但建議使用。從目前模型產生型別:
npx emdash types
這會寫入 .emdash/types.ts,其中包含每個集合的介面和型別化的查詢多載,因此 getEmDashCollection("posts") 會傳回完全型別化的項目:
export interface Post {
title: string;
content: PortableTextBlock[];
excerpt?: string;
}
declare module "emdash" {
export function getEmDashCollection(
type: "posts",
): Promise<{ entries: ContentEntry<Post>[]; error?: Error }>;
}
變更模型後重新執行該命令以保持型別同步。
工作流程
兩種工作流程都會變更同一模型。
非開發人員使用管理面板:
- 在管理面板中開啟 Content Types。
- 點選 Add Collection。
- 使用視覺化建構器定義欄位。
- 開始建立內容。
開發人員可以使用 CLI 產生型別並在環境之間移動模型:
npx emdash types # 產生 TypeScript 型別
npx emdash export-seed > seed.json # 將模型匯出為種子檔案
種子檔案
種子檔案是集合、分類法和選單的 JSON 描述。範本附帶一個,你可以匯出自己的用於版本控制或設定另一個環境。
{
"version": "1",
"collections": [
{
"slug": "posts",
"label": "Blog Posts",
"labelSingular": "Post",
"supports": ["drafts", "revisions", "preview"],
"fields": [
{ "slug": "title", "type": "string", "required": true },
{ "slug": "content", "type": "portableText" }
]
}
],
"taxonomies": [{ "name": "category", "label": "Categories", "hierarchical": true }],
"menus": [{ "name": "primary", "label": "Primary Navigation" }]
}
套用種子是冪等的,因此可以安全地重新執行:
import { applySeed, validateSeed } from "emdash/seed";
import seedData from "./.emdash/seed.json";
const { valid, errors } = validateSeed(seedData);
await applySeed(db, seedData, { includeContent: true, onConflict: "skip" });
查看種子檔案格式以取得完整架構。