Prism.js代码高亮失效的主因是highlightAll()未在DOM就绪后调用,需确保pre>code结构、language-前缀正确、语言模块已加载,并依框架生命周期手动触发解析。

Prism.js 能让 <code> 标签真正“活”起来——但直接套用 <code class="js"> 不一定高亮,常见原因是加载顺序、语言模块缺失或 DOM 渲染时机不对。
为什么 <code> 写对了却没高亮?
核心问题不是标签写错,而是 Prism 没在 DOM 就绪后执行解析。尤其当代码块是动态插入(比如 Markdown 渲染后、dangerouslySetInnerHTML 注入、Vue/React 组件更新后),Prism.highlightAll() 必须手动触发,且不能早于目标元素挂载。
常见错误现象:
- 页面刷新后高亮正常,但路由跳转后失效
<pre class="brush:php;toolbar:false;"><code class="python"></code> 显示原样文本,无颜色</li><li>控制台报错 <code>Uncaught TypeError: Prism.highlightAll is not a function</code>(通常因只引入了 <code>prism-core.min.js</code>,没加载完整版)</li></ul><H3><code>Prism.highlightAll()</code> 的调用时机怎么选?</H3><p>它必须在目标 <code><code></code> 元素已存在于 DOM 中时运行。静态 HTML 可放 <code><body></code> 底部;动态场景需配合框架生命周期:</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill11499" title="cn-json-diff"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20cf0281539.jpg" alt="cn-json-diff" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill11499" title="cn-json-diff">cn-json-diff</a> <p>比较两个 JSON 文件并显示差异。支持嵌套结构、数组及值变更。纯 Python 标准库实现,无需 API 密钥。</p> </div> <a href="/xiazai/skill11499" title="cn-json-diff" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><ul><li>原生 JS:用 <code>DOMContentLoaded</code> 或 <code>setTimeout(..., 0)</code> 确保 DOM 解析完成</li><li>Vue 3(Composition API):<code>onMounted</code> + <code>onUpdated</code> 都要调用,否则编辑器内容更新后不重绘</li><li>React(如 Gatsby):在组件 <code>useEffect</code> 中调用,且确保 <code>dangerouslySetInnerHTML</code> 已渲染完毕</li><li>Vite + <code>vite-plugin-prismjs</code>:插件会自动注入,但若手动添加代码块仍需显式调用</li></ul><H3>语言类名写法和常见陷阱</H3><p><code>class</code> 值决定 Prism 加载哪个语法解析器,必须严格匹配官方支持的标识符,大小写敏感、不可缩写:</p><ul><li>✅ 正确:<code>language-javascript</code>、<code>language-typescript</code>、<code>language-html</code>、<code>language-css</code>、<code>language-python</code></li><li>❌ 错误:<code>lang-js</code>、<code>javascript</code>(缺 <code>language-</code> 前缀)、<code>lang-python</code>、<code>py</code></li><li>⚠️ 注意:HTML 中写成 <code>class="html"</code>,不是 <code>class="html"</code>;否则 Prism 认为是通用代码块,不启用 HTML 语法解析</li></ul><p>如果用了 <code>language-xxx</code> 但对应语言模块未加载(比如只引入了基础版 <code>prism.js</code>,没单独引入 <code>prism-python.min.js</code>),该代码块将保持纯文本状态,无报错提示。</p><H3>CDN 引入时最简可用组合</H3><p>避免本地构建复杂度,用 CDN 是最快验证方式。但注意:官方 CDN 默认不包含所有语言,需按需拼接路径:</p><pre class='brush:php;toolbar:false;'><!-- 基础样式(必选)--> <link href="https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism.css" rel="stylesheet"> <p><!-- 核心解析器 + 常用语言(推荐初试)--> <script src="<a href="https://www.php.cn/link/ddb7775a4804e74eb1c80b5a36f3ffcb">https://cdn.jsdelivr.net/npm/prismjs@1.29.0/components/prism-core.min.js"></script&gt</a>; <script src="<a href="https://www.php.cn/link/127c091ffa59fab0d49ec3d91c6017c4">https://cdn.jsdelivr.net/npm/prismjs@1.29.0/plugins/autoloader/prism-autoloader.min.js"></script&gt</a>;</pre><p><code>prism-autoloader.min.js会根据class自动加载对应语言文件(如看到language-python就拉取 Python 插件),省去手动引入一堆.min.js的麻烦。但首次加载略慢,且依赖网络——生产环境建议预编译打包。最容易被忽略的一点:Prism 不处理
<code>单独出现的情况,必须包裹在<pre class="brush:php;toolbar:false;"></pre>内;<pre class="brush:php;toolbar:false;"><code></code> 是硬性结构约定,漏掉 <code><pre class="brush:php;toolbar:false;"></pre>或嵌套错位(比如<code><pre class="brush:php;toolbar:false;"></pre>)都会导致失效。


















