跳轉至

從 MkDocs 遷移與外掛相容性

Zensical 由 Material for MkDocs 的原班人馬打造,相容性是核心目標。多數現有的 MkDocs 專案不需要修改就能建置。

相容範圍

項目 相容情況
設定與結構 支援既有的 mkdocs.yml,包含 navthemeextraplugins 等幾乎所有設定
Markdown Python Markdown、Python Markdown Extensions 與最熱門的第三方擴充,不需修改
Material for MkDocs 支援完整的設定,並提供 classic 主題變體保留原本外觀
客製化 額外的 CSS 與 JavaScript 在 classic 下不需修改;模板覆寫很少需要修改
MkDocs 外掛 持續增加原生的外掛替代實作
指令 buildserve 的形式和 MkDocs 相同,只有少數差異

循序漸進的遷移方式

不必改設定或流程,因為 Zensical 讀得懂 mkdocs.yml,所以同一個專案可以用兩種指令建置:

mkdocs build
zensical build

建議的步驟:

  1. 保留現有 MkDocs 的正式佈署,不要動它。
  2. 用 Zensical 讀同一份 mkdocs.yml 建置。
  3. 比對代表性的頁面、導覽、搜尋與客製化內容。
  4. 確認所有依賴的 MkDocs 外掛都有支援。
  5. 有把握之後,才把本機與 CI 的指令換成 Zensical。

因為 MkDocs 的建置是「安全網」,所以隨時可以退回。想繼續用 mkdocs.yml 多久都可以,改用 zensical.toml 並不是必要的。

遷移期間的寫法

遷移期間新增設定時,請參考官方設定文件裡的 mkdocs.yml 寫法,專案才能同時被兩種工具建置。

尚未支援的設定

下列 mkdocs.yml 設定 Zensical 目前尚不支援

  • remote_branch
  • remote_name
  • exclude_docs
  • draft_docs
  • not_in_nav
  • hooks

指令差異

MkDocs Zensical
--theme 不支援,請改用主題變體(theme.variant
--use-directory-urls 不支援,請改用設定檔的 use_directory_urls
--site-dir 不支援,請改用設定檔的 site_dir
gh-deploy 沒有,請改用適合的發佈方式(見 佈署
get-deps 沒有,請在 pyproject.toml 明確宣告相依套件

主題變體:classicmodern

Zensical 提供兩種變體,兩者的 HTML 結構相同:

[project.theme]
variant = "classic"   # 或 "modern"
  • classic:保留 Material for MkDocs 的外觀。遷移既有專案,或自訂的 CSS/JavaScript 依賴原本外觀時,建議使用。
  • modern:新的外觀。

模板與覆寫

Zensical 使用 MiniJinja(以 Rust 寫的模板引擎),而不是 Jinja。MiniJinja 與 Jinja 大致相容,但沒有 Python 直譯器,不能呼叫任意的 Python 函式,請改用它提供的過濾器(filters)與測試(tests)。

Material for MkDocs 9.6.18 已完成最後的相容調整,以該版本或更新版本為基礎的覆寫通常不需修改。遷移較舊或大量客製化的覆寫時:

  1. 與最新的 Material for MkDocs 模板比對。
  2. 把呼叫任意 Python 函式的地方,換成支援的過濾器或測試。
  3. 建置一組代表性的頁面,逐一檢查被覆寫的區塊。

已支援的外掛

Zensical 以原生實作提供下列外掛,大部分不需要另外安裝套件。設定裡的外掛若不在支援清單,會被悄悄忽略(不會載入也不會執行);支援的外掛中,被標示為忽略的選項也會悄悄忽略,其他不認識的選項則會在解析設定時報錯。

外掛 起始版本 差異與注意事項
autorefs 0.0.22 忽略 resolve_closestlink_titlesstrip_title_tags
awesome-nav 0.0.58 不支援 extglob;不支援 not_in_nav
callouts 0.0.62 會啟用 pymdownx.quotescallouts: true;忽略 aliasesbreakless_liststitle_from_first_bold
glightbox 0.0.35 忽略 touchNavigationloopeffectslide_effectzoomabledraggablebackgroundshadow
literate-nav 0.0.58
macros 0.0.40 引用的 Python 與 YAML 檔案必須在專案目錄內;忽略 force_render_pathsverbose
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_jsminify_inline_css
mkdocstrings 0.0.11 需安裝 pip install mkdocstrings-python;不支援 backlinks;忽略 enable_inventorywatch
offline 0.0.3 離線使用
redirects 0.0.58 支援錨點重新導向,見 重新導向
search 0.0.3 預設啟用,只有 enabledseparator 有效,見 站內搜尋
section-index 0.0.3 原生行為;設定裡的條目會被忽略
table-reader 0.0.41 資料檔必須在專案目錄內;讀取函式的參數必須是 Python 字面值
tags 0.0.58 標籤

範例(在 mkdocs.ymlzensical.toml 中的寫法):

plugins:
  - tags
  - minify:
      minify_html: true
[project.plugins.tags]

[project.plugins.minify]
minify_html = true

不支援的外掛:mkdocs-gen-files

Zensical 目前不支援 mkdocs-gen-files。請把產生檔案的腳本獨立於建置之外執行(一次或定期),並把產生的檔案納入版本控制。可以用 uvx 執行腳本(這個方法需要 mkdocs.ymlzensical.toml 不適用):

uvx --with mkdocs-gen-files python scripts/gen_ref_pages.py

相容性路線圖

狀態 外掛
進行中 blogsocial
規劃中 rssoptimizeexcludeprivacygit-authorsgit-committersgit-revision-date-localizedaudiovideo

這些狀態反映目前的優先順序,不代表發佈日期。

版本管理(mike)

如果你的 MkDocs 專案已經用 mike 做多版本文件,可以在遷移期間沿用。需要安裝相容的 fork(從 GitHub 安裝,需要 git):

pip install git+https://github.com/squidfunk/mike.git

設定沿用 Material for MkDocs 的寫法:

extra:
  version:
    provider: mike

這個整合是過渡方案: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 過濾器

參考資料