
写技术文档这件事很多人第一反应是“能用 Word 就行了搞那么多花样干嘛”。但真到了项目交接、团队协作、开源对外的时候你会发现文档的阅读体验和可维护性直接决定了别人愿不愿意用你的项目、同事能不能快速接手。我这几年写过的技术文档、README、接口说明加起来有上百万字工具换来换去最终留下并且愿意反复安利的只有 Markdown。这份文档不是给你念语法手册的而是把我从入门到踩坑再到梳理出一套完整工作流的经验整理出来。读者不管是初学者、经常写接口文档的后端还是需要整理知识库的运营都可以照着里面提到的思路快速打造一份结构清晰、排版舒服、便于维护和导出的技术文档。1. 为什么技术文档圈的共识是“Markdown优先”在铺开聊操作之前先把底层逻辑讲清楚。很多人不明白为什么明明有 Word、有各种在线文档大家还要选 Markdown。我的看法是这不只是工具之争而是写作理念和工作流的一次升级。1.1 Markdown 解决的核心问题Markdown 用极简的纯文本标记比如#表示标题、**表示加粗、反引号表示代码它解决的是“内容与样式分离”的问题。你可以先专注把内容写顺完全不用像在 Word 里那样一边写一边被字号、行距、缩进打断思路。写完一段内容之后样式交给渲染器统一处理整份文档的格式天然一致。我常用一个比喻Markdown 写作类似写代码时的“关注点分离”。你在写一个函数的时候不需要关心这个函数最终显示在页面哪个位置、字号多大你只需要关心逻辑对不对。技术文档同样如此写作阶段最大成本是逻辑梳理而不是字体选择。Markdown 刚好切在这个点上。另外Markdown 是纯文本格式不需要安装特定软件来“打开”。用记事本能看、用 Git 能做版本管理、用代码编辑器能同步编辑这些都是 Word 二进制格式做不到的。对技术团队来说“文档可 diff、可回溯”是维护价值的命脉。1.2 “语法门槛高”其实是伪命题不少人被 Markdown 劝退是因为听说要记一堆语法。实际常用的标记不超过 10 个。先把标题、加粗、列表、代码块、链接这五样用熟你已经能写 90% 的文档。我自己带新人时有一个训练方法先要求他们把自己任务的周报改用 Markdown 写一周。你会发现一周之后标题和列表基本不会出错了。再写两周表格、引用、图片也顺手了。因为 Markdown 是“所见即所得”的语法它跟 Word 中的“CtrlB 加粗”本质上没有区别只是把按钮操作换成了字符标记。真正有门槛的不是语法是把头脑里“内容为王”的观念转换成“内容与格式都重要”的完整意识。1.3 契合代码生态是技术文档的天然选择技术文档里绕不开代码片段。如果用 Word 贴代码很容易遇到字体错乱、背景色丢失、缩进被自动“修正”等经典问题轻则影响阅读重则让代码块复制出来直接编译不过。Markdown 有原生的代码块语法用三个反引号包裹代码并且可以通过标注语言类型实现语法高亮这在 GitHub、GitLab、VS Code、语雀、飞书文档里都有一致的表现。代码是技术文档的“一等公民”用 Markdown 承载技术内容是最自然的匹配。2. 写一份优雅文档先从编辑器选型开始工欲善其事必先利其器。但这里说的“器”不是越贵越好、越复杂越好而是要匹配你自己的使用场景。2.1 一套能直接用的编辑器判断标准我总结了几条硬指标新手可以直接按这个标准筛工具渲染预览是否实时、是否不需要频繁手动刷新是否支持代码块语法高亮是否能通过扩展机制支持 Mermaid、数学公式等进阶语法导出文档是否方便至少能转 HTML/PDF文件是否保存在本地、格式是否通用不能把内容锁死在私有数据库里。我见过不少人一开始就追求功能“大而全”的编辑器结果配置插件花了两天真正写文档的时间反而被严重压缩。这个领域最合适的工具一定是打开就能写、高频功能顺手的那一款。2.2 我日常的主力VS Code 插件方案如果让我只推荐一套工具我会选“VS Code Markdown 插件”组合。VS Code 本来就是一个免费开源的代码编辑器启动速度快、生态成熟最重要的是它对 Markdown 的支持不会被平台绑架。基础配置按以下三步操作即可安装 VS Code自带 Markdown 预览按CtrlShiftV快速打开预览按CtrlK V可以进入分屏实时预览模式。安装 Markdown All in One 插件。这个插件能自动生成目录、自动补齐列表序号、支持表格格式化、快捷键加粗等显著提升效率。安装 markdownlint 插件用来检查语法规范。它会在写错的地方给出黄色波浪线警告比如标题层级跳级、列表符号不统一等实时提醒比事后检查高效得多。如果平时需要画流程图或架构图可以考虑安装 Markdown Preview Mermaid Support 插件。装上之后在预览中可直接渲染基于文本描述的流程图、时序图和类图。要强调的是图本身就是代码这样维护文档时不用改截图重新上传只需要改几行文本描述。2.3 其他值得上手尝试的场景化编辑器Typora界面接近 Word输入标记后实时隐藏符号给你一种“纯写作”的感觉。适合不习惯分屏预览的人。Obsidian基于本地 Markdown 文件建立双向链接适合做个人知识库、长期积累笔记插件生态也很丰富。MarkText开源免费颜值在线基础写作够用。语雀、飞书文档等在线工具支持 Markdown 语法输入和粘贴适合团队云端协作同时解决“文档要分享给别人看”的场景。我的经验是本地工作流选择 VS Code写作和整理选择 Obsidian对外分享协作时把同一份 Markdown 粘贴到团队在线文档中排版。三个组合互为兜底。3. 必须弄清的 Markdown 语法细节和误区语法是地基这一部分我把高频语法和使用中最容易踩的坑放到一起讲。知道“怎么写是对的”很重要但知道“什么时候不要用某个写法”更关键。3.1 标题、加粗、列表最基础也最容易出错标题是最常用的语法。一级标题用#二级用##以此类推到六级。常用于文档主标题或章节标题。容易出问题的场景有三个标题后面的井号前面必须加空格。写成#标题时部分渲染器会当作普通文本处理不会解析成标题。标题层级必须按顺序跳不要从##直接跳到####这破坏了内容的信息架构目录结构会显得突兀。#在文档中同时代表 H1 标题。不少项目的主 README 打开之后直接把#当成了项目名放在顶部如果你的文档会被当作子页面嵌入其他站点则需要从##开始写作避免重复出现顶级标题。加粗用**文字**或__文字__斜体用*文字*或_文字_。要注意符号和文字之间不留空格留了空格会被当作普通星号处理。中英文混排时我个人习惯只对需要强调的中文词语做加粗处理不要整段全部加粗否则视觉上会失去重点。列表分为无序列表和有序列表。无序列表用-、*或建议全篇统一只用一种符号避免混用后与 markdownlint 规则冲突。有序列表用数字加点例如1.。最经典的坑是在 Markdown 源码中有序列表的数字即使全写成1.大多数渲染器也会自动递增编号。所以如果想调整列表顺序直接调整行序即可不必手动改每个数字。3.2 表格、代码块、引用、链接与图片表格是技术文档中用来做参数对比、状态说明、排期计划的最佳载体。基本语法由管道符和短横线组成第一行是表头第二行用于区分表头与内容区至少写三个短横线例如|---|--|。要注意表格单元格内如果包含竖线|需要用反斜杠转义写成\|。我在写枚举值或者命令行帮助文本时经常踩到这一点比如描述“参数a|b”不转义的话表格会直接被切分。代码块可以使用行内代码和块状代码。行内代码用单个反引号包裹适合在句子中提及函数名、文件名或命令例如npm install。块状代码用三个反引号包裹并可以标注语言类型python print(hello markdown) 语言标注可以带来语法高亮同时对文章 SEO 也有好处。这个细节最容易被忽略不少人在文档里永远写裸代码块没有标注语言代码没有高亮阅读体验差别非常明显。引用语法用开头适用于需要强调的注意事项、引用他人观点等场景。要提醒的是引用块内部也可以嵌套其他 Markdown 语法但不能把长代码片段整体包进引用块里否则会出现横向滚动、代码变窄等问题。链接语法写作[文字](地址)。如果链接指向文内某章节可以用锚点跳转。图片语法在链接前加一个感叹号写作。替代文字不是可有可无的它对视觉障碍用户和图片加载失败时的提示都很重要同时也在搜索引擎中有作用。3.3 换行、转义与中英文混排Markdown 的换行规则是最让人困惑的一点。在源码里按一次回车换行渲染结果中通常不会出现新的段落很多引擎中相邻行会被合并为一个段落。想要一个新段落需要在两个段落之间空一行。如果只想在某一行内产生软换行可以在行尾加两个空格后再回车这在部分渲染器里生效但也会被部分渲染器忽略。最稳妥的规则是一切换段落用空行不追求强制软换行彻底避免两个空格带来的兼容性问题。转义符号是反斜杠\。在需要展示 Markdown 保留字符本身时可以用反斜杠处理例如写\#显示为普通井号。很多人不知道这一点在文档里讲“注意 # 号不要变成标题”时反而真的变成了标题这就是转义没有做对。中英文混排在技术文档中非常常见。我维护的文档规范是中文与英文之间留一个空格中文与数字之间留一个空格全角标点与英文单词之间不留空格代码、文件名等一律保持原始大小写。这类规范虽然不能通过 Markdown 语法强制实施但对最终渲染出来的视觉效果和可读性影响很大。3.4 影响阅读体验的排版细节写文档时不要在每段文字后面都加一个空行去凑“段落感”。真正的段落信息密度应该高一些小段并不意味着一定要频繁断行。技术文档需要呼吸感但也要避免把一句完整表达拆成多段导致读者阅读时要频繁上下滚动。另外用词要统一。比如“用户”和“用户端”不要混用一个文档里描述同一对象统一口径。严谨的创作者会把这看成文档的“一致性测试”。4. 让技术文档做到“优雅”的几个实操准则语法熟悉了之后很多人会发现自己写的文档虽然格式没错但看起来依然很像一份“半成品”。这通常不是语法问题而是结构设计和排版细节没跟上。文档的优雅感来自刻意设计不是自然发生。4.1 先定目录结构和标题层级再动笔写内容我写任何长度超过 500 字的文档都不会直接打开编辑器从第一行开始敲。我会先用无序列表把整个文档的标题要点列出来铺成一个大纲。这一步帮我把逻辑线条理顺也帮我在后续写作时不跑偏。大纲确定后再给每个大纲点分配标题层级。在实际项目里我通常定这样一套规范#只有在独立文档最顶部时使用对应项目名或文档名##一级章节比如“快速开始”“核心概念”“API 参考”###章节下的功能点或步骤比如“创建项目”“初始化配置”####更细的补充说明仅在###内容确实需要拆分时使用。经常看到有人把内容全堆在一级标题的子标题里标题一层套一层最深能到六级。实际上层级越深说明前面的结构越不清晰。如果发现自己要写到五级标题建议把内容重新组织或拆分成独立文档。4.2 按“信息块”组织内容段落不要每行都换我写文档时把每个小节当成一个信息块每个信息块内尽量做到“先结论后解释”。比如写某个接口的说明一个信息块的结构是接口用途一句话讲清楚然后给请求方法、路径、参数表格、示例响应最后是注意事项。读者可以在 30 秒内判断这段内容是否需要细读这其实是在尊重读者的时间。段落与段落之间用空行隔开。不要用两个空格做软换行也不要因为想在文档中制造“每行一句”的卡片感就把断句频率提得很高。多读两遍自己写的文档如果阅读时像在刷短视频说明剪辑过度了如果像在看工作报告说明节奏太平了。好的技术文档节奏应该介于两者之间信息密度高但没有压迫感。4.3 配图怎么处理最省心技术文档一定会配图架构图、流程图、截图、界面标注这些是文字难以替代的部分。配图处理有几个长期经验值得分享优先使用相对路径保存图片到images或assets目录再在文档中使用相对路径引用这样文档整体可以随仓库迁移不会出现图片外链失效问题。少数场景可以外链但外链图床有随时失效风险如果你不希望多年后文档全部变成裂图就把重要的图本地化。流程图和架构图优先用 Mermaid 等文本图表来表达。代码形态的图可以放进 Git 做版本管理每次修改都有记录不会出现“图改了但没人知道改了什么”的问题。截图的替代文本要有描述性不能写一个空括号。对无障碍和 SEO 都有帮助。5. Markdown 文档的导出与分发Markdown 写得再漂亮最终还是要给别人看。这里的“别人”可能并不是 Markdown 的使用者对方只用 Word、PDF 或在线文档。所以文档的导出能力是非常实战的一部分。5.1 用 Pandoc 一劳永逸解决 Word/PDF 转换先讲一个很多人没意识到的事实Markdown 转 Word 最稳定的方案并不是复制粘贴而是使用 Pandoc。Pandoc 是一个开源免费的命令行转换工具支持几十种文档格式互转。安装 Pandoc 之后使用命令pandoc input.md -o output.docx就能把 Markdown 文件转成 Word。对于需要提交给非技术同事、或者给客户方走审批流程的场景来说这个能力非常实用。生成的 Word 文档标题层级是真实可用的样式不是纯文本仿标题。需要注意的是如果文档中包含未被本地扩展支持的 Mermaid 图表转换前需要把图导出成 PNG 或 SVG 再嵌入文档否则渲染端只能看到图表代码文本。转 PDF 有两种路线。一种是先转 HTML再用 Chrome 的打印功能保存为 PDF另一种是安装 LaTeX 环境后直接让 Pandoc 输出 PDF。后者排版更专业但依赖较重。大多数场景下我推荐先用pandoc input.md -o output.html生成 HTML再用浏览器打印为 PDF整个过程简单可控。5.2 不装插件、用浏览器直接预览 Markdown 的轻量方案有时候你拿到一份.md文件只想快速查看不想为它单独安装软件。这种场景用浏览器解决最合适。Chrome 的官方插件市场中有不少 Markdown 预览器。安装后在 Chrome 地址栏输入本地文件路径或直接把.md文件拖入浏览器即可看到排版后的页面通常还会附带代码高亮和目录侧边栏。如果不想安装扩展可以用线上的渲染工具把 Markdown 文本粘贴进去看预览。但这种方式不适合处理内部敏感内容涉及公司代码或未公开项目信息时还是在本地完成预览更稳妥。5.3 从 Markdown 到在线文档与知识库团队内部现在多使用飞书文档、语雀等工具协作。好消息是它们基本都支持 Markdown 输入。比如在飞书文档中粘贴 Markdown 内容云端文档可以较好地还原标题、表格、列表等格式。在语雀中对于深度 Markdown 用户还提供了源码编辑入口可以最大化保留原始语法。需要提醒的是不同在线平台对 Markdown 的支持粒度不同。有的平台不支持 Mermaid有的不支持 Latex 公式这时候要提前确认目标平台能力而不是写完整篇再搬过去发现图表全部失效。遇到这种情况我给的建议永远是文档源文件保留一套 Markdown 版本作为“事实源”对外发布的在线文档作为“渲染快照”。两者同步时优先保证事实源正确。6. 进阶玩法让 Markdown 撑起更复杂的场景当你的文档量越来越大单一.md文件已经装不下内容的时候就需要考虑知识的组织方式。这部分我把从单文档向多文档、从纯展示向复杂交互过渡的一些玩法展开聊聊。6.1 目录生成与内部锚点跳转文档一旦超过 300 行没有目录的文档就像没有路标的地铁站。Markdown 本身没有原生“一键生成目录”的语法但大部分编辑器或渲染器都提供了解决方案。在 GitHub 等平台上可以在文档中添加自动生成的目录链接列表。VS Code 里的 Markdown All in One 插件支持快捷键生成目录且能按标题层级展示。Obsidian 也内置了大纲侧边栏不需要额外操作。要注意的是目录中的锚点链接通常基于英文标题或标题中的标识生成中文标题在某些平台会变成无意义字符。如果想让锚点更稳定可以在标题下方手动插入一个a namecustom-anchor/a标签并用[跳转到指定位置](#custom-anchor)引用。6.2 图表、数学公式与更多 Markdown 扩展能力技术文档经常需要画时序图、架构图很多编辑器支持 Mermaid 渲染。这个语法通过文本描述节点和连线维护起来比截图方便太多修改流程图后不需要重新画图或截图可以放到 Git 里走 Code Review团队里不懂排版的人也能看懂改了什么逻辑。Mermaid 不是 Markdown 标准而是渲染器扩展能力因此不同平台支持度不同。GitHub 支持 MermaidVS Code 预览需要装插件飞书文档则需要团队管理员配置特定应用或插件。在引入任何非标准扩展前都建议先验证目标阅读平台是否支持否则内容会以原始代码形式暴露给读者是非常不优雅的结果。数学公式是另一个高频需求。Markdown 中嵌入 LaTeX 公式在支持 KaTeX 或 MathJax 渲染器的平台中才能正常显示。如果只是写普通内部文档尽量避免用大量公式如果确实需要先确认平台能力再动手。6.3 从 README 到博客建立一套可复用的文件模板Markdown 的复用性很强我给自己维护着一套文档模板任何新项目开始时直接复制一份骨架README.md项目入口包含项目简介、快速开始、目录结构、常见问题docs/guide.md用户指南针对使用场景展开docs/api.md接口与参数详解以表格为主docs/CHANGELOG.md版本变更记录。这套结构的好处是不同文档边界清晰每个文件都能长期维护不会出现 README 越来越长、最后变成“什么都写了又什么都没写”的情况。7. 常见问题排查与避坑实录写 Markdown 过程中会遇到不少“看起来很小但实际很干扰”的问题我把这些高频问题整理成速查表基本能覆盖大多数情况。现象原因解决方案写了#标题但预览不生效#后没有空格统一# 空格 标题表格显示错乱单元格内包含未转义的 换行后文字没有变成新段落段落之间没有空行在两个段落之间增加空行有序列表序号全部显示为 1部分渲染器自动编号正常情况会自动递增如未生效则需要手动编号图片显示裂图图片路径错误或文件未同步确认相对路径指向的文件真实存在代码块没有高亮缺少语言标注在开头三个反引号后加上python、bash等语言名Chrome 打开.md显示源码未安装渲染扩展安装 Markdown 预览扩展或将文件内容粘贴到在线编辑器中文标题锚点跳不过去不同渲染器中文锚点规则不一致使用a nameenglish-anchor/a手动设置锚点7.1 环境不支持 Markdown 编辑器怎么办有些场景比如公司内网机器受限、或者浏览器环境没有安装 Java 组件可能导致某些基于浏览器的 Markdown 编辑器不能正常启动。如果你遇到类似“Your environment does not support JCEF, cannot use markdown editor”的报错不用慌张这通常说明当前客户端环境缺少某个图形组件而不是 Markdown 文件本身有问题。处理思路是绕过图形编辑器直接使用纯文本编辑器打开文件并把内容粘贴到支持 Markdown 渲染的在线平台或另一台正常机器中预览。文件本身是一切工具只是展示层。这也正好体现了 Markdown 纯文本格式的兜底价值。7.2 在 VS Code 中无法显示目录侧边栏VS Code 内置大纲需要满足两个条件文件语言模式需要识别为 Markdown标题层级需要正确。如果你打开.md文件却看不到目录先检查右下角语言模式是否显示为“Markdown”如果不是就手动切换。此外只有用#开头的行才会进入大纲如果写的是 HTMLh2标签VS Code 不会把它识别为标题。7.3 表格从 Markdown 复制到其他平台后错乱表格复制错乱多半是源平台与目标平台对 Markdown 兼容性的差异导致的。比如从 GitHub 复制表格粘贴到语雀可能会带上多余的空格或失去对齐格式。我的建议是不要直接跨平台复制。最可靠的做法是双击进入某个单元格全选整个表格后复制再在目标平台选择“粘贴为纯文本”或“Markdown 粘贴”。更稳妥的做法是直接把.md文件在目标平台导入或使用 Pandoc 转成 docx 再打开复制。7.4 VS Code 编辑器改动标题后井号消失怎么办有的 Markdown 编辑器开启“格式化标题”功能后会把原来的## 标题显示为纯大标题预览。这不是文件被破坏只是视图模式把标记隐藏了。此时文件内容的原始语法没有任何问题。如果想要恢复显示#可以查看编辑器是否开启了高级预览或“隐藏 Markdown 标记”的选项把它关闭即可。不要为此去修改文档源码很多时候改来改去反而把格式弄坏了。在实际使用中我都会要求团队在提交文档到仓库前至少在纯文本模式下打开文件检查一遍。不是不相信编辑器而是想确认源文件里没有冗余格式、没有错误的缩进、没有多余的花式标记。这一条检查习惯帮我省掉了很多后期“救火”的时间。最后再分享一个我从第一次接触 Markdown 就保持到现在的习惯永远保留一份纯文本格式的源文件。不管在线协作工具迭代多快、界面变化有多大源文件攥在自己手里格式永远通用、内容永远可控。把文档当代码一样管理是技术写作最让人安心的一件事。