尖括号容器,是 Markdown 语法的一部分
把 <Callout>、<Tabs>、<Mermaid>这类标签解析成 mdast 节点,渲染成 React 组件,写回时逐字还原。作者写 Markdown,不用碰 JSX。
npm i @heikeson/md-engine<Callout type="tip" title="提示">
容器里的内容照样是 Markdown,可以写 `行内码`、写列表。
</Callout>
<Tabs>
<Tab value="npm">npm i @heikeson/md-engine</Tab>
<Tab value="pnpm">pnpm add @heikeson/md-engine</Tab>
</Tabs>提示
容器里的内容照样是 Markdown,可以写 行内码、写列表。
npm i @heikeson/md-engine
pnpm add @heikeson/md-engine
容器清单
九个容器加一个通用 div。属性只能传字符串和裸布尔,子项写成嵌套标签,所以内容始终保持纯文本。
标签属性子项说明
Callouttype · title · icon—提示块,type 有 7 种Tabs—Tab选项卡,value 是标签文案Steps—Step分步说明,title 是步骤名Cards—Card卡片组,子项可自闭合Accordion—AccItem折叠面板,type 控默认开合Files—Folder / File文件树,图标按扩展名匹配TypeTable—TypeItem属性表Imagesrc · alt · align · width · caption · zoom—自闭合叶子Mermaidtitle · height—容器体是原始文本divclass · id—通用分块,属性透传到 DOM包里有什么
五个入口分开打包。主入口不引编辑器,阅读页就不会带上 CodeMirror;不装 mermaid,产物里也没有图表代码。
dist5
index.js
components/index.js
editor/index.js
mermaid/index.js
styles.css
.解析、渲染、序列化、格式化阅读页./editorMarkdownEditor,含 CodeMirror 与滚动同步后台写作./components组件映射表,做单组件覆盖时取自定义./mermaid交互式图表:缩放、源码切换、导出需要图表./styles.css打包好的原生 CSS,引入一次就够必选和 MDX 的差别
MDX 把内容编译成组件树,作者得会 JSX,内容存回去要经过一次格式化。这里把容器当普通节点处理,内容从头到尾都是文本。
MDXpage.tsx
import { Callout } from "@/ui";
export default function Page() {
return (
<Callout type="tip" title="提示">
内容写成了组件树,保存时要过一遍编译。
</Callout>
);
}这里article.md
<Callout type="tip" title="提示">
内容还是文本,存进数据库就是这段字符。
</Callout>代价也说清楚:没有表达式、没有自定义逻辑,属性只认字符串。需要动态内容时,在 React 层覆盖组件,而不是在正文里写代码。
装上试试
npm i @heikeson/md-engine三行代码能看到效果,写在快速开始里;想先改一段看看,直接用Playground。