【AI应用】免费搭建你的电子书网站(附源码)

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。

电子书网站由AI实现,Claude Code+DeepSeek-V4-Pro。技术栈Python+MkDocs,主题Read the Docs,静态托管GitHub Pages。具有中文搜索功能。

源码

https://github.com/dongfanger/ebook-mkdocs

配置

├── docs/                 # 内容目录(mkdocs 默认,按分类/子分类组织)
│   ├── 简介.md            # 首页
│   └── _static/          # 静态资源(extra.css / lunr.zh.js / favicon.ico)
├── scripts/
│   ├── gen_nav.py        # 扫描 docs 生成 mkdocs.yml
│   └── post_build.py     # 构建后 hook(中文搜索 + favicon)
├── serve.py              # 本地预览入口
├── deploy.py             # 部署入口
└── requirements.txt

网站配置文件是scripts/gen_nav.py。 MkDocs原生配置文件其实是mkdocs.yml,但为了生成导航,mkdocs.yml由gen_nav.py动态创建,所以在gen_nav.py配置。

完整代码:https://github.com/dongfanger/ebook-mkdocs/blob/main/scripts/gen_nav.py

代码片段说明:

ROOT = Path(__file__).resolve().parent.parent  # 项目根目录
SRC = ROOT / "docs"

# 不参与导航的内容目录
SKIP_DIRS = {"_static", "_images", "assets", ".git", "__pycache__"}

# 一级目录顺序(留空 = 按目录名自动扫描排序;想固定顺序就填,如 ["分类A", "分类B"])
TOP_ORDER = []

# 各一级目录下的二级目录顺序(留空 = 自动扫描;如 {"分类A": ["子分类1", "子分类2"]})
SUB_ORDER = {}

...

def build_nav():
    lines = ["nav:"]
    # 首页: 优先 简介.md,回退 index.md(兼容旧命名)
    home = "简介.md" if (SRC / "简介.md").exists() else "index.md"
    lines.append(f"  - 简介: {home}")

    # 根目录下其余 .md(如 关于本书.md)作为顶层导航项,按文件名排序
    for md in sorted(SRC.glob("*.md")):
        if md.name == home:
            continue
        lines.append(f"  - {md.stem}: {md.name}")

    # 一级目录按硬编码顺序,兜底补上未列到的目录
    for top in list_subdirs(SRC, TOP_ORDER):
        top_path = SRC / top
        lines.append(f"  - {top}:")
        for sub in list_subdirs(top_path, SUB_ORDER.get(top, [])):
            lines.append(f"      - {sub}:")
            emit_md_lines(lines, top_path / sub, indent="        ")

    return "\n".join(lines)


HEADER = """site_name: My Docs
site_description: 基于 mkdocs 的技术电子书

theme:
  name: readthedocs

plugins:
  - search:
      lang: zh

markdown_extensions:
  - admonition
  - codehilite
  - attr_list

# 扁平 URL(/xxx.html 而非 /xxx/)
use_directory_urls: false

# 自定义样式:blockquote 引用块(主题默认无样式)
extra_css:
  - _static/css/extra.css

# 中文搜索:构建后用纯 JS 分词器覆盖默认 lunr.zh.js(修复 nodejieba 依赖导致的搜索失效)
hooks:
  - scripts/post_build.py

"""

...

Markdown读取目录,默认为docs:

SRC = ROOT / "docs"

一级目录,可为空,配置后指定顺序:

# 一级目录顺序(留空 = 按目录名自动扫描排序;想固定顺序就填,如 ["分类A", "分类B"])
TOP_ORDER = []

二级目录,可为空,配置后指定顺序:

# 各一级目录下的二级目录顺序(留空 = 自动扫描;如 {"分类A": ["子分类1", "子分类2"]})
SUB_ORDER = {}

首页默认简介.md,可自定义:

# 首页: 优先 简介.md,回退 index.md(兼容旧命名)
home = "简介.md" if (SRC / "简介.md").exists() else "index.md"
lines.append(f"  - 简介: {home}")

网站信息和主题:

HEADER = """site_name: My Docs
site_description: 基于 mkdocs 的技术电子书

theme:
  name: readthedocs

更多主题

MkDocs预置主题:https://www.mkdocs.org/user-guide/choosing-your-theme/

自定义主题:https://www.mkdocs.org/user-guide/customizing-your-theme/

还有其他更多配置可在gen_nav.py的HEADER里添加:

  • locale: zh_CN(中文本地化)
  • navigation_depth(导航深度)
  • sticky_navigation(侧边栏跟随滚动)

文章

文章用Markdown编写,保存到docs目录,文件名建议以六位数字加短横线如000001-开头,保证顺序。

推荐使用PyCharm配合Markdown Image Kit插件管理图片资源,复制图片粘贴到md中,自动转存为assets/相对路径:

预览

执行serve.py:

INFO    -  Building documentation...
INFO    -  Cleaning site directory
INFO    -  Building documentation to directory: /var/folders/xs/g_0461kx28n2xk7whfkrsnw00000gp/T/mkdocs_38bvc8cg
INFO    -  Documentation built in 0.10 seconds
INFO    -  [13:10:59] Watching paths for changes: 'docs', 'mkdocs.yml'
INFO    -  [13:10:59] Serving on http://127.0.0.1:8000/

访问http://127.0.0.1:8000/效果如下:

发布

GitHub新建仓库,以github.io作为后缀,并设置GitHub Pages:

克隆yourname.github.io到本地,建议选择SSH。

和ebook-mkdocs平级:

├── ebook-mkdocs
├── yourname.github.io

修改deploy.py的目录:

# ⚠️ 改成你自己的 GitHub Pages 仓库名(与本项目平级,已 clone 且配好推送)
TARGET = ROOT.parent / "yourname.github.io"

执行deploy.py,它会生成site静态文件夹,复制到yourname.github.io推送GitHub仓库。

访问https://yourname.github.io,即可在线查看电子书。搭建电子书网站全程免费。

搜索

MkDocs默认使用Lunr.js做搜索,但Lunr不支持中文分词。AI解决了这个问题:在docs/_static/目录下放入lunr.zh.js(中文分词插件),然后在构建钩子post_build.py中将其注入到搜索配置中,这样搜索就能支持中文了。

结语

到这里,从零搭建一个免费电子书网站的全流程就介绍完了。回顾下核心步骤:

  • 克隆源码:拿到项目模版,安装依赖
  • 编写文章:用Markdown写内容,按规范命名保证顺序
  • 本地预览:serve.py一键启动预览
  • 发布上线:deploy.py一键推送到Github Pages

核心思路是:用脚本自动化配置文件生成,让你专注内容创作。MkDocs负责静态站点生成,Github Pages负责免费托管。整套源码由AI辅助生成,也解决了中文搜索等问题。

如果你在实践过程中遇到问题,或者想交流搭建心得,欢迎加入技术群或私信联系我。也欢迎给GitHub仓库点个Star,你的支持是我持续创作的动力。