前言
想了很久是否要集成一個類似 CMS 的管理平台來管理這些文章的內容,終於在這周開始落地了。簡單説一下我為什麼有這個想法的:由於 DevNow 的定位📌是一個開源的博客項目,所以我在努力的跳出我自己的想法,避免因為一些自己想要的一些功能來讓 DevNow 看起來更加的臃腫。集成 Headless CMS 的主要目的是優化現在的工作流,由於我們是基於 Astro 來構建的一個博客項目,所以我們正常的工作流一般是:
- 在本地新建一個
.mdx文件 - 完成文章內容的編輯
- push 到線上環境,重新
build生成新的文章內容從而完成網站內容的更新。
這個 workflow 比較噁心的是我們必須要在本地去編輯文檔,為了預覽可能還需要再一個支持 markdown 或者 .mdx 預覽的編輯器中來編輯,整體來説感覺這個過程會比較複雜。所以希望通過一些平台來優化這個 workflow 。然後就有了集成 CMS 想法,過程中也調研了一些常用的 CMS 平台,最終選擇了 Tian CMS。
一些 CMS 平台的對比:
Tina 的優勢
基於 Git 的內容管理
- Tina 使用 Git 為內容和代碼提供單一真實來源,增強開發人員和內容編輯者之間的協作。
- 內容更改直接提交到您的存儲庫,確保版本控制和內容歷史記錄。
實時視覺編輯
- 使用 Tina 的實時可視化編輯器直接在您的網站或應用程序環境中創建和編輯內容。
- 可定製的內容塊允許內容編輯者組裝頁面並直觀地管理內容,類似於使用網站構建器。
- 編輯所做的修改可以在發佈前實時預覽,確保內容的質量。
內容控制
- Tina 的開源模型讓您對您的內容擁有完全的控制權和所有權。
- Tina(可選)的自託管後端讓您免受供應商鎖定的困擾。
可擴展性
- 大規模性能: Tina 專為大型項目而設計。無論您的網站有數百或數萬個頁面,Tina 都能確保最佳性能。
- 強大的查詢功能:藉助 Tina 獨特的數據層,您的 Markdown 內容變得像在數據庫中一樣靈活且可查詢。
總結一下:
- 數據存儲:Tina 是一款開源的、由 Git 支持的無頭內容管理系統 (CMS),這個正好符合我們的項目結構,文件都是基於 Git 來管理的。其他平台多為在自己的 cloud 端存儲,避免後期如果有數據遷移帶來的數據問題。
- 文件格式:同時支持 Markdown、MDX 和 JSON 等多種內容類型。
- 支持實時可視化的編輯器
- 支持根據分支來管理版本內容
- Tina 提供了一些自己的數據層,可以靈活的查詢
具體的集成步驟如下
1. 在項目中集成 Tina
// 通過 tina cli 集成,按提示進行配置就好
pnpm dlx @tinacms/cli@latest init
到這裏就已經在本地集成好了,需要注意的是圖中標記的這個路徑,需要根據自己項目中文檔存儲的路徑來更換,這裏是 DevNow 中的目錄。這裏如果配置錯了也不用急,後邊也可以在 tina/config.ts 中進行修改。
接下來替換項目運行的命令:
// 在 package.json 中修改 scripts 的 dev 和 build 即可
"scripts": {
"dev": "tinacms dev -c \"astro dev\"",
"build": "tinacms build && astro check && astro build",
...
}
根據項目替換 schema ,集體可參考 schema 配置
schema: {
collections: [
{
name: 'doc',
label: 'Posts',
path: 'src/content/doc',
format: 'mdx',
fields: [
{
type: 'string',
name: 'desc',
label: 'Desc',
required: true,
description: 'The image used for the cover of the post'
},
{
type: 'boolean',
name: 'draft',
label: 'Draft',
description: 'If this is checked the post will not be published'
},
{
type: 'string',
required: true,
name: 'category',
label: 'Category',
description: 'Select an category for this post',
options: [
...categories.map((item) => {
return {
label: item.title,
value: item.slug
};
})
]
},
// 作者
{
type: 'string',
name: 'author',
label: 'Author',
required: true
},
// 標籤
{
type: 'string',
name: 'tags',
label: 'Tags',
required: true,
list: true,
ui: {
component: 'tags'
}
},
{
type: 'string',
name: 'image',
label: 'Image',
required: true
},
// 封面圖
// 發佈時間
{
type: 'string',
name: 'publishDate',
label: 'PublishDate',
required: true
},
// 是否置頂
{
type: 'boolean',
name: 'pin',
label: 'Pin',
required: true
},
{
type: 'string',
name: 'title',
label: 'Title',
isTitle: true,
required: true
},
{
type: 'rich-text',
name: 'body',
label: 'Body',
isBody: true
}
]
}
]
}
\:::tip[注意]
這裏需要主要的是在首次運行的時候,會根據 tina/config.ts 生成一個 tina/tina-lock.json 的文件,每次修改完都 config.ts 的時候,都需要在本地運行一下來更新 tina-lock.json 的內容,否則無法成功 build 。
\:::
運行項目:
pnpm dev
然後訪問:
看到這樣的界面,恭喜你,成功完成了配置 [慶祝][慶祝]
接下來就可以在這裏去更新文章的內容了
2. 線上環境集成
通過以上的一些配置,我們已經完成了 local 的配置,接下來我們需要配置一下線上環境,我們可能主要的場景是在線上環境直接進行文件的更新。
Tina 在這裏提供了兩套解決方案:
- Tina Cloud
- 使用自託管後端
這裏我選擇了 Tina Cloud ,具體的思考一個是自託管的配置成本比較高,需要自己的配置實現:
- Auth Provider:處理 CMS 操作的身份驗證和授權。提供由數據庫中的用户集合支持的默認Auth.js實現。
- Database Adapter:處理索引和與數據庫的交互(例如MongoDB,Postgres等)
- Git Provider:處理將內容保存到
Git
每個模塊都是獨立的,這意味着您可以選擇用不同的實現替換任何模塊,或者開發定製解決方案來滿足您的特定需求。
當然自託管也是有一些 限制 的,不過限制部分對我來説不是最主要的問題,是上邊三個配置的實現成本。還有就是作為一個博客項目,穩定的存儲都在 Git 上,所以 Tina Cloud 對我來説是一個更好且簡單的實現。
2.1 註冊 Tina Cloud 賬號
2.2 創建項目
Tina 提供了兩種方式,我們選擇第一個,選擇導入一個已有的項目開始。根據提示的步驟一步一步來就好,
不出意外的話你會看到這樣的一個界面。
2.2 配置環境變量
這裏我是通過 Vercel 構建項目的,直接在上邊配置環境變量就好了,具體如下:
需要注意的是,如果環境變量名改變的話,記得在項目配置在修改對應的值,具體實在 tina/cinfig.ts 中:
2.4 把我們集成好的項目分支推到 Git 上進行構建
如果是首次集成的話需要把我們上一步配置的 PUBLIC_GITHUB_BRANCH 這個分支名改成當先對應的分支名,否則 Tian Cloud 無法檢測到對應分支,會導致構建失敗,等成功推到 mian 主分支的時候,再將 PUBLIC_GITHUB_BRANCH 改回主分支名。
然後回到 Tina Cloud 刷新即可看到:
到這裏我們就成功在 DevNow 中集成了 Tina ,後續可以直接通過線上環境訪問即可進行文件更新。直接訪問我們配置好的域名 https://www.laughingzhu.cn/admin 即可。
也歡迎大家體驗開源博客項目 DevNow ,可以提一些反饋建議,當然也可以順手點個贊👍🏻
原文鏈接:DevNow:支持集成 Tina CMS