highlight.js流式
时间: 2025-05-08 14:15:14 浏览: 32
### 如何使用 Highlight.js 实现流式语法高亮
为了实现流式语法高亮,可以结合 `highlight.js` 和 Vue 3 的响应式特性以及异步数据流处理技术。以下是详细的解决方案:
#### 使用 Vue 3 响应式机制和 Highlight.js 进行流式高亮
Vue 3 提供了强大的响应式功能,可以通过 `ref` 或者 `reactive` 来动态更新 DOM 内容[^1]。当接收到流式 Markdown 数据时,可以逐步将其解析为 HTML 并应用语法高亮。
以下是一个完整的代码示例,展示如何通过 `fetch` 接收流式数据,并利用 `marked.js` 转换 Markdown 到 HTML,再由 `highlight.js` 高亮代码块[^2][^3]:
```javascript
// 引入必要的依赖包
import { ref, onMounted } from 'vue';
import Marked from 'marked';
import hljs from 'highlight.js';
import 'highlight.js/styles/github.css';
// 初始化 marked.js 并集成 highlight.js
Marked.use({
highlight: (code, lang) => {
if (lang && hljs.getLanguage(lang)) {
return hljs.highlight(code, { language: lang }).value;
}
return code; // 如果未指定语言,则返回原始代码
},
});
export default {
setup() {
const content = ref(''); // 存储最终渲染的内容
const loading = ref(true); // 加载状态标志
async function fetchStreamData(url) {
try {
const response = await fetch(url);
if (!response.body) throw new Error('No streaming body available');
const reader = response.body.getReader();
let decoder = new TextDecoder('utf-8');
while (true) {
const { done, value } = await reader.read(); // 流式读取数据
if (done) break;
const chunk = decoder.decode(value, { stream: true }); // 解码 Unicode 字符串
content.value += Marked.parse(chunk); // 动态追加并解析 Markdown
}
loading.value = false; // 结束加载
} catch (error) {
console.error('Error fetching data:', error.message);
}
}
onMounted(() => {
fetchStreamData('/api/stream-markdown-data'); // 替换为目标 API 地址
});
return { content, loading };
},
};
```
#### 关键点说明
1. **Markdown 渲染与语法高亮**
上述代码中,`Marked` 被配置为自动调用 `highlight.js` 对代码块进行高亮处理。每当有新的 Markdown 片段到达时,都会被即时转换成带有高亮样式的 HTML。
2. **流式数据接收与解码**
使用浏览器内置的 `TextDecoder` 将二进制流逐片解码为 UTF-8 编码的字符串。这一步确保即使数据是以片段形式传输的,也能正确拼接和显示。
3. **Vue 3 响应式更新**
每次接收到新数据后,立即更新 `content` 变量,触发视图重新渲染。由于 Vue 3 的高效性,这种频繁更新不会显著影响性能。
4. **样式支持**
确保已导入合适的 `highlight.js` 主题 CSS 文件(如上述代码中的 GitHub 风格),以便正确呈现高亮效果。
---
###
阅读全文
相关推荐
















