写下一篇 Markdown,并不等于浏览器已经能访问它。一个静态博客至少包含两个阶段:构建页面和提供访问。

先看完整链路

构建阶段:Markdown + Front Matter + 主题模板 + 站点配置
                         ↓ Hugo
                HTML / CSS / JavaScript / JSON 等文件

访问阶段:浏览器 ── HTTP(S) 请求 ──→ Nginx
        浏览器 ←── 已生成的静态文件 ── Nginx

按内容流向,也可以概括为:

Markdown → Hugo → HTML/CSS/JS → Nginx → 浏览器。

这里的 Nginx 是本站后续计划使用的 Web 服务器。本篇解释工作原理,不代表本站已经完成 Nginx 或 HTTPS 部署。

Markdown:专心描述内容

Markdown 用简洁的标记描述标题、段落、列表、链接和代码,例如:

## 一段技术笔记

记录环境与复现步骤,比只写“问题解决了”更容易复用。

- 系统版本
- 操作步骤
- 观察到的现象

Hugo 文章开头还会有 Front Matter,保存标题、发布时间、分类与 draft 等元信息。正文和元信息都保存在文件中,便于阅读、编辑和版本管理。

Markdown 解决的是写作与内容结构问题。页面外观、菜单、资源地址等工作由后续环节处理。

Hugo:在发布前生成页面

Hugo 读取内容文件,将 Markdown 转成 HTML,再结合模板和配置生成完整页面。PaperMod 提供本站使用的模板与基础样式。

例如,源文件与输出文件之间可以形成这样的对应关系:

content/posts/markdown-to-browser/index.md
                    ↓ hugo --minify
public/posts/markdown-to-browser/index.html

简化后的 HTML 内容可能是:

<h2>一段技术笔记</h2>
<p>记录环境与复现步骤,比只写“问题解决了”更容易复用。</p>

这是结构示意,实际页面还会包含导航、文章元信息、资源引用等。--minify 会对生成结果执行压缩,减少不必要的空白等内容;它不负责把网站自动发布到公网。

HTML、CSS、JavaScript:浏览器理解的资源

三个组件各有职责:

  • HTML 描述内容结构,例如文章标题、段落、链接和代码块。
  • CSS 控制字体、颜色、间距以及不同屏幕下的布局。
  • JavaScript 为需要的交互提供逻辑,例如主题切换和本地搜索。

静态网站仍然可以交互。本站的搜索方案是在构建时生成 index.json,浏览器加载它之后用本地 JavaScript 匹配关键词,不需要为每次搜索运行一套数据库查询服务。

Nginx:把文件发送给请求它的人

在计划中的部署方式里,Nginx 会监听配置的端口,接收浏览器请求,并根据请求路径查找静态文件。

例如,访问文章路径时,将来可以由 Web 服务器返回对应目录的 index.html;浏览器看到页面中的 CSS 或 JavaScript 地址后,再请求这些资源。找不到的资源应得到合适的 404 响应。

在这条静态文件服务链路里,Nginx 不需要读取 Markdown,也不需要每次调用 Hugo。文章修改后,应先重新构建,再更新用于提供访问的静态产物。

HTTPS 则在 HTTP 通信之上提供传输加密和服务器身份验证,需要单独配置证书与相关服务。本篇没有执行这些部署步骤。

浏览器:组合资源并展示页面

浏览器拿到 HTML 后解析内容,读取 CSS 并计算布局,在需要时执行 JavaScript,最后把页面呈现在屏幕上。

浏览器也可能使用缓存来复用之前取得的资源。缓存策略会影响更新何时可见,因此正式部署时应分别考虑 HTML 与带内容指纹的静态资源,而不能只确认“文件已经复制成功”。

为什么这个博客不需要数据库

本项目的文章正文、日期和分类已经保存在 Markdown 与 Front Matter 中。Hugo 在构建阶段就能读取这些文件,生成文章页面、分类目录、RSS 和搜索索引。

访客阅读时,请求的是现成文件,不需要通过数据库临时拼装文章,因此运行这套博客不依赖数据库。

这并不意味着所有静态网站都排斥数据库。内容可能来自其他系统,也可以另接评论或搜索服务;只是这些组件不是当前博客的必要条件,本项目也没有引入它们。

如何区分构建成功与上线成功

在本项目中,可以先执行:

hugo --minify
python3 scripts/verify-build.py

这两步用于生成并检查静态产物。真正上线还需要确认 Web 服务器、域名解析、网络访问与 HTTPS 等环节,之后再从浏览器实际访问验证。

Git 负责记录内容与配置变化,Hugo 负责构建,Nginx 负责计划中的文件服务,浏览器负责展示。分清这些职责,排查问题时就能先判断故障出在内容、构建、资源路径还是访问链路。

进一步阅读