從 MkDocs 遷移與外掛相容性
Zensical 由 Material for MkDocs 的原班人馬打造,相容性是核心目標。多數現有的 MkDocs 專案不需要修改就能建置。
相容範圍
| 項目 | 相容情況 |
|---|---|
| 設定與結構 | 支援既有的 mkdocs.yml,包含 nav、theme、extra、plugins 等幾乎所有設定 |
| Markdown | Python Markdown、Python Markdown Extensions 與最熱門的第三方擴充,不需修改 |
| Material for MkDocs | 支援完整的設定,並提供 classic 主題變體保留原本外觀 |
| 客製化 | 額外的 CSS 與 JavaScript 在 classic 下不需修改;模板覆寫很少需要修改 |
| MkDocs 外掛 | 持續增加原生的外掛替代實作 |
| 指令 | build 與 serve 的形式和 MkDocs 相同,只有少數差異 |
循序漸進的遷移方式
你不必改設定或流程,因為 Zensical 讀得懂 mkdocs.yml,所以同一個專案可以用兩種指令建置:
建議的步驟:
- 保留現有 MkDocs 的正式佈署,不要動它。
- 用 Zensical 讀同一份
mkdocs.yml建置。 - 比對代表性的頁面、導覽、搜尋與客製化內容。
- 確認所有依賴的 MkDocs 外掛都有支援。
- 有把握之後,才把本機與 CI 的指令換成 Zensical。
因為 MkDocs 的建置是「安全網」,所以隨時可以退回。想繼續用 mkdocs.yml 多久都可以,改用 zensical.toml 並不是必要的。
遷移期間的寫法
遷移期間新增設定時,請參考官方設定文件裡的 mkdocs.yml 寫法,專案才能同時被兩種工具建置。
尚未支援的設定
下列 mkdocs.yml 設定 Zensical 目前尚不支援:
remote_branchremote_nameexclude_docsdraft_docsnot_in_navhooks
指令差異
| MkDocs | Zensical |
|---|---|
--theme |
不支援,請改用主題變體(theme.variant) |
--use-directory-urls |
不支援,請改用設定檔的 use_directory_urls |
--site-dir |
不支援,請改用設定檔的 site_dir |
gh-deploy |
沒有,請改用適合的發佈方式(見 佈署) |
get-deps |
沒有,請在 pyproject.toml 明確宣告相依套件 |
主題變體:classic 與 modern
Zensical 提供兩種變體,兩者的 HTML 結構相同:
classic:保留 Material for MkDocs 的外觀。遷移既有專案,或自訂的 CSS/JavaScript 依賴原本外觀時,建議使用。modern:新的外觀。
模板與覆寫
Zensical 使用 MiniJinja(以 Rust 寫的模板引擎),而不是 Jinja。MiniJinja 與 Jinja 大致相容,但沒有 Python 直譯器,不能呼叫任意的 Python 函式,請改用它提供的過濾器(filters)與測試(tests)。
Material for MkDocs 9.6.18 已完成最後的相容調整,以該版本或更新版本為基礎的覆寫通常不需修改。遷移較舊或大量客製化的覆寫時:
- 與最新的 Material for MkDocs 模板比對。
- 把呼叫任意 Python 函式的地方,換成支援的過濾器或測試。
- 建置一組代表性的頁面,逐一檢查被覆寫的區塊。
已支援的外掛
Zensical 以原生實作提供下列外掛,大部分不需要另外安裝套件。設定裡的外掛若不在支援清單,會被悄悄忽略(不會載入也不會執行);支援的外掛中,被標示為忽略的選項也會悄悄忽略,其他不認識的選項則會在解析設定時報錯。
| 外掛 | 起始版本 | 差異與注意事項 |
|---|---|---|
autorefs |
0.0.22 | 忽略 resolve_closest、link_titles、strip_title_tags |
awesome-nav |
0.0.58 | 不支援 extglob;不支援 not_in_nav |
callouts |
0.0.62 | 會啟用 pymdownx.quotes 的 callouts: true;忽略 aliases、breakless_lists、title_from_first_bold |
glightbox |
0.0.35 | 忽略 touchNavigation、loop、effect、slide_effect、zoomable、draggable、background、shadow |
literate-nav |
0.0.58 | — |
macros |
0.0.40 | 引用的 Python 與 YAML 檔案必須在專案目錄內;忽略 force_render_paths、verbose |
markdown-exec |
0.0.47 | 需安裝 pip install "markdown-exec[ansi]" |
meta |
0.0.58 | 中繼資料檔案不支援自訂 YAML 標籤 |
mike |
0.0.30 | 需要相容的 fork(見下方) |
minify |
0.0.58 | 無法解析的資源會保留原內容而不是讓建置崩潰;新增 minify_inline_js、minify_inline_css |
mkdocstrings |
0.0.11 | 需安裝 pip install mkdocstrings-python;不支援 backlinks;忽略 enable_inventory、watch |
offline |
0.0.3 | 見 離線使用 |
redirects |
0.0.58 | 支援錨點重新導向,見 重新導向 |
search |
0.0.3 | 預設啟用,只有 enabled、separator 有效,見 站內搜尋 |
section-index |
0.0.3 | 原生行為;設定裡的條目會被忽略 |
table-reader |
0.0.41 | 資料檔必須在專案目錄內;讀取函式的參數必須是 Python 字面值 |
tags |
0.0.58 | 見 標籤 |
範例(在 mkdocs.yml 與 zensical.toml 中的寫法):
不支援的外掛:mkdocs-gen-files
Zensical 目前不支援 mkdocs-gen-files。請把產生檔案的腳本獨立於建置之外執行(一次或定期),並把產生的檔案納入版本控制。可以用 uvx 執行腳本(這個方法需要 mkdocs.yml,zensical.toml 不適用):
相容性路線圖
| 狀態 | 外掛 |
|---|---|
| 進行中 | blog、social |
| 規劃中 | rss、optimize、exclude、privacy、git-authors、git-committers、git-revision-date-localized、audio、video |
這些狀態反映目前的優先順序,不代表發佈日期。
版本管理(mike)
如果你的 MkDocs 專案已經用 mike 做多版本文件,可以在遷移期間沿用。需要安裝相容的 fork(從 GitHub 安裝,需要 git):
設定沿用 Material for MkDocs 的寫法:
這個整合是過渡方案:fork 只會修相容性問題,不會有新功能;官方之後會提供原生的版本管理。
其他官方提到的進階功能
Directives(Zensical Spark 搶先體驗)
Directives 可以用同一組 Markdown 來源,建立不同版本(例如雲端版/自架版)的文件,包含 @if/@elif/@else 條件內容、@var{} 插入變數、@use 重複使用檔案。目前只在 Zensical Spark(搶先體驗)提供,尚未公開,請參考官方文件。
總結
| 想做的事 | 做法 |
|---|---|
| 試用 Zensical | 直接用 zensical build 建置既有的 mkdocs.yml |
| 保留舊外觀 | theme.variant = "classic" |
| 檢查外掛 | 對照上方支援清單 |
| 多版本文件 | mike 的相容 fork |
| 舊模板出錯 | 移除 Python 函式呼叫,改用 MiniJinja 過濾器 |