0️⃣ 开场三行诗
css
AI 生成内容(Ai Generated Content)
+
Web 端 Markdown 渲染器
=
猫薄荷 + 激光笔 🐱🏍
1️⃣ 故事背景:当 AI 遇见 Markdown
想象一只名叫 Gena 的 AI,它每天都在云端胡言乱语:
"量子纠缠的猫在 0.618 的黄金分割里打哈欠......"
我们需要把这段胡话:
- 用 纯文本 Markdown 存起来(轻量、可版本控制)。
- 用 浏览器 JS 把它实时渲染成漂亮的 HTML(0 后端压力)。
- 最好再加点 代码高亮、Mermaid、emoji------让老板在演示时发出"WOW"的声音。
2️⃣ 技术栈一览表
角色 | 库 / 语法 | 图标 | 一句话人设 |
---|---|---|---|
Markdown 解析器 | marked.js | 🦊 | 把 **粗体** 变成 <strong> |
代码高亮 | highlight.js | 🌈 | 让 const 闪出霓虹灯 |
流程图 / 时序图 | mermaid | 🧜♀️ | AI 画的心电图 |
Emoji 转换 | node-emoji | 😎 | :rocket: → 🚀 |
数学* | 用 ASCII 艺术 | 🖼️ | "根号二"写成 √2 ,拒绝 LaTeX |
*本文遵守「不用公式表达式」的宇宙和平条约。
3️⃣ 30 秒跑通 Demo
3.1 目录结构
css
aigc-web-md/
├─ index.html ← 1 KB 的魔法入口
├─ main.js ← 渲染器本体
├─ styles.css ← 让老板 WOW
└─ content.md ← AI 吐出的原始 Markdown
3.2 index.html
html
<!doctype html>
<html lang="zh">
<head>
<meta charset="UTF-8"/>
<title>AiGC Web Markdown</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css"/>
<link rel="stylesheet" href="styles.css"/>
</head>
<body>
<article id="app">Loading...</article>
<!-- 脚本们 -->
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
<script type="module" src="main.js"></script>
</body>
</html>
3.3 main.js
js
import { emojify } from 'https://cdn.skypack.dev/node-emoji@2';
// 1️⃣ 让 marked 支持代码高亮
marked.setOptions({
highlight: (code, lang) => {
const validLang = hljs.getLanguage(lang) ? lang : 'plaintext';
return hljs.highlight(code, { language: validLang }).value;
},
breaks: true, // 让 \n 真的能换行
});
// 2️⃣ 初始化 Mermaid
mermaid.initialize({ startOnLoad: false, theme: 'dark' });
// 3️⃣ 读取 AI 生成的 Markdown
async function loadMD() {
const raw = await fetch('./content.md').then(r => r.text());
const html = marked.parse(emojify(raw)); // emoji → 🎉
document.getElementById('app').innerHTML = html;
// 4️⃣ 渲染 Mermaid 图
document.querySelectorAll('.mermaid').forEach(node => {
mermaid.run({ nodes: [node] });
});
}
loadMD();
3.4 styles.css(只放亮点)
css
body {
background: linear-gradient(135deg, #1e1e2e 0%, #302b63 100%);
color: #f8f8f2;
font-family: 'Fira Code', monospace;
line-height: 1.7;
}
pre {
border-radius: 8px;
overflow-x: auto;
background: #282a36;
}
code {
color: #50fa7b;
}
4️⃣ content.md ------ AI 的即兴表演
你可以把任何 AiGC 输出贴进来,下面是一份示范:
markdown
# 🧠 今日 AI 胡说八道
## 1. 量子猫的状态机
```mermaid
stateDiagram-v2
[*] --> 睡觉 😴
睡觉 --> 打哈欠: 观测
打哈欠 --> 睡觉: 未观测
2. 代码时间
js
// AI 写的快速排序(别问,问就是玄学)
const quickSort = arr =>
arr.length < 2
? arr
: [
...quickSort(arr.slice(1).filter(x => x < arr[0])),
arr[0],
...quickSort(arr.slice(1).filter(x => x >= arr[0]))
];
3. ASCII 艺术数学
lua
1
-----
1 + x
当 x 趋近于 0 时,上式 ≈ 1 - x + x² - x³ ...(泰勒展开跑圈圈)
4. 致谢
Thanks AI, you rock :rocket:.
yaml
---
## 5️⃣ 浏览器里的化学反应
1. **加载** `content.md`
2. **marked.js** 把 `#` 变成 `<h1>`,把 ```js 变成高亮 `<pre><code>`
3. **mermaid** 把 `stateDiagram` 画成 SVG
4. **node-emoji** 把 `:rocket:` 变成 🚀
5. **highlight.js** 让关键字闪绿光
最终效果(截图 or 想象):

---
## 6️⃣ 性能小贴士(写给未来的你)
| 问题场景 | 锦囊妙计 |
|---|---|
| 大文件卡顿 | 用 `requestIdleCallback` 分段渲染 |
| Mermaid 阻塞 | 给 `<div class="mermaid">` 加 `loading="lazy"` |
| XSS 风险 | 开启 marked 的 `sanitize: true`(或转 DOMPurify) |
| SEO 需求 | 服务端渲染 → 用 `marked.parse` 在 Next.js 的 `getStaticProps` |
---
## 7️⃣ 彩蛋:让 AI 自己更新 Markdown
把 `content.md` 换成一个 **WebSocket 流**,AI 每吐一行,你就实时 `insertAdjacentHTML`。
观众惊呼:"这网站是活物!"------ 而你只是加了三行 JS:
```js
socket.onmessage = ({ data }) => {
document.getElementById('app').insertAdjacentHTML('beforeend', marked.parseInline(data));
};
8️⃣ 结尾诗
AI 写诗,
JS 排版,
人类点赞,
宇宙晚安。
现在,去把你的
content.md
换成真正的 AiGC 输出,然后刷新浏览器 ------ 让像素跳舞吧!