乘风破浪 激流勇进
你好!欢迎来看Tuziki's Planet !
在vue3+vite项目中使用代码高亮插件Prism
 作者:tutuhuang 日期:2024-01-08 
Prism官网https://prismjs.com/
安装
//安装prismjs 插件
npm install prismjs -S
//安装prismjs的编译器插件
npm install babel-plugin-prismjs -D
npm install vite-plugin-prismjs -D
配置vite.config.ts
import { prismjsPlugin } from 'vite-plugin-prismjs';
export default defineConfig({
	plugins: [
    	vue(),
    	prismjsPlugin({
      		languages: 'all',
      		plugins: ['line-numbers', 'copy-to-clipboard'], //官网有其他功能,这里开启行数和复制按钮功能
      		theme: 'okaidia',
      		css: true,
    	}),
  ],
})
组件页面中调用:
import Prism from "prismjs"; 
import "prismjs/themes/prism-tomorrow.min.css"; //高亮主题,可以选择性加载
// 接口数据请求回来之后设置
 nextTick(() => {
    Prism.highlightAll();
 });
  //或者
  onMounted(() => {
   Prism.highlightAll();
  });
代码示例:
<pre>
  <code class="language-js line-numbers">
      watch(
        () => menuStore.menu,
          async (newMenu) => {
         if (newMenu.length > 0) {
          await fetchData();
          }
          },
         { immediate: true }
       );
   </code>
</pre>
特别需要注意这里的文本内容是又接口返回的情况,如果富文本编辑器不会给代码加上 <code></code>标签包裹,则Prism不会生效
可以在编辑录入的时候,提交富文本之前对数据做处理,给所有的<pre>标签内置一个<code>
// 富文本处理方法
processRichText(htmlString) {
  const parser = new DOMParser();
  const doc = parser.parseFromString(htmlString, "text/html");
  const preTags = doc.querySelectorAll("pre");
  preTags.forEach((pre) => {
     // 检查pre标签下是否已经有code标签
     if (!pre.querySelector("code")) {
       const code = document.createElement("code");
       code.className = "language-js line-numbers";
       code.innerHTML = pre.innerHTML;
       pre.innerHTML = "";
       pre.appendChild(code);
      }
  });
  return doc.body.innerHTML;
}
this.data = this.processRichText(this.richText)
 返回列表 
返回顶部←