构建基于 AST 的高性能 Markdown 编辑器与渲染器开发计划
这是一个极具挑战但也非常有趣的项目。为了实现类似 ByteMarkdown 的高性能、可扩展且框架无关的 Markdown 引擎,我们需要从底层开始构建。
我们将采用 Monorepo 架构,将核心逻辑(AST解析、渲染)与 UI 层(Vue/React 适配器、编辑器界面)分离。
核心架构设计 (Architecture)
我们将项目分为以下几个包(Packages):
@my-md/core: 核心引擎。包含 Lexer(词法分析)、Parser(语法分析)、AST 定义、Plugin Loader 和 Base Renderer。不依赖任何 UI 框架。@my-md/vue: 适配 Vue 2.x 和 Vue 3.x 的组件封装。@my-md/react: 适配 React 的组件封装。@my-md/editor: 基于核心引擎的编辑器 UI 实现(支持分屏预览、滚动同步)。examples: 演示项目。
开发阶段规划 (Implementation Phases)
阶段一:项目初始化与基础设施 (Infrastructure)
- 初始化 Monorepo 环境 (使用 pnpm workspaces)。
- 配置 TypeScript、ESLint、Prettier 和 Jest/Vitest 测试环境。
- 建立基础目录结构。
阶段二:核心 AST 引擎开发 (Core Engine) - 最关键部分
我们将手动构建 AST 解析器,不依赖 markdown-it 或 marked。
- AST 定义 : 定义
Node接口 (Type, Value, Children, Props)。- 设计 Block Nodes (Header, Paragraph, List, Blockquote, CodeBlock)。
- 设计 Inline Nodes (Text, Strong, Em, Link, Image)。
- Lexer (词法分析器) :
- 编写正则或字符扫描逻辑,将 Markdown 文本转换为 Token 流。
- 区分 Block Token 和 Inline Token。
- Parser (语法分析器) :
- Block Parser: 处理文档结构,生成 AST 骨架。
- Inline Parser: 处理文本内部样式,填充 AST 细节。
- HTML Renderer :
- 遍历 AST 并生成标准的 HTML 字符串。
阶段三:插件系统设计 (Plugin System)
为了支持扩展性(如支持 LaTeX 公式、Mermaid 图表、自定义容器),我们需要一个强大的插件系统。
- 设计基于 Hooks 或 Middleware 的插件架构。
- 支持
beforeParse,afterParse(AST 变换),render等生命周期钩子。 - 实现一个示例插件(例如:解析
::: warning自定义容器)。
阶段四:框架适配 (Framework Adapters)
- React 适配器 :
- 创建
<MarkdownRenderer />组件。 - 使用
useMemo优化解析性能。 - 支持自定义组件替换 HTML 标签(例如用
<MyLink>替换<a>)。
- 创建
- Vue 适配器 :
- 实现 Vue 3 (Composition API) 组件。
- 实现 Vue 2 兼容层(如果需要)。
- 利用 Vue 的
h函数直接渲染 VNode,提高性能(可选,或直接渲染 HTML)。
阶段五:编辑器功能实现 (Editor Features)
- 实现双栏布局:左侧输入框(Textarea),右侧预览区。
- 滚动同步 (Scroll Sync): 实现左右两侧基于百分比或元素位置的滚动同步。
- 实时高亮: 简单的语法高亮(可选,视进度而定)。
阶段六:测试与验证 (Testing & QA)
- 单元测试: 针对 Parser 的各种 Markdown 语法编写测试用例(Snapshot Testing)。
- 集成测试: 确保 Vue 和 React 组件能正确加载并渲染。
- 性能测试: 解析长文本的性能基准测试。
关键技术难点预判
- 嵌套列表与引用: 解析嵌套的 Markdown 结构(如列表里套引用,引用里套代码块)是解析器最难的部分,需要使用栈(Stack)或递归下降算法。
- HTML 安全: 防止 XSS 攻击,需要实现 HTML 清洗机制。
- Sourcemap / 定位: 为了实现精准的滚动同步,AST 节点必须包含原始文本的行号信息(Line mapping)。
准备好后,我们将从 阶段一 和 阶段二 开始,优先攻克 AST 解析核心。