Chatbot 为什么能够显示彩色代码?—— Highlight.js(代码高亮)学习总结
Chatbot 为什么能够显示彩色代码?—— Highlight.js(代码高亮)学习总结
前言
上一篇文章中,我学习了 Markdown Rendering(Markdown 渲染)。
现在,AI 返回的 Markdown 已经能够正确转换成 HTML,并显示标题、列表、引用等格式。但是,当 AI 返回代码时,我又发现了一个新的问题。
例如:
```python
def hello():
print("Hello")
```
虽然已经变成了代码块,但页面显示出来却是:
def hello():
print("Hello")
整个代码都是黑色,没有任何颜色区分。
而 ChatGPT、Claude、DeepSeek 等 AI 产品中的代码却会自动变成彩色,并且不同关键字拥有不同颜色,阅读体验非常好。
于是,我开始学习 Highlight.js(代码高亮),理解 AI 聊天机器人是如何实现代码高亮的。
一、为什么需要 Highlight.js?
如果只有 Markdown Rendering。
AI 返回:
```python
def hello():
print("Hello")
```
经过 marked.js 转换以后:
<pre><code class="language-python">
def hello():
print("Hello")
</code></pre>
浏览器最终显示:
def hello():
print("Hello")
虽然已经是代码块。
但是:
- 没有关键字颜色;
- 没有字符串颜色;
- 没有函数颜色;
- 阅读体验一般。
因此,我们需要:
Highlight.js 来为代码添加语法高亮。
二、什么是 Highlight.js?
Highlight.js 是一个:
JavaScript 代码语法高亮库(Syntax Highlighting Library)。
它能够识别:
- Python
- JavaScript
- Java
- C++
- Go
- Rust
等 190 多种编程语言。
它的作用就是:
HTML 代码块
│
▼
Highlight.js
│
▼
识别语言
│
▼
添加颜色样式
│
▼
浏览器显示彩色代码
因此 Highlight.js 本身并不会生成代码。
它只是负责:
给代码添加颜色。
三、Highlight.js 的工作流程
整个流程如下:
AI 返回 Markdown
│
▼
marked.js
│
▼
HTML
│
▼
Highlight.js
│
▼
添加高亮样式
│
▼
浏览器显示彩色代码
可以看到 Markdown Rendering 负责:
Markdown
↓
HTML
Highlight.js 负责:
HTML
↓
彩色代码
二者共同完成代码显示。
四、Highlight.js 是如何工作的?
Markdown 转换以后 代码块会变成:
<pre>
<code class="language-python">
print("Hello")
</code>
</pre>
其中:
class="language-python"
告诉 Highlight.js:
这是一段 Python 代码。
随后 Highlight.js 会读取:
<code>
里面的内容。
识别:
def
print
"Hello"
哪些属于:
- 关键字
- 函数
- 字符串
- 数字
- 注释
然后自动添加不同的 CSS class。
最终浏览器再根据 CSS,把代码显示成不同颜色。
五、Highlight.js 在 KK Chat 中的应用
在 KK Chat 中,整个流程如下:
用户发送消息
│
▼
FastAPI
│
▼
DeepSeek
│
▼
返回 Markdown
│
▼
marked.parse()
│
▼
HTML
│
▼
highlight.js
│
▼
代码高亮
│
▼
Message Rendering
│
▼
浏览器显示
因此:
- REST API:负责通信;
- Markdown Rendering:负责格式转换;
- Highlight.js:负责代码高亮;
- Message Rendering:负责最终显示。
四者共同组成了完整的聊天显示流程。
六、如何使用 Highlight.js?
通常只需要:
hljs.highlightAll();
它会自动扫描页面中所有:
<pre><code>
代码块。
然后:
读取代码
↓
识别语言
↓
添加颜色
↓
刷新页面
如果只需要高亮某一个代码块。
也可以:
hljs.highlightElement(codeElement);
这样可以提高性能。
七、今天遇到的问题
① Markdown 已经转换成功,但代码没有颜色
原因:
只进行了 Markdown Rendering。
没有调用:
hljs.highlightAll();
因此代码仍然只是普通 HTML。
② 代码块语言识别错误
例如:
class="language-js"
写错。
Highlight.js 就无法正确识别。
因此Markdown 生成代码块时,
需要正确设置:
language-python
language-javascript
language-cpp
等等。
③ Streaming 时新增代码没有高亮
Streaming 会不断更新 DOM。
新的代码块不会自动高亮。
因此每次更新代码以后,需要重新调用:
hljs.highlightElement()
这样新增代码才能重新着色。
八、今天的收获
今天最大的收获,是理解了:
代码高亮并不是浏览器自带的功能,而是 Highlight.js 在 HTML 基础上再次进行处理。
整个流程可以总结为:
AI
↓
Markdown
↓
marked.js
↓
HTML
↓
highlight.js
↓
彩色代码
↓
浏览器页面
今天也进一步理解了:
- Markdown Rendering 负责格式转换;
- Highlight.js 负责代码高亮;
- Message Rendering 负责页面显示。
三者共同构成了现代 AI ChatBot 的前端展示能力。
总结
Highlight.js 的核心作用就是:
识别 HTML 中的代码块,并根据编程语言自动添加语法高亮。
虽然它只是前端中的一个小模块,却极大提升了代码的可读性,也是 ChatGPT、Claude、DeepSeek 等 AI 产品中不可缺少的一部分。
通过今天的学习,我不仅掌握了 Highlight.js 的工作原理,也进一步完善了 KK Chat 的代码显示效果,使整个聊天体验更加接近真正的 AI 产品。
今天学到了什么?
- Highlight.js(代码高亮)
- Syntax Highlight(语法高亮)
hljs.highlightAll()hljs.highlightElement()language-python等语言标识- Highlight.js 与 Markdown Rendering 的关系
- Highlight.js 在 KK Chat 中的完整工作流程
- Streaming 与代码高亮之间的配合
KJ
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)