【免费下载链接】30-seconds-web
Website infrastructure for 30-seconds projects.
在30-seconds-web中,每一篇 Markdown 代码片段如何自动变成带语法高亮、可复制按钮、响应式排版的文章?答案是它自研的一套Markdown 解析引擎:由remark解析、GFM扩展、Prism高亮、AST 改写与正则后处理组成。本文带你快速读懂这条从.md文件到精美 HTML 的完整流水线 🚀
一、解析流水线全景
整条流水线在构建阶段执行,核心入口是 Extractor 类。它做四件事:
- 读取文件:用 glob 扫描
content/snippets/**/s/*.md全部 Markdown 源文件 - 解析元数据:分离 front-matter 头部与正文
- 转换正文:调用
MarkdownParser.parseSegments生成 HTML - 落盘输出:写入
content.json供 Astro 页面渲染
各模块分工如下:
| 模块 | 路径 | 职责 |
|---|---|---|
| 总入口 | src/blocks/extractor/index.js | 调度提取流程、组装数据 |
| 文本解析 | src/blocks/extractor/textParser.js | front-matter 拆分、按 glob 批量读取 |
| Markdown 引擎 | src/blocks/extractor/markdownParser.js | remark + Prism 高亮 + AST 改写 |
| 测试用例 | src/test/blocks/extractor/markdownParser.test.js | 验证解析输出 |
二、第一步:front-matter 提取元数据
每个片段.md文件都以 YAML front-matter 开头(标题、标签、语言、作者等)。TextParser 借助front-matter库把文件切成两半:
- attributes:
title、tags、language、dateModified、author等元数据 - body:纯 Markdown 正文
随后 extractSnippets 对正文做切分:取第一个代码围栏```之前的文字作为shortText(列表卡片摘要),并用 stripMarkdownFormat 去掉标记符号生成seoDescription(SEO 描述超过 140 字符还会发出警告 ⚠️)。
三、第二步:remark + GFM 构建语法树
真正的主角登场——markdownParser.js 中,remark 解析器只配了 4 行关键选项:
commonmark: true:兼容 CommonMark 规范gfm: true+remarkGfm:支持表格、删除线等GFM(GitHub Flavored Markdown)语法footnotes: true:支持脚注pedantic: true:启用保守模式,让老式写法也能正确解析
remarkParser.parse(markdown)执行后,Markdown 文本变成一棵mdast 语法树——每个段落、标题、代码块都是树上的节点。这棵树是后续所有改写的操作对象 🌳
四、第三步:Prism 高亮与语言按需加载
引擎遍历 AST 中所有code节点,对每个代码块做语法高亮。这里有两个精巧设计:
语言按需加载(省内存)
_loadPrismLanguage 不会一次性加载 Prism 全部语言包,而是:
- 先通过 _getBaseLanguageName 把别名(如
js→javascript)还原成 Prism 的规范名 - 递归加载依赖语言后,才
require对应组件文件 - 不支持的语言直接 HTML 转义输出,绝不报错中断构建
高亮结果注入 AST
_highlightCode 生成高亮 HTML 后,代码节点被改写成html类型节点,并包上:
- 外层
div.code-highlight:承载语言标签与复制按钮 pre.language-xxx+data-code-language:记录语言全称,供前端展示
一个细节:连续两个相同语言代码块的识别逻辑 会把文章末尾的最后一块自动标记为 "Examples",区分"定义示例"与"用法示例"。
五、第四步:从 AST 到精美 HTML 的后处理
toHAST+hastToHTML把语法树序列化为 HTML 后,textTransformers 数组再用一组正则做"最后一公里"美化,全部在 parseSegments 中逐条应用:
- 🔗外链安全:所有
http(s)://链接自动加target="_blank" rel="nofollow noopener noreferrer" - 🏷️标题降级:
h1~h3统一降为h3、h4~h6降为h4,并生成锚点 ID(如 convertToValidId 把标题转成 kebab-case) - 📋复制按钮:每个
</pre>后插入"复制代码"按钮(样式预制于 prefabs) - 🖼️图片优化:相对路径图片自动拼接静态资源前缀,普通格式自动包装成
<picture>+ WebP 双格式输出 - 📊表格适配:表格外包一层
table-wrapper,实现横向滚动
六、关键源码索引
| 想要了解 | 去看这里 |
|---|---|
| 流水线总调度 | src/blocks/extractor/index.js#L119-L247 |
| remark 配置与 GFM 启用 | src/blocks/extractor/markdownParser.js#L26-L34 |
| Prism 语言按需加载 | src/blocks/extractor/markdownParser.js#L137-L167 |
| 后处理美化规则表 | src/blocks/extractor/markdownParser.js#L36-L102 |
| 依赖版本(remark/prismjs 等) | package.json#L25-L36 |
总结
30-seconds-web 的 Markdown 解析引擎用一条清晰的流水线回答了"纯文本如何变精美文章":
- front-matter分离元数据 → 2.remark + GFM构建语法树 → 3.Prism按需高亮代码 → 4.正则后处理完成链接安全、标题锚点、复制按钮、图片 WebP 化。
每一环都独立可测(见 markdownParser.test.js),这也是它值得借鉴的地方:解析与美化解耦,让每篇文章都"30 秒"内构建完成⚡
【免费下载链接】30-seconds-web
Website infrastructure for 30-seconds projects.
相关推荐
推荐文章:remark-gfm - 支持GitHub Flavored Markdown的强大插件
推荐文章:remark gfm 支持GitHub Flavored Markdown的强大插件 项目介绍 remark gfm 是一个强大的 remark 插件
终极Prism语法高亮指南:快速打造专业级代码文档的完整教程
终极Prism语法高亮指南:快速打造专业级代码文档的完整教程 Prism是一款轻量级、功能强大且优雅的语法高亮库,源自Dabblet项目。作为开发者必备的工具,
前端UI组件彻底解决!React-Markdown集成remark-gfm实现GitHub风格Markdown全指南
彻底解决!React Markdown集成remark gfm实现GitHub风格Markdown全指南 你还在为React项目中Markdown渲染缺失表格、
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考